文章目录
CAN协议分类
- CAN2.0:CAN2.0 的最高速率一般为 1Mbps 。
- CAN2.0A:只支持标准帧,即具有 11 位标识符。
- CAN2.0B:既支持标准帧,也支持扩展帧(29 位标识符),在应用的灵活性和可扩展性方面有一定提升。
- CAN FD(Flexible Data Rate):顾名思义,表示CAN-FD 的帧报文具有数据场波特率可变的特性,即 仲裁场和数据控制场使用标准的通信波特率,而到数据场就会切换为更高的通信波特率。CANFD 的最高速率通常可达 5Mbps 甚至更高,从而达到提高通信速率的目的。
CAN与CAN-FD主要区别
- 传输速率:CAN 的最高速率相对较低(通常为 1Mbps 左右),而CAN-FD速率可变,仲裁比特率最高1Mbps(与CAN相同),数据比特率最高5Mbps。
- 数据长度:CAN的一帧数据最长8字节,而CAN-FD的一帧数据最长64字节。
- 帧结构:CAN-FD 的帧结构进行了一些调整和优化,以适应新的速率和数据量需求。
帧类型分类
- 数据帧:用于发送单元向接收单元传送数据的帧,由帧起始、仲裁段、控制段、数据段、CRC 循环冗余校验段、应答段和帧结束7个不同段组成。
- 标准数据帧
- 扩展数据帧
- 遥控帧:用于请求发送特定 ID 的数据帧,与数据帧的最大差别在于遥控帧没有数据段。
- 标准遥控帧
- 扩展遥控帧
- 错误帧:用于在传输出错时通知其他节点。
- 超载帧:用于告知当前帧传输已超出 CAN 传输速率负载。
- 帧间隔:用来隔离数据帧或者遥控帧。
CAN和CANFD的数据帧格式
1、CAN的标准数据帧格式
- 帧起始
- SOF(Start Of Frame):帧起始由1个显性位构成,标志着报文的开始,并在总线上起着同步作用。
- 仲裁段
- 11-bit identifier:用于在 CAN 网络中标识不同的节点,标识符的值在一定程度上决定了消息的优先级,CAN ID数值越小优先级越高。
- RTR(Remote Transmission Request):即远程传输请求位,RTR 位用于区分报文是数据帧(RTR 位为显性状态)还是远程帧 (RTR 位为隐性状态)。
- 0:报文是数据帧
- 1:报文是远程帧
- 控制段
- IDE(Identifier Extension):即ID扩展位,IDE 位用于区分报文是标准帧(IDE 位为显性状态)还是扩展帧 (IDE 位为隐性状态)。
- 0:报文是标准帧
- 1:报文是扩展帧
- r0(或RB0):即保留位0,reserved bit0,总是用隐形电平填充
- DLC(Data Length Code):用来指定报文中包含的数据字节数(0 到8 字节)。
- IDE(Identifier Extension):即ID扩展位,IDE 位用于区分报文是标准帧(IDE 位为显性状态)还是扩展帧 (IDE 位为隐性状态)。
- 数据段
- 数据段:包含要发送的任何数据字节,数据段的数据长度由DLC 定义。
- CRC段
- 15-bit CRC:用来检测报文传输错误。CRC 校验的数据范围通常包括帧起始、仲裁段(包括标识符等)、控制段、数据段部分。
- DEL(Delimiter):通常被称为“CRC 界定符”(CRC Delimiter),主要作用是用于界定 CRC 序列的结束,起到分隔和标识的作用,以确保接收方能够准确识别和处理 CRC 信息。CRC 段中的 DEL(CRC 界定符)正常情况下应为隐性位(逻辑 1)
- ACK应答段
- ACK段中的第一个Bit为 1:发送节点发送数据后,在 ACK 段期望接收节点给出肯定应答(ACK)。当接收节点正确接收数据后,会在该位发送一个“0”来表示确认,而在没有接收节点正确接收并应答时,该位就保持默认的“1”。这样设计可以明确地区分是否有有效的应答信号,帮助确保通信的可靠性和准确性。
- DEL(Delimiter):在 ACK 段中的“DEL”(ACK Delimiter,应答定界符)主要起到分隔和标识 ACK 段结束的作用。ACK 段中的 DEL(ACK 界定符)正常情况下应为隐性位(逻辑 1)
- 帧结束
- EOF(Een Of Frame):它标志着一个数据帧的正式结束。EOF 由连续的 7 个隐性位组成。这 7 个隐性位形成了一个特定的信号模式,让接收方能够明确识别出当前帧已传输完毕。
2、CAN的扩展数据帧格式
除仲裁段和控制段外,其他段格式和标准帧相同。
2. 仲裁段
- 11-bit identifier:用于在 CAN 网络中标识不同的节点,标识符的值在一定程度上决定了消息的优先级,CAN ID数值越小优先级越高。
- SRR(Substitute Remote Request):即替代远程请求位,SRR 位只存在于扩展帧中,它替代了标准帧中的 RTR 位,且该位无实际意义,永远被置为 1。
- IDE(Identifier Extension):即ID扩展位,IDE 位用于区分报文是标准帧(IDE 位为显性状态)还是扩展帧 (IDE 位为隐性状态)。
- 0:报文是标准帧
- 1:报文是扩展帧
- 18-bit identifier:扩展ID
- RTR(Remote Transmission Request):即远程传输请求位,RTR 位用于区分报文是数据帧(RTR 位为显性状态)还是远程帧 (RTR 位为隐性状态)。
- 0:报文是数据帧
- 1:报文是远程帧
- 控制段
- r1(或RB1):即保留位1,reserved bit1,必须定义为显性
- r0(或RB0):即保留位0,reserved bit0,必须定义为显性
- DLC(Data Length Code):用来指定报文中包含的数据字节数(0 到8 字节)。
3、CAN FD的标准数据帧格式
CAN FD和CAN相比
- CAN报文中的RTR (用于区别标准帧与远程帧)被替换为RRS(远程请求替代位,默认值为0)
- 新增了RRS、FDF、BRS、ESI位
- 帧起始
- SOF(Start Of Frame):帧起始由1个显性位构成,标志着报文的开始,并在总线上起着同步作用。
- 仲裁段
- 11-bit identifier:用于在 CAN 网络中标识不同的节点,标识符的值在一定程度上决定了消息的优先级,CAN ID数值越小优先级越高。
- RRS(Remote Request Substitution):即远程请求替代位,当 RRS 位为 1 时,表示该帧替代了一个远程请求帧,即起到与远程帧类似的作用。
- 控制段
- IDE(Identifier Extension):即ID扩展位,IDE 位用于区分报文是标准帧(IDE 位为显性状态)还是扩展帧 (IDE 位为隐性状态)。
- 0:报文是标准帧
- 1:报文是扩展帧
- FDF(Flexible Data Rate Format):即灵活数据速率帧,区分报文是 CAN 报文还是 CAN-FD 报文
- 0:CAN-FD 报文
- 1:CAN 报文
- r0(或RB0):即保留位0,reserved bit0,总是用隐形电平填充
- BRS(Bit Rate Switch):表示位速率转换
- 0:数据段的位速率与仲裁段的位速率一致
- 1:速率可变(即 BRS 到 CRC段 使用转换速率传输)
- ESI(Error State Indicator):发送节点错误状态指示。CAN报文中发送节点的错误状态只有该节点自己知道,CANFD报文中可以通过ESI标志位来告诉其他节点该节点的错误状态。
- 0:主动错误
- 1:被动错误,正常无错误时也为隐性
- DLC(Data Length Code):用来指定报文中包含的数据字节数(0 到64 字节)。
- IDE(Identifier Extension):即ID扩展位,IDE 位用于区分报文是标准帧(IDE 位为显性状态)还是扩展帧 (IDE 位为隐性状态)。
- 数据段
- 数据段:包含要发送的任何数据字节,数据段的数据长度由DLC 定义。
CAN FD DLC是4位,表示帧中数据字节的数量。为了维持4位DLC,CAN FD使用从9到15的其余7个值来表示所使用的数据字节数(12、16、20、24、32、48、64)。
- 数据段:包含要发送的任何数据字节,数据段的数据长度由DLC 定义。
DLC(bin) | DLC(dec) | CAN | CAN FD |
---|---|---|---|
0000 | 0 | 0 | 0 |
0001 | 1 | 1 | 1 |
0010 | 2 | 2 | 2 |
0011 | 3 | 3 | 3 |
0100 | 4 | 4 | 4 |
0101 | 5 | 5 | 5 |
0110 | 6 | 6 | 6 |
0111 | 7 | 7 | 7 |
1000 | 8 | 8 | 8 |
1001 | 9 | 8 | 12 |
1010 | 10 | 8 | 16 |
1011 | 11 | 8 | 20 |
1100 | 12 | 8 | 24 |
1101 | 13 | 8 | 32 |
1110 | 14 | 8 | 48 |
1111 | 15 | 8 | 64 |
- CRC段
- 17/21-bit CRC:在 CANFD 中,CRC 的计算范围有所扩大,包含了更多的数据位。具体使用多少位的CRC 看需求
- DEL(Delimiter):通常被称为“CRC 界定符”(CRC Delimiter),主要作用是用于界定 CRC 序列的结束,起到分隔和标识的作用,以确保接收方能够准确识别和处理 CRC 信息。CRC 段中的 DEL(CRC 界定符)正常情况下应为隐性位(逻辑 1)
- ACK应答段
- ACK段中的第一个Bit为 1:发送节点发送数据后,在 ACK 段期望接收节点给出肯定应答(ACK)。当接收节点正确接收数据后,会在该位发送一个“0”来表示确认,而在没有接收节点正确接收并应答时,该位就保持默认的“1”。这样设计可以明确地区分是否有有效的应答信号,帮助确保通信的可靠性和准确性。
- DEL(Delimiter):在 ACK 段中的“DEL”(ACK Delimiter,应答定界符)主要起到分隔和标识 ACK 段结束的作用。ACK 段中的 DEL(ACK 界定符)正常情况下应为隐性位(逻辑 1)
- 帧结束
- EOF(Een Of Frame):它标志着一个数据帧的正式结束。EOF 由连续的 7 个隐性位组成。这 7 个隐性位形成了一个特定的信号模式,让接收方能够明确识别出当前帧已传输完毕。
4、CAN FD的扩展数据帧格式
除仲裁段和控制段外,其他段格式和标准帧相同。
2. 仲裁段
- 11-bit identifier:用于在 CAN 网络中标识不同的节点,标识符的值在一定程度上决定了消息的优先级,CAN ID数值越小优先级越高。
- SRR(Substitute Remote Request):即替代远程请求位,SRR 位只存在于扩展帧中,它替代了标准帧中的 RTR 位,且该位无实际意义,永远被置为 1。
- IDE(Identifier Extension):即ID扩展位,IDE 位用于区分报文是标准帧(IDE 位为显性状态)还是扩展帧 (IDE 位为隐性状态)。
- 0:报文是标准帧
- 1:报文是扩展帧
- 18-bit identifier:扩展ID
- RRS(Remote Request Substitution):即远程请求替代位,当 RRS 位为 1 时,表示该帧替代了一个远程请求帧,即起到与远程帧类似的作用。
- 控制段
- FDF(Flexible Data Rate Format):即灵活数据速率帧,区分报文是 CAN 报文还是 CAN-FD 报文
- 0:CAN-FD 报文
- 1:CAN 报文
- r0(或RB0):即保留位0,reserved bit0,总是用隐形电平填充
- BRS(Bit Rate Switch):表示位速率转换
- 0:数据段的位速率与仲裁段的位速率一致
- 1:速率可变(即 BRS 到 CRC 使用转换速率传输)
- ESI(Error State Indicator):发送节点错误状态指示。CAN报文中发送节点的错误状态只有该节点自己知道,CANFD报文中可以通过ESI标志位来告诉其他节点该节点的错误状态。
- 0:主动错误
- 1:被动错误正常无错误时也为隐性
- DLC(Data Length Code):用来指定报文中包含的数据字节数(0 到64 字节)。
- FDF(Flexible Data Rate Format):即灵活数据速率帧,区分报文是 CAN 报文还是 CAN-FD 报文
CAN的远程帧格式
即在CAN标准数据帧和扩展数据帧的中的 RTR 位 置位,并且远程帧没有数据字段。
CANFD舍弃了远程帧。
帧间隔
间隔段:间歇由 3 个隐性位构成。
在 CAN 总线中,帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开,过载帧和错误帧前不能插入帧间隔。
总线仲裁机制
总线仲裁是指在多个设备或节点共享一条CAN 总线时,当多个节点同时试图使用总线进行数据传输时,需要一种机制来决定哪个节点优先获得总线的使用权。
CAN通过仲裁段 帧ID 规定了数据帧的优先级。帧ID越小,优先级越高。
CAN控制器在发送数据的同时监测数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。
CAN 总线的仲裁机制中,采用的是“线与”逻辑。
在这种逻辑中,多个信号通过连接在同一导线上进行组合,只要其中有一个信号是低电平(通常用“0”表示),那么整个组合后的信号就是低电平,只有当所有信号都为高电平(通常用“1”表示)时,组合后的信号才为高电平。
为什么扩展帧中的SRR位要设置为隐性
在扩展格式中,SRR 位替代了标准格式中的 RTR 位。当节点发送扩展 CAN 帧时,将 SRR 位置为隐性,这样可以避免与正在发送标准 CAN 远程帧的节点产生冲突。因为标准 CAN 远程帧的 RTR 位为显性,如果扩展 CAN 帧的 SRR 位也为显性,就会导致总线仲裁错误。
扩展 CAN 帧中控制字段前两位为保留位,为什么必须定义为显性位
在扩展 CAN 帧中,控制字段前两位的显性位可以确保扩展帧在总线仲裁中具有较低的优先级,从而避免与标准帧发生冲突。
参考
- 一文搞懂CAN FD总线协议帧格式:https://www.xjx100.cn/news/780155.html?action=onClick
- 一文详解CAN数据帧格式:https://m.elecfans.com/article/1898536.html
- 图解CAN总线数据的组成和帧格式:https://zhuanlan.zhihu.com/p/369416576
- CANFD和CAN的区别和联系:https://blog.csdn.net/WE_BIG/article/details/130832481
- 一文搞懂CAN和CAN FD总线协议:https://blog.csdn.net/mengenqing/article/details/132583180