CAN
物理电平
- 以高速
CAN
为例- 有电压差(
2.5V
)为显性,逻辑0
- 无电压差为隐性,逻辑
1
- 有电压差(
帧结构
SOF
- 恒为显性,逻辑
0
- 恒为显性,逻辑
- 仲裁段
- 当有多个设备发送数据,产生总线冲突时,来判断一个先后顺序
- 由于总线是线与机制,所以显性
0
的存在感更强,所以ID
越小优先级越高 - 标准帧
11 id
+RTR
位- 数据帧的
RTR
位为0
,远程帧的RTR
位为1
- 扩展帧
11 id
+SRR
+IDE
+18 Extend id
+RTR
位SRR
位恒为1
- 标准帧的
IDE
为0
,扩展帧的IDE
位为1
RTR
保证数据帧的优先级大于远程帧IDE
保证标准帧的优先级大于扩展帧
- 控制段
- 标准帧
IDE
+r0
+DLC(4bits)
r0
为显性电平0
- 扩展帧
r1
+r0
+DLC(4bits)
r1
和r0
为显性电平0
DLC
数据帧长度,取0-8
- 标准帧
- 数据段
- 发送数据,
0-8
个字节
- 发送数据,
CRC
段CRC
校验序列(15bits
) +CRC
界定符(DEL
恒为隐性1
)CRC
计算范围包括:SOF
、仲裁场、控制场和数据场
ACK
段ACK
槽 +ACK
界定符(DEL
恒为隐性1
)- 目的:发送节点确保自己发出的报文至少有一个节点正确接收了
- 发送节点发出
11
,接收节点将ACK
槽中填充0
,这时候发送节点回读总线电平时,就是01
EOF
- 七个连续隐性
1
- 七个连续隐性
错误帧种类
- 位发送错误
- 节点发送到总线的电平与从总线回读的电平不一致
ACK
错误- 发送节点在
ACK
槽上没有回读到显性0
- 发送节点在
- 位填充错误
- 从
SOF
到CRC
校验序列之间不允许有6
个连续的相同电平,发送器只要检测到5
个连续相同逻辑位时,就会在下一位插入一个相反的逻辑电平。 - 位填充错误是指在
SOF
到CRC
校验序列之间检测到有6
个连续相同的逻辑电平 - 剩余位域(
CRC
界定符、ACK
段和EOF
)形式固定,不填充 - 作用:确保数据帧不会被识别为
EOF
和错误帧(6
个连续显性位获隐性位)
- 从
CRC
错误- 发送节点发出的
CRC
序列与接收节点自行计算的CRC
序列结果不一致
- 发送节点发出的
- 格式错误
- 一些位恒定不变,比如:
EOF
连续七个隐性1
、CRC
界定符恒为1
、ACK
界定符恒为1
- 一些位恒定不变,比如:
错误帧
- 错误标志(
6bits
) + 错误标志重叠部分(0-6bits
) + 错误界定符(8bits
) - 主动错误标志:
6
个连续显性0
- 处于主动错误状态的节点会发送主动错误标志。由于主动错误标志违反了位填充规则,就造成其它节点也检测到错误并发送错误标志(这就是错误标志重叠形成的原因)
- 被动错误标志:
6
个连续隐性1
- 被动错误标志可能会被其它节点的显性位改写,所以节点只需要关注发送了
6
个连续隐性位就行,不需要关注总线上的状态有没有被其它节点更改 - 发送节点发送被动错误标志,将会导致接收节点的位填充错误
- 接收节点发送被动错误标志,不会对总线产生影响
- 被动错误标志可能会被其它节点的显性位改写,所以节点只需要关注发送了
- 错误界定符:
8
个连续隐性1
- 当发送完错误标志后,所有节点开始向总线发送一个隐性位,并检测到总线电平为隐性时,发送剩下的七个隐性位
- 错误帧发送时刻
- 位发送错误、位填充错误、格式错误和
ACK
错误产生后,将直接在下一位发送错误帧 CRC
错误产生后,在ACK
界定符后的位发送错误帧- 错误帧发送完成后,总线空闲时自动重发出错的数据帧
- 位发送错误、位填充错误、格式错误和
错误状态(11898 P68
)
- 根据错误计数来切换状态,发送错误计数器(
TEC
)和接收错误计数器(REC
)- 当接收方检测到错误时,接收错误计数器(
REC
)应该加1
- 当接收方在发送一个错误标志后,检测到主导位作为第一个位时,接收错误计数器(
REC
)应该加8
- 当发送方发送错误标志时,发送错误计数器(
TEC
)应该加8
- 当发送方在发送主动错误标志或过载标志时,发送错误计数器(
TEC
)应该加8
- 当接收方在发送主动错误标志或过载标志时,接收错误计数器(
REC
)应该加8
- 在一个帧成功传输后(得到
ACK
并且在EOF
完成之前没有检测到错误),发送错误计数器(TEC
)应该减1
;发送错误计数器(TEC
)为0
时例外 - 在成功接收到一个帧后(
ACK
槽位前无错误接收,并成功发送ACK
位),如果接收错误计数器(REC
)在1
到127
之间,应该减1
。如果REC
为0
,则保持0
不变。如果REC
大于127
,则设置为119
到127
之间的值
- 当接收方检测到错误时,接收错误计数器(
- 主动错误状态(
TEC
和REC
均小于128
)- 初始化后进入主动错误状态,可靠,能够正常进行总线通信
- 发送节点或者接收节点,检测出错误时,会发出主动错误标志(
6
个连续显性位) - 发送主动错误标志,相当于告诉其它节点作废上次的报文
- 被动错误状态(
TEC
或REC
大于127
)- 不可靠,错误较多,能够进行总线通信,但不能连续发送了
- 检测到错误时,发出被动错误标志(
6
个连续隐性位)。发送结束后,处于被动错误状态的节点在下一次发送之前需要等一下(帧间隔(3
个隐性位) + 延时段(8
个隐形位)),从而让其它正常节点优先使用总线 - 发送节点发送被动错误标志,不能连续发送,需要等待
Bus off
(TEC
大于255
)- 总线关闭,不能收发任何报文
- 重启后恢复
CAN
通信 - 或者监控了
128
次空闲状态(idle condition
)后,错误计数器归0
,变为主动错误状态 idle condition
:11
位连续的隐性1
- 假设没有进一步的错误,从检测到一个错误到可能开始下一帧的恢复时间,在主动错误状态下通常是
17-23
个比特位(错误标志6bit
+ 错误标准重叠部分0-6bit
+ 错误界定符8bit
);在被动错误状态下会多8
个比特位(8
位延时段),高达31
个比特位。
CAN FD
相较于CAN
的优点
- 增加了数据的长度,最多支持
64
个字节,提高了协议效率 - 增加传输速度,支持双比特率,仲裁比特率最大为
1Mbit/s
,数据比特率可实现5Mbit/s
- 可兼容传统
CAN
帧结构
-
SOF
- 恒为显性,逻辑
0
- 恒为显性,逻辑
-
仲裁段
CAN FD
取消了对远程帧的支持,用RRS
位替换了RTR
位,恒为显性0
-
控制段
IDE
+FOF
+res
+BRS
+ESI
+DLC
- 相比于
CAN
,增加了FOF
、BRS
和ESI
FDF(Flexible Data Rate Formate)
,恒为隐性1
,对应传统CAN
中的保留位r
BRS(Bit Rate Switch)
表示位率转换,为显性0
时,数据段和仲裁段的速率保持一致;为隐性1
时,数据段以更高的速率传输。从ESI
开始到CRC
界定符结束。ESI(Error State Indicator)
错误状态指示器,主动错误为显性0
,被动错误为隐性1
DLC
取值:0-8,12,16,20,24,32,48,64
-
数据段
- 最多能发
64
个字节
- 最多能发
-
CRC
段-
CRC
位数- 传统
CAN
是15
位的CRC
校验。 - 在
CAN FD
中,当传输数据最多16
个字节时,使用17
位的CRC
校验 - 当传输数据大于
16
个字节时,使用21
位的CRC
校验
- 传统
-
添加了
Stuff Count(4bits)
- 格雷码计算:
CRC
区域之前的填充位数对8
取余,然后进行格雷码计算(Bit0-2
) - 奇偶校验:通过格雷码计算后的值进行偶校验,填充到
Parity
位
- 格雷码计算:
-
CRC
校验场中使用固定填充位CRC
校验场的第一位- 每间隔
4
位添加一个固定填充位 - 固定填充位的值是上一位的反码
-
-
ACK
段ACK
槽 +ACK
界定符- 由于会从高速的数据场到慢速的
ACK
段,时钟切换会引用收发器相移和总线传播延迟,所以在CAN FD
中,接收节点利用2
位时间识别应答位。
-
EOF
- 七个连续隐性
1
- 七个连续隐性
总线负载(Bus load
)
-
固定时间(
1s
)内,总线上实际传输的bit
数除以理论上总线传输的bit
数假设比特率设置为500kbps,那么理论上每秒能够传输 500 * 1000 bit 现在实际上每秒有100帧报文(CAN标准帧,大概一帧120bit) 那么 bus load = (120 * 100) / (500 * 1000) * 100% = 2.4%
-
总线负载太高,容易出现丢包