目录
上节从宏观上对CAN总线的发展及工作原理等进行了介绍,本节内容将是整个CAN总线的核心内容,即可谓之“硬菜”,堪称全网“最细”。
1.CAN总线的帧类型
CAN的帧主要包括以下几种:数据帧(Data Frame)、远程帧(Remote Frame)、错误帧(Error Frame)、过载帧(Overload Frame)及间隔帧(Interframe Space)。本节只介绍常用的数据帧及错误帧。
1.1数据帧
数据帧主要包含以下几个部分:
1.SOF, Start of Frame 帧起始
标识一个数据帧的开始,用于同步;一个显性位;只有在总线空闲时才能发送SOF。
2.仲裁场
→ID:标识符,标准帧11位,拓展帧29位,用于确定报文优先级;
→RTR:远程传送请求位,数据帧RTR=0/远程帧RTR=1;
→IDE:标识符拓展位,标准帧IDE=0/拓展帧IDE=1;
→SRR:远程代替请求位,SRR=1;
3.控制场
→r0, r1保留位,置0;
→DLC:数据长度码,0-8,4位;
4.数据场
→0-8个BYTE;
5.CRC场
→CRC:用于进行CRC校验,15位,首先发送节点根据发送的序列计算一个CRC,然后接收节点根据接受的序列计算一个CRC,通过比较两个CRC是否相等来判断该数据帧是否有效;
→CRC界定符:界定CRC序列,固定一个隐性位,界定符之前进行位填充;
6.ACK场
→ACK:确定报文被至少一个节点正确接收。发送节点在ACK发送隐性位;正确接收报文的节点→ACK发送显性;未正确接受报文的节点→ACK发送隐性;发送节点检测应答位是否被显性位覆盖,如果没有→ACK错误;
7.侦结束
→7个连续隐性位表示数据帧结束;节点在检测到11个连续的隐性位后认为总线空闲;
8.ITM
1.2错误检测与错误帧
1.错误检测
→ 位监测→位错误(如下两种位错误)
(1)节点检测到的位与自身发送的位数值不同;
(2)仲裁和ACK位期间送出“隐性”位,而检测到“显性”位不导致位错误;
→ 填充检测→填充错误
在使用位填充编码的帧场(帧起始至CRC序列)中,不允许出现6个连续相同的电平位;
→ CRC检测→CRC错误
节点计算的CRC序列与接收到的CRC序列不同;
→ 格式检测→格式错误
固定格式位场(如CRC界定符、ACK界定符、侦结束等)含有一个或更多非法位;
→ ACK检测→ACK错误
发送节点在ACK位期间未检测到“显性”位;
Summary:
- 发送节点→位错误、格式错误、ACK错误;
- 接受节点→填充错误、格式错误、CRC错误;
2.错误帧
→ 检测错误→发送错误帧→通知报文错误;
→ 错误帧的发送
(1)位错误、填充错误、格式错误或ACK错误产生后→当前发送的下一帧发送错误帧;
(2)CRC错误→紧随ACK界定符后的位发送错误帧;
(3)错误帧发送后→总线空闲时重发出错的数据帧;
主动错误
→ 主动错误帧格式:
主动错误标志(6个显性位)+错误标志叠加(0-6个显性位)+错误界定符(8个隐性位)+IMT;
→ 被动错误帧格式
被动错误标志(6个隐性位)+错误标志叠加(0-6个显性位)+错误界定符(8个隐性位)+IMT;
3.节点错误状态
- 主动错误状态→可收可发,使用主动错误标志;
- 被动错误状态→可收可发,使用被动错误标志;
- 总线关闭状态→不参与任何总线活动;
正常通信,但无法保证收发报文的正确性
根据CAN协议的规定,CAN节点内,有两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。CAN节点错误状态的转换(下图),就是基于这两个计数器来进行的。
2.位填充机制
(1)发送节点发送5个连续的相同极性位后,在位流中自动插入一个极性相反的位→位填充。
(2)接受节点对相同极性位的数量进行检测,从位流中将填充位去掉→清除填充。
(3)SOF之前的总线空闲区域,不需要同步,无需进行位填充;
(4)CRC之后的位域都是固定格式,不允许位填充操作;
作用:
(1)CAN网络同步需要足够多的上升沿,这是CAN网络规定位填充的目的之一。
(2)确保数据帧不会被当作错误帧(由6个连续的显性或隐形位组成)、确保正确识别帧结束标志(7个连续隐形位)。
本节内容就先分享至此,下节继续介绍其同步机制,大家可关注+收藏,以慢慢消化。
完美的一天就该收获满满,共勉!