1 帧格式
帧格式可理解为定义了传输的数据(叫报文)应该“长什么样”来传输,也为后续设定一些规则如错误检查机制提供了思路。
首先,帧格式可分为以下5种类型:
PS:CAN总线任意一个设备可当收也可当发,CAN总线有两种数据传输方式:广播式和请求式。
广播式:CAN其中一个设备其不断地发送报文到总线上,连接到总线上的其他设备“想收就收”。
请求式:CAN中哪个设备有收数据的需求,向发数据方发送一个请求,发数据方收到请求后,才发送报文到总线上。
1.1 数据帧
数据帧有两种格式:标准格式和扩展格式。
图上的数字:代表每一段对应的所占的位数,不是点电平逻辑!(黑色粗线才是逻辑电平)
颜色解释:看图的最底下,无论是标准格式还是扩展格式,灰色代表逻辑0,白色代表逻辑1,紫色代表可0可1,ACK位槽特殊情况白色灰色各占一半,规定发送方必须白色即发送逻辑1,接收方必须发送逻辑0。
1.1.1 标准格式:
(1)SOF段之前段(帧起始前):总线空闲,上一章提到,高速CAN空闲为1(黑色粗线为逻辑电平1)。
(2)SOF(帧起始):必须为0,表示开始发送了,要与帧之前空闲时1区别,故必须为0;
(3)ID:报文ID共11位,紫色,则视具体情况而定
(4)RTR:远程请求标志位,用于区分数据帧(为0)还是遥控帧(为1),现在是数据帧,如必须为0;
(5)IDE:用于区分标准格式(为0)还是扩展格式(为1),这里为标准格式,故必须为0
(6)r0:保留位,还未用到,为了以后可能升级用,目前先固定设为0。
(7)DLC:表示数字段的长度,数据段要多少字节
(8)DATA:就是传输的数据
(9)CRC:校验算法,会对SOF到DATA的数进行自动检验,得到一个检验码存在这个位置。
(10)CRC界定符:设定为逻辑1
(11)ACK段:ACK槽——ACK界定符:ACK槽为发送方必须白色即发送逻辑1,接收方必须发送逻辑0(同时),ACK界定符设定为逻辑1。(理解:这段可认为是发送方和接收方操作总线权力短暂交接的过程,ACK段前后都是发送方在操作总线,ACK段则是接收方在操作总线,目的是为了让发送方方知道有设备接收了,ACK槽前后要留有权力交接的时间,故设定了CRC界定符和ACK界定符,CRC界定符为逻辑1,发送方释放总线,若有设备接收了,那么ACK槽就会接收方拉下总线,故会出现逻辑0,这样发送方就知道有设备接收到了,接收方发出应答后,又要交出总线的控制权,故接收方在ACK界定符上要发逻辑1,释放总线。)
PS:
- 数据的应答是一位一位进行的,而不是等所有数据传输完,接收方才来应答。
- ACK段可多个设备同时拉下总线。
(13)EOF(帧结束):设定为7个逻辑1,表示帧结束了。
1.1.2 扩展格式:
扩展格式是因为ID段不够用用了,所以要加ID段的位数。
扩展格式为了要与标准格式的兼容,再碰到IDE位前,系统也不知道是标准格式还是扩展格式,因此,IDE前的两种格式的解析方式,位数等必须一致(除了帧起始,扩展格式没有),遇到IDE后,则可分标准格式解析还是扩展格式解析,即两种格式可以不一样了。
所以,看到红色框内,即遇到IDE前,先都是11位ID。
此后,标准格式为RTR位+IDE,为了与之一样,扩展格式位SSR+IDE,其实SSR是无用的,强制设定为1,为的是与标准格式的RTR位对应。
遇到IDE位后,扩展格式加进了18位ID,后与标准格式RTR位开始完全一致。
1.2 遥控帧
看结构,遥控帧无数据段(DATA),RTR为隐性电平1(与数据帧区分),其他部分与数据帧相同。
这样理解:遥控帧是请求式,说明接收方向发送方请求发送,那自然没有数据,故没有数据段。
而当是请求式时,需要数据帧和遥控帧配合,先遥控帧(配有一个ID)发出给发送方,发送方收到后,以相同ID报文且用数据帧来发送数据,根据后续仲裁规则,当具有相同ID数据帧和遥控帧同时发送时,数据帧优先,则接收方可以收到数据。
1.3 错误帧
总线上所有设备都会监督总线的数据,错误”或“格式错误”或“应答错误”,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
设备默认处于主动错误状态,当某设备处于主动状态时发生的错误太多,就会进入被动错误状态。但无论是哪种状态,但是设备不会乱发错误帧,是当某设备检测出有错误时,该设备才会发出错误帧,即图示错误帧的波形。
设备处于主动状态时发出的错误帧的波形为:6个显性位(逻辑0)+6个显性位(逻辑0)【用于延迟】+错误界定符(固定8个逻辑1)
理解:当总线上某一个设备处于主动状态发现错误时,发出6个0,相当于拉下总线,当总线上的传输的数据有1时就会被破换掉,因为0强于1(之前提到),那么最终其他设备收到的数据就被破换掉了。
设备处于被动错误状态时发出的错误帧波形为:6个隐性位(逻辑1)+6个隐性位(逻辑1)【用于延迟】+错误界定符(固定8个逻辑1)
理解:当总线上某一个设备处于被动状态发现错误时,发出6个1,相当于放开总线,就相当于自己这个设备自己破坏自己发的数据,但不破坏总线上别人发的数据(因为总线上数据是1的话就没影响,是0的话,0强于1也没影响)。
- 两种错误帧都有6位用于延迟:是因为当某一设备发出错误帧时,可能会引起其他设备也出现错误,那么其他设备也可能发错误帧,相当于给一个延迟时间,在来通过界定符来表示结束。
- 有的同学可能回想,主动发出的错误帧时,发出了六个0,如果刚好总线上的数据也是6个0,那不是没有破换掉数据?或者说不知道是错误帧还是数据,这种情况其实是不可能发生的!!!,连续出现6个0或者6个的情况只能是错误帧,因为CAN还设定了位填充规则(文章末尾)。
1.4 过载帧
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失。
可以这样理解:因为发送方的发送频率是其自己决定的,当接收方接收不过来的时候,接收方就可以发出一个过载帧来破坏掉这个数据(过载帧和错误帧类似,连续发送了6个0,我们说错误帧的时候提到过这样会破坏数据),发送方的数据没被收到,那么发送方就会重试,那么,破坏和重试这个过程所用的时间就相当于给接收方延迟,让它有机会慢点收数据。(或者如果发送方有相应的处理机制,收到过载帧后就会调整发送频率)。
过载帧形式:6个显性(逻辑0)+延迟一部分(未确定具体多少位0)+过载界定符(8个1)。
1.5 帧间隔
帧间隔的作用是将数据帧和远程帧与前面的帧分离开。
比如:当设备连续发送数据帧时,需要有帧间隔把这些数据帧分离开。
帧间隔也分主动状态和被动状态。
图上方为主动状态:3位隐性电平(逻辑1)+ 总线空闲(n位逻辑1)
图下方为被动状态:3位隐性电平(逻辑1)+ 延迟传送(8位逻辑1)+ 总线空闲(n位逻辑1)
2 位填充
数据帧和遥控帧发送到总线前其实是进行了位填充再发送到总线上的。
位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。
以下通过下图几个例子来理解:
“即将发送”表示设备要发出去的数据,”移除填充后”是接收方实际接受到的数据,可以看到,以下三个例子这两项都是对应一样的。
第一组:
要发送的数据是100000110,根据位填充规则,连续发送了5个0后,要在他后面追加一个相反电平1,如“实际发送”/“实际接收”所示,接收方最终接收的数据又会把这个追加的1移除。
第二组:
要发的是10000011110,同样,连续5个0后补1得到100000111110,发现补了一个1后又出现了连续5个1的情况,则在后续再追加一个0得到1000001111100,最后实际接收会把这两个填充位都移除。即:位填充插入的数据位,要和原始数据后续的数据位合并,进行新的位填充判定。
第三组:
要发011111111110,连续5个1后补0得到0111110111110,根据第二组得到的规则,追加的0要和后续的位数一起进行为位填充规则判定,发现无连续0,但原始数据中,又出现5个1,0111110111110,故补0得到:01111101111100,同样,最后实际接收会把这两个填充位都移除。
位填充作用:
- 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能确掌握数据采样时机。
- 将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性。(就是我们前面讲错误帧时提到的,不可能在总线上传输的数据出现连续6个相同电平,如果出现,必是错误帧或过载帧)
- 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲。(CAN总线规定,当出现11个1后表示CAN总线处于空闲状态,由上面例子的第三组可以看到,传输的数据不可能是连续11个1的情况,出现了则必是表示CAN总线处于空闲状态。)
注:以上均是通过学习参考文献、哔哩哔哩网站上江协科技官方号以及网络资源所得的个人经验,如有侵权,请联系我,欢迎指正。