写在前面:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
再续前缘:CAN总线(Controller Area Network bus)协议(一)
本篇为 CAN协议格式分析
CAN主要有 5 种帧类型:
- 数据帧:包含用于传输的节点数据的帧
- 遥控帧:请求传输特定标识符的帧
- 错误帧:由任何检测到错误的节点发送的帧
- 过载帧:用于接收单元通知其尚未完成接收准备的帧
- 帧间隔:用于分隔数据帧和遥控帧的帧
目录
一、数据帧
数据帧由 7 个段构成。
数据帧的构成如下图所示:
(1) 帧起始
表示数据帧开始的段。1 个位的显性位。
(2) 仲裁段
表示该帧优先级的段。
标准格式和扩展格式在此的构成有所不同。
1、在总线空闲态,最先开始发送消息的单元获得发送权
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。
仲裁的过程如下图所示:
2、标准格式和扩展格式的优先级比较
标准格式 ID 与具有相同 ID 的扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。
(3) 控制段
表示数据的字节数及保留位的段。
控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同。
(4) 数据段
数据的内容,可发送 0~8 个字节的数据。
从 MSB(最高位)开始输出。
(5) CRC 段
检查帧的传输错误的段。
由 15 个位的 CRC 顺序 *1 和 1 个位的 CRC 界定符(用于分隔的位)构成。
(6) ACK 段
表示确认正常接收的段。
由 ACK 槽 (ACK Slot) 和 ACK 界定符 2 个位构成。
(7) 帧结束
表示数据帧结束的段。
由 7 个位的隐性位构成。
二、遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
遥控帧的构成如下图所示:
遥控帧相比于数据帧除了缺少数据段之外,遥控帧的 RTR 位恒为隐性 1,数据帧的 RTR 位恒为显性 0。
(1) 帧起始
表示帧开始的段。
(2) 仲裁段
表示该帧优先级的段。可请求具有相同 ID 的数据帧。
(3) 控制段
表示数据的字节数及保留位的段。
(4) CRC 段
检查帧的传输错误的段。
(5) ACK 段
表示确认正常接收的段。
(6) 帧结束
表示遥控帧结束的段。
遥控帧和数据帧分析
- 数据帧和遥控帧的不同
- 遥控帧的 RTR 位为隐性位,没有数据段。
- 没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。
- 遥控帧没有数据段,数据长度码该如何表示?
- 遥控帧的数据长度码以所请求数据帧的数据长度码表示。
- 没有数据段的数据帧有何用途?
- 例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。
- 数据帧和遥控帧的优先级
- 具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。
- 数据帧和遥控帧的仲裁过程如下图所示:
在 ID 号前 11 位相同的情况下:
- RTR:保证在标准格式下,数据帧优先级高于遥控帧。
- SRR:保证标准数据帧的优先级高于扩展数据帧。
- IDE:保证标准遥控帧的优先级高于扩展遥控帧。
三、错误帧
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
错误帧的构成如下图所示:
(1) 错误标志
错误标志包括主动错误标志和被动错误标志两种。
- 主动错误标志:6 个位的显性位。
- 被动错误标志:6 个位的隐性位。
(2) 错误界定符
错误界定符由 8 个位的隐性位构成。
错误的三种状态
CAN总线上的节点单元始终处于 3 种状态之一。
当满足一定的条件时,节点可以从一种状态转换为另外一种状态。
(1) 主动错误状态
主动错误状态是可以正常参加总线通信的状态。
处于主动错误状态的单元检测出错误时,输出主动错误标志。
(2) 被动错误状态
被动错误状态是易引起错误的状态。
处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。
处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
处于被动错误状态的单元检测出错误时,输出被动错误标志。
另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。
(3) 总线关闭态
总线关闭态是不能参加总线上通信的状态。
信息的接收和发送均被禁止。
这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。
在 CAN 节点内,有两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。
发送错误计数值和接收错误计数值根据一定的条件发生变化。错误计数值的变动条件如下图所示:
一次数据的接收和发送可能同时满足多个条件。
错误计数器在错误标志的第一个位出现的时间点上开始计数。
错误状态和计数值的关系:
错误处理
1、位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
位填充的构成如下图所示:
(1) 发送单元的工作
在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则要插入 1 位与前 5 位反型的电平。
(2) 接收单元的工作
在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。
2、错误的种类
错误共有 5 种。多种错误可能同时发生。
- 位错误
- 填充错误
- CRC 错误
- 格式错误
- ACK 错误
错误的种类、错误的内容、错误检测帧和检测单元如下表所示:
- 位错误(Bit Error)
比较输出电平和总线电平(不含填充位),当两电平不一样时所检测到的错误。
- 填充错误(Stuff Error)
在需要位填充的段内,连续检测到 6 位相同的电平时所检测到的错误。
- CRC错误(CRC Error)
在发送消息时,发送节点会根据特定的多项式计算出由数据帧 SOF 位到数据域最末位的 Checksum 值,并将该值放在数据帧的 CRC 域,随着数据帧广播到总线上。接收节点在收到数据后,应用同样的多项式计算 Checksum 值,并与收到的 Checksum 值对比。如果两者一致,正常接收;如果不一致,则舍弃该消息,并发送错误帧请求发送节点重传消息。
- 格式错误(Form Error)
检测出与固定格式的位段相反的格式时所检测到的错误。
- 应答错误(ACK Error)
发送单元在 ACK 位中检测到隐性电平时所检测到的错误(ACK 没被传送过来时所检测到的错误)。
3、错误帧的输出
检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或遥控帧。
错误标志输出时序如下表所示:
四、过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载帧的构成如下图所示:
(1) 过载标志
6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
(2) 过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。
五、帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
帧间隔的构成如下图所示:
(1) 间隔
3 个位的隐性位。
(2) 总线空闲
隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
(3) 延迟传送(发送暂时停止)
8 个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
六、其他
参考: