BMS应用软件开发 — 11 CAN通讯
目录
1 CAN通讯
2 什么是差分信号
3 CAN帧结构
1 CAN通讯
CAN总线,全称为Controller Area Network,即控制器局域网,CAN 总线具有的高可靠性和良好的错误检测能力。CAN总线特点:
- 多主方式:可以多主方式工作,网络上任意一个节点均可以在任意时刻主动地向网络上的其他节点发送信息,而不分主从,通信方式灵活。
- 速度快,距离远:CAN总线支持较高的数据传输速率,并且可以在较长的距离上稳定传输数据,这得益于其高效的通信协议和抗干扰能力。
- 具有错误检测和恢复功能:CAN总线使用循环冗余校验(CRC)等机制来检测数据在传输过程中是否出现错误。当检测到错误时,节点会发送错误帧,以通知网络上的其他节点。在检测到错误后,系统可以采取相应的措施,如重传数据,以确保数据的正确传输。
- 连接节点多:CAN总线理论上可以支持多达110个节点,这使得它非常适合大规模的网络通信。
闭环和开环总线网络:CAN总线物理层的网络形式主要有闭环总线网络和开环总线网络。
闭环总线网络是一种高速、短距离的网络,这种网络的最大特点是通信速率较高,可以达到125kbit/s到1Mbit/s。在1Mbit/s的通信速率下,总线长度最长可达40米。闭环网络的两端各需要一个120欧姆的电阻,以形成回路并提高抗干扰能力。
开环总线网络是一种低速、远距离的网络,这种网络的最大传输距离可达1km,最高通信速率为125kbit/s。与闭环网络不同,开环网络的两根信号线是独立的,不形成闭环,并且每根总线上各串联有一个2.2千欧的电阻。
从CAN通讯网络图可了解到, CAN 总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。CAN总线硬件电路一般包括:
- 微控制器(如51单片机):负责处理数据和控制通信。
- CAN控制器(如SJA1000):负责CAN协议的实现和数据帧的生成。
- CAN收发器(如PCA82C250):将CAN控制器的数字信号转换为适合在CAN总线上传输的电信号。
一些现代微控制器,如STM32系列,已经将CAN控制器集成到芯片内部,因此只需要外加一个CAN收发器,如SN65HVD230,来完成信号的转换。
CAN总线和I2C区别:CAN总线和I2C总线都是用于设备间通信的串行通信总线协议,但两者有以下不同点:
- 用途不同:CAN总线通常用于工业控制、汽车网络等高可靠性应用,而I2C通常用于低速控制和数据传输。
- 速率不同:CAN总线速率可以高达1 Mbps,而I2C总线通常在400 Kbps以下。
- 地址机制不同:CAN总线使用11位或29位标准帧标识符来识别设备,而I2C总线使用7位或10位设备地址来寻址。
- 工作方式不同:CAN总线是多主机环境下的异步通信协议,而I2C总线通常在单主机环境下的同步通信协议。
2 什么是差分信号
CAN总线采用差分信号方式传输数据,通过两根信号线CAN_H(CAN High)和CAN_L(CAN Low)的电压差值来表示数据的逻辑状态(逻辑0和逻辑1)。差分信号的一个主要优点是它对外部电磁干扰具有较好的抗干扰能力。
信号的电位差分为显性电平(Dominant Voltage)和隐性电平(Recessive Voltage),其中显性电平代表逻辑0,隐性电平代表逻辑1。见表CAN 协议标准表示的信号逻辑。
以高速 CAN 协议为例,当表示逻辑 1 时 (隐性电平),CAN_High 和 CAN_Low 线上的电压均为 2.5v,即它们的电压差 VH-VL=0V;而表示逻辑 0 时 (显性电平), CAN_High 的电平为 3.5V, CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-VL=2V。
3 CAN帧结构
CAN帧的种类:CAN协议定义了几种不同类型的数据帧,其中错误帧、过载帧、帧间隔都是由硬件完成的,没有办法用软件来控制。对于一般使用者来说,只需要掌握数据帧与遥控帧。
类型 | 描述 |
数据帧 | 用于发送单元向接收单元传送数据的帧。 |
遥控帧 | 用于接收单元向具有相同 ID 的发送单元请求数据的帧。 |
错误帧 | 当CAN节点检测到错误时发送,用于通知网络上的其他节点存在错误。(硬件自动完成) |
过载帧 | 当CAN节点无法在当前的波特率下处理接收到的数据时发送。(硬件自动完成) |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来的帧。(硬件自动完成) |
数据帧:数据帧由7个段组成,分别为:帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束。
- 帧起始 :表示数据帧开始的段。
- 仲裁段:表示该帧优先级的段。
- 控制段:表示数据的字节数及保留位的段。
- 数据段:表示数据的内容的段,可发送 0~8 个字节的数据。
- CRC 段:检查帧的传输错误的段。
- ACK 段:表示确认正常接收的段。
- 帧结束:表示数据帧结束的段。
仲裁段分为标准格式(11位)以及扩展格式(29位)。
- ID位,标准格式的标识符长度的是11位,扩展格式的标识符长度的是29位,仲裁段中的ID号用于标识帧的唯一性并决定其在总线上的优先级。ID号越小,帧的优先级越高,
- RTR位,用于表明此帧是数据帧还是远程帧。
- IDE位,用于表明此帧是标准帧还是扩展帧。
- ID位,扩展格式的标识符长度加起来是29位;
- RTR位,用于表明此帧是数 据帧还是远程帧。
控制段紧跟在仲裁段之后,为CAN网络中的节点提供关于即将传输数据的重要信息。以下是控制段的详细说明:
- DLC(数据长度代码):控制段中的DLC字段是一个4位的字段,用于指示数据段中字节的数量。
- RTR(远程传输请求位):在数据帧中,RTR位是显性的(逻辑"0"),表示这是一个包含实际数据的帧。而在遥控帧中,RTR位是隐性的(逻辑"1"),表示这是一个请求数据的帧。
- IDE(标识符扩展位):仅在扩展格式的帧中存在,用于指示接下来的仲裁段是标准格式(11位ID)还是扩展格式(29位ID)。
数据帧的发送过程:
- 当总线空闲时,发送节点开始发送帧起始位。
- 接着发送仲裁段和控制段。
- 如果DLC不为零,则发送数据段。
- 然后发送CRC段,用于错误检测。
- 如果接收节点正确接收了帧,它会在ACK段将ACK槽置为显性,表示确认。
- 最后,发送节点发送帧结束位,完成数据帧的发送。
遥控帧:CAN总线的遥控帧,实际上是一种请求数据的帧。当一个节点需要从另一个节点请求数据时,它会发送一个遥控帧,这个帧只包含仲裁段和控制段,不包含数据段。
数据帧与遥控帧的区别:
- 数据帧和遥控帧在格式上非常相似,但遥控帧缺少数据段。
- 数据帧的RTR位为显性(0),表示传输的是数据;而遥控帧的RTR位为隐性(1),表示传输的是请求