信息的传递,古往今来都是人类无比关注的一个问题。从最原始的肢体语言到高端的电子信号,信息传达的方法五花八门。而对于信息安全的追求也是从古至今未有变过,我国西周时期的《太公兵法》就有过“阴符”“阴书”的设计来保证信息的安全。
![](https://pic4.zhimg.com/80/v2-3ebc91aeb8cf0dda5b0d050716d8e8b3_hd.jpg)
![](https://pic2.zhimg.com/80/v2-e368548f30cf30738b21de9c5888eae5_hd.jpg)
- 数据头:在数据的开始,是一个1位的数据头,表示数据帧都开始
![](https://pic4.zhimg.com/80/v2-cce75ec1fa9ae6c6ce9e2066ad2f2ad7_hd.jpg)
- 仲裁段:标志了本帧数据的优先级,其中包含了一个ID码,仲裁段中的ID码值越小,帧数据的优先级就越高,CAN控制器在发送数据的同时会监听电缆上的电平状态,如果发现仲裁位的电平与本节点发出的电平不一致,则退出发送放弃总线使用权。这样的设计可以提高总线的利用率,并且能让重要的信息优先发送。
![](https://pic1.zhimg.com/80/v2-cc128da06cf4a5e0998dbdd638d116c4_hd.jpg)
- 控制段:共六位,用于表示数据长度。在数据的控制段存有保留位以供未来协议规则扩展。
![](https://pic3.zhimg.com/80/v2-512b344056529b4dabb10727c1bd9f42_hd.jpg)
- 数据段:经过前面的铺垫,数据段所编码的即是本帧数据所需要传达的信息。一帧信号可以传送0~8位数据,每字节8位。短小精悍保证信息的实时性。
![](https://pic4.zhimg.com/80/v2-2e440f2284d103919deeb9f7bf5fff8f_hd.jpg)
- CRC段:CRC段即是保证数据准确的一个关键所在(敲黑板)。为防止信号由于某种原因被更改,CAN的数据链路层上加入了CRC校验。发送节点会根据发送内容计算得到一个CRC值填入CRC段进行发送,而相应的接收节点也会对接收到的数据进行计算,并将计算出的CRC值和接收到的进行比对。能够对得上暗号的才是自己人,如果对照有误那么就说明传输的信号出现了问题,需要反馈错误消息。这样的机制保证了CAN不会收到错误的信息,其安全性毋庸置疑。
![](https://pic3.zhimg.com/80/v2-a9186b14feb72c53c5b0df46ee512836_hd.jpg)
- ACK段:用于表征信号是否被正确接收,接受正常的节点在ACK的第一位会发出一个显性位。根据ACK的状态,发送节点就可以了解到数据是否被传输成功。若发送失败,发送节点会根据自身状态来决定是否重传。
![](https://pic3.zhimg.com/80/v2-46db0cb1d090693016a11648f379bb1e_hd.jpg)
- 帧结束:由7个隐性位组成,表示该帧结束。
![](https://pic1.zhimg.com/80/v2-a8a8f9ed86aaeafe8589b1202d1f591c_hd.jpg)
CRC校验所使用的CRC多项式最多可以检测出5个离散错误,或发现长度在15位以下偶然出现的突发错误。CRC校验对SOF位、仲裁段、控制段和数据段的位序列进行计算,但不考虑填充位。CAN协议中规定的15位校验序列源自于BCH代码,它是一种特别适用于127位以下消息长度的循环代码。CAN协议中所应用的15位多项式如下:
X15+X14+X10+X8+X7+X4+X3+1
在发送或接收收到数据场的最后一位后,CRC寄存器就会包含待传输或者待接收的CRC序列。将计算出的CRC序列与接收到的CRC序列相除,接收器就可以识别出可能存在的CRC错误。
有些工程师担心CAN收到错误的信息,在数据中又做了CRC校验的工作,岂不知在数据链路层CAN已经自备了CRC校验的工作,在数据中再加入CRC校验实际上是没有什么必要的。
![](https://pic2.zhimg.com/80/v2-3aa3c91f32ecf05f9a24f1585addd7fd_hd.jpg)
来源:致远电子