CAN通信总结
基本介绍
1. CAN通过两条通信线(双绞线)产生的电压差传输数据,一个CAN网络里的所有节点都挂在这两条通信线上,使用差分信号半双工通信。
2. CAN总线是广播类型的总线。所有节点都将始终接收所有通信,无法向一个特定的节点发送报文,但是,CAN 硬件能够提供本地过滤能力,从而每个节点可以只对感兴趣的报文做出响应。
物理层
网络拓扑
CAN物理层的形式主要分为闭环总线及开环总线网络两种,一个适合于高速通讯,一个适合于远距离通讯。它的网络由很多CAN节点构成,每个节点均由一个MCU(微控制器)、一个CAN控制器和一个CAN收发器构成,然后使用双绞线连接到CAN网络中。
闭环
CAN闭环通讯网络是一种遵循ISO11898标准的高速、短距离网络,它的总线最大长度为40m,通信速度通信速率为 125 kbps ~1Mbps。在该闭环网络中,CAN总线的起止端都有一个120Ω的终端电阻,用来做阻抗匹配,以减少回波反射。其网络拓扑结构如图所示:
开环
CAN开环总线网络是遵循ISO11519-2标准的低速、远距离网络,它的最大传输距离为1km,通信速率为 10k~125 kbps 。两根总线是独立的、不形成闭环,要求每根总线上各串联有一个2.2kΩ的电阻。其网络拓扑结构如图所示:
电平规范
CAN 控制器是根据CAN_L和CAN_H上的电位差(即差分信号的形式)来判断总线电平。总线总线电平分为显性电平(对应逻辑0,电位差为2V左右)和隐性电平(对应逻辑1,电位差为0V),二者必居其一。发送方通过使总线电平发生跳变,将消息发送给接收方。对于高速CAN,总结一下,也就是:
- CAN_H-CAN_L < 0.5V 时候为隐性的,逻辑信号表现为"逻辑1"- 高电平。
- CAN_H-CAN_L > 0.9V 时候为显性的,逻辑信号表现为"逻辑0"- 低电平。
协议层
帧类型
帧类型 | 帧用途 |
---|---|
数据帧 | 用于发送单元向接受单元传送数据 |
遥控帧 | 用于向具有相同ID的发送单元请求数据 |
错误帧 | 当检测出错误时向其他单元通知错误 |
过载帧 | 用于接收单元通知其他单元尚未做好接收准备 |
间隔帧 | 将数据帧及遥控帧与其他帧分离 |
数据帧
数据帧有标准格式和扩展格式,这2种格式都具有相同的帧结构。总结构如下图所示:
各字段含义及长度分别为:
- 起始段,长度固定为 1 bit,逻辑 0
- 仲裁字段(ID),这里ID非地址,而是当两个或多个节点竞争总线时,确定报文的优先级。
- 对于 CAN 2.0A,一个 11 位的标识符和一个支配数据帧的 RTR 位
- 对于 CAN 2.0B,一个 29 位(11+18)的标识符,两个隐性位:SRR 和 IDE和 RTR位。
- 控制段,前 2 bit 规定为 0,后 4 bit 为数据段的 Byte 长度
- 数据段,长度可变,0~8 Byte
- CRC段,包含15位CRC值和1位CRC界定符
- ACK段,任何能够正确接收报文的CAN控制器都会在每条报文的末尾发送一个应答位。发送送节点检查应答位是否存在,如果没有检测到应答位,会重新发送报文。
- 帧结束,由7个隐形位(高电平)组成。
对于软件工程师来说可以不关注,比较重要的是理解仲裁段、控制段和数据段的含义,其他部分都由CAN底层固件自动封装。
Tips
- 总线上存在应答位(ACK)不表示任何目标地址已经收到报文。唯一可知的是,总线
上的一个或多个节点已经正确收到了它。 - 帧格式和帧ID相同的情况下,数据帧优先于远程帧(RTR)。
- 对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高(RTR、SRR)。
- 任何 CAN 控制器都可在检测到空闲总线时开始传送数据。这可能会导致两个或多个控制器(几乎)同时开始传送报文。冲突的解决方式如下。传送节点在发送报文时监视总线,如果节点在自身发送隐性位时检测到显性位,它将立即退出仲裁过程并转变成接收方。仲裁在整个仲裁域进行,当该字段已经被发送时,总线上恰好只剩下一个传送节点。这个节点就像什么都没发生那样继续传送。其它潜在的传送节点将在总线下次空闲时尝试重传它们的报文,仲裁过程不会有时间损耗。
- CAN报文被称为“内容寻址”。常规的报文地址类似于“这是发给节点 X 的报文”。而内容寻址的报文类似于“这是包含标签为 X 的数据的报文”。这两个概念之间的区别很小但是非常重要。
- 标识符不能将 7 个最高有效位设置为全部,所以 11 位标识符的标识符只有 0 到 2031,而 29 位标识符可以使用 532676608 个不同的值。
遥控帧
**用途:**远程帧在实践中很少使用,可用于各单元的定期连接确认/应答。例如,如果节点 A 发送仲裁字段设置为 234 的远程帧,那么节点 B,如果已经正确初始化,则可以使用仲裁字段也设置为 234 的数据帧进行响应。
遥控帧与数据帧十分相似,但是有两个重要的区别:
- 它被显式标记为远程帧(仲裁字段中的 RTR 位为隐性)
- 没有数据字段,数据长度码(DLC)以所请求数据帧的数据长度码表示
错误帧
它在一个节点检测到故障时被传送,并将导致所有其它节点也检测到故障,所以它们也将发送错误帧。然后传送节点将自动尝试重传报文。有一种精准的错误计数器方案,可以确保节点无法通过重复传输错误帧来破坏总线通信。错误帧包含错误标志,它是 6 位长的相同值(因此违反位填充规则)和错误定界符(8 个隐性位)。错误定界符提供一些空间,以便总线上其它节点在检测到第一个错误标志时可以发送它们的错误标志。
主要包含5种类型:
- CRC错误:发送节点计算的CRC与接受节点计算的CRC不同
- 应答错误:发送节点在ACK阶段未收到应答信号
- 位发送错误:发送节点发现正发送电平与总线电平不一致
- 格式错误:传输的帧格式与任何一种合法帧格式不同
- 位填充错误:传输信号违反位填充规则
过载帧
过载帧是用于接收单元通知发送单元它尚未完成接收准备的帧。过载帧与主动错误帧非常相似,甚至可以把过载帧直接理解成也是一种错误帧,只是它的错误触发条件不同。
在两种情况下,节点会发送过载帧:
- 接收单元要求发送节点延缓下一个数据帧或远程帧的传输;
- 帧间隔(Intermission)的 3 bit 内检测到显性位
帧间隔
帧间隔是用于分隔数据帧、遥控帧这些有效数据的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、 遥控帧、错误帧、过载帧)分开。
Tips
过载帧和错误帧由于要按照发送条件立即执行,前不能插入帧间隔
应用
常用CAN控制器、收发器:
PC端调试助手:
CANTEST下载地址:https://www.zlg.cn/can/down/down/id/22.html
参考链接
-
https://zhuanlan.zhihu.com/p/538834760
-
https://blog.csdn.net/weixin_53762042/article/details/117289970
-
https://blog.csdn.net/qq_36823004/article/details/124788497