详解CAN总线的位填充机制
文章目录
- 前言
- 一、封装成帧
- 二、透明传输
- 三、差错检测
前言
在CAN总线的错误类型中我们介绍了填充错误检测范围是从SOF到CRC场,填充规则是在传输报文中每5个相同极性位后填充1个极性相反位。为什么要进行位填充呢?这种填充规则是怎么定义的,或者说我们一起思考一下为什么需要5个相同极性位才填充1个极性相反位?
不管什么通信协议,在数据链路层需要解决的三个共性问题是封装成帧、透明传输和差错检测。以CAN报文为例:
一、封装成帧
很容易理解,把报文的Data数据部分进行封装,定义好帧开始、帧结束的标志,组成完整的一帧进行发送。按照CAN报文的帧结构从SOF到EOF组成一帧CAN报文,接收端就能够根据首部和尾部的标志从接收的比特流中识别出帧的开始和结束,从而正确接收一帧CAN报文。
二、透明传输
如下图,在一帧报文中,如果数据段某些比特组合正好与帧结束符一样了,那接收端在接收数据时就会出现:识别到第一个帧结束符就认为该帧传输完成,而没有真正接收到完整的一帧报文。透明传输就是为了解决(预防)这种帧定界的错误。所谓透明传输,表示的是无论什么样的比特流数据都能按照原样无差错的通过数据链路层,那为了解决数据部分可能出现的帧开始符或帧结束符,就需要进行字符填充。
CAN报文为了实现透明传输,就是在SOF到CRC字段采用每5个相同极性位后填充一个极性相反位。这样在一帧CAN报文传输过程中就不会出现连续7个连续“1”而与EOF相同了。
那有人会有疑问了,既然EOF是7个“1”,为什么不是每6个相同极性位后填充一个极性相反位来与EOF做区分呢?又或者是每5个相同隐性位“1”后填充一个显性位“0”呢?
答案是不可以的。这是为了避免与CAN错误帧出现重叠,我们知道主动错误帧是连续6个“0”开始,被动错误帧是连续6个“1”开始,而填充规则设计成5个连续相同极性位正是为了与错误帧区分开,不影响错误帧发挥作用的同时又能实现帧的透明传输。
三、差错检测
CAN报文的差错检测即是通过CRC场来进行CRC校验来保证一帧报文没有比特差错。暂不展开。