CAN 是 Controller Area Network 的缩写即控制局域网,是 ISO*1 国际标准化的串行通信协议。
应用场景
最初CAN用于汽车产业中,由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。
现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
CAN总线有两个ISO国际标准分别为ISO11898,ISO11519。
在实际应用中一般通信波特率为500Kbps。
如下图所示CAN由CAN控制器和收发器组成,支持CAN的单片机都会有CAN控制器,但是收发器需要自己去找合适的收发器芯片。
在 CAN 总线上,利用 CAN_H 和 CAN_L 两根线上的电位差来表示 CAN 信号。CAN 总线上的电位差分为显性电平和隐性电平。其中显性电平为逻辑 0,隐性电平为逻辑 1。
个人觉得这些了解就可以了,感觉是硬件的需要关注的,当出现问题时这也可以作为排查问题的一种方法。可以用万用表或者示波器去打这些信号是否符合标准。
CAN总线不像SPI总线那样分主从设备,CAN总线上的节点在总线空闲时间都可以发送数据。CAN是一种多主的工作方式。总线空闲状态:CAN总线规定,当总线上出现连续11位隐性电平,节点就认为总线是空闲状态,可以发送数据。
当多个节点向总线发送数据时,如何决定谁先发送,CAN总线规定了一种判断方法,当多个节点同时向总线发送消息时,对各个消息的标识符(即 ID 号)进行逐位仲裁,如果某个节点发送的消息仲裁获胜(ID值小的),那么这个节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转变为监听(接收)状态。 这种仲裁机制既不会造成已发送数据的延迟,也不会破坏已经发送的数据,所以称为非破坏性仲裁机制。
这部分内容个人觉得是做嵌入式软件人员需要关注的,我们需要熟悉CAN协议中报文的种类和作用以及组成。
CAN协议规定了5种数据帧(报文)分别为数据帧,遥控帧,错误帧,过载帧,间隔帧。每种数据帧有相同之处也有不同之处。
帧结构组成包含七个段:帧起始、仲裁段、控制段、数据段、CRC 段、ACK 段、帧结束数据帧(报文又分标准帧和拓展帧)
帧的最开始的一位是帧起始,也叫 SOF(Start Of Frame),SOF 恒为显性位,即逻辑 0 。帧起始表示 CAN_H 和 CAN_L 上有了电位差,也就是说,一旦总线上有了 SOF 就表示总线上开始有报文了。
仲裁段是用来判定一帧报文优先级的依据,仲裁段中的 ID 号也是实现报文过滤机制的基础。仲裁段由以下几个部分组成
Tranmission Request Bit (远程发送请求位)。在数据帧中,RTR 位恒为显性位 0,在遥控帧中,恒为隐性 1。
这么做的原因是保证数据帧优先级高于遥控帧。比如:在某一时刻 t,节点 Node_A 发出了 ID 号为 ID_2 遥控帧报文来请求总线上的其它节点发出 ID 号为 ID_2 的数据帧报文。但是就在同一时刻 t,节点 Node_B 发出了 ID 号为 ID_2 的数据帧报文。这个时候怎么办呢,显然依靠 ID 号不能仲裁出这两帧报文(一个遥控帧,一个数据帧,ID 号相同)谁能占据总线的发送权,这种情况下,RTR 位就起作用了,由于 RTR 在数据帧中恒为显性 0,在遥控帧中恒为隐性 1,所以在 ID 号相同的情况下,一定是数据帧仲裁获胜。这就解释了 **RTR 位的作用:在 ID 号相同的情况下,保证数据帧的优先级高于遥控帧**。
Substitutes for Remote Requests Bit(替代远程请求位),在扩展帧(数据帧或遥控帧)中,SRR 恒为隐性位 1,并且可以发现,扩展帧的隐性 SRR 位正好对应标准帧的显性 RTR 位,这就解释了 SRR 位的作用:在前 11 位 ID 号相同的情况下,标准数据帧的优先级高于扩展数据帧;
全称:Identifier Extension Bit(标识符扩展位)。在扩展帧中恒为隐性 1,在标准帧中,IDE 位于控制段,且恒为显性 0。且扩展帧 IDE 位和标准帧 IDE 位位置对应,这就保证了: 在前 11 位 ID 号相同的情况下,标准遥控帧的优先级一定高于扩展遥控帧。
CAN报文中数据段最大为8个字节,用来承载数据。
CRC主要用于校验发送方和接收方的报文内容是否正确。CRC 校验序列是根据多项式生成的 CRC 值,其计算范围包括:帧起始、仲裁段、控制段和数据段。 CRC 界定符恒为隐性 1
帧结束段表示该帧报文的结束,由 7 个隐性位构成。
数据帧顾名思义就是携带数据的报文,作用是承载发送节点要传递给接收节点的数据。
数据帧 的帧结构如下图所示
遥控帧的作用可以描述为:请求其它节点发出与本遥控帧具有相同 ID 号的数据帧。遥控帧 相比于数据帧,从帧结构上来看,只是少了数据段,包含六个段:帧起始、仲裁段、控制段、CRC 段、ACK 段、帧结束。
在某个场景下,A节点需要B节点向自己发送一个相同ID的数据帧,那么可以通过遥控帧来进行请求。
在发送和接收报文时,总线上的节点如果检测出了错误,那么该节点就会发送错误帧,通知总线上的节点,自己出错了。 错误帧由错误标志和错误界定符两个部分组成。
在 CAN 总线通信中,一共有五种错误:
位错误
ACK 错误
填充错误
CRC 错误
组成。
主动错误标志:6 个连续的显性位(6个零);
被动错误标志:6 个连续的隐性位(6个1);
错误界定符:8 个连续的隐性位(8个1)。
在 CAN 总线通信中,一共有五种错误: