1 简介
CAN是控制局域网(Controller Area Network)的简称,是一种能够实现分布式实时控制的串行通信网络。
1.1 优点
传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构。
低成本:ECUs(电子控制单元)通过单个CAN接口通信,布线成本低;
高集成:CAN总线系统允许在所有ECUs上进行集中错误诊断和配置;
可靠性:该系统对子系统的故障和电磁干扰具有很强的鲁棒性,是汽车控制系统的理想选择;
高效率:可以通过ID对消息进行优先级排序,以便最高优先级的ID不被中断;
灵活性:每个ECU包含一个用于CAN总线收发芯片,随意添加CAN总线节点。
1.2 CAN总线网络
CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。
1.3 CAN收发器
CAN收发器的作用是负责逻辑电平和信号电平之间的转换。
1.4 CAN信号表示
CAN总线采用不归零码位填充技术,信号有两种不同状态,分别为隐形电平和显性电平。CAN的数据总线有两条CAN_H和CAN_L,当没有数据发送时,两条线的电平一样都为2.5V,称为静电平,也就是隐性电平。当有信号发送时,CAN_H的电平升高1V,即3.5V,CAN_L的电平降低1V即1.5V,此时为显性电平。信号每一次传输完后不需要返回到显性电平。
定义 | 总线电平 | 逻辑电平 |
CAN_H-CAN_L < 0.5V | 隐形电平 | 逻辑1/高电平 |
CAN_H-CAN_L > 0.9V | 显性电平 | 逻辑0/低电平 |
2 CAN帧
CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。
数据帧:用来节点之间收发数据,是使用最多的帧类型;
远程帧:用来接收节点向发送节点接收数据;
错误帧:是某节点发现帧错误时用来向其他节点通知的帧;
过载帧:是接收节点用来向发送节点告知自身接收能力的帧;
帧间隔:用于将数据帧、远程帧与前面帧隔离的帧。
2.1 数据帧和远程帧
标准帧、扩展帧:
数据帧(如下图,包含有数据段)和远程帧(无数据段)在结构上都分为标准帧(2.0A)和扩展帧(2.0B),标准帧和扩展帧主要的不同点在于标识符(ID)的长度不同,标准帧是11位而扩展帧是29位。
IDE(Identifier Extension)位全称“标志符扩展位”,在标准帧中IDE位于控制段,为显性电平,在扩展帧中位于仲裁段,为隐性电平。
CAN2.0A
CAN2.0B
与数据帧相比,远程帧(如下图)无数据段,也分为标准帧和扩展帧,且RTR位为1(隐性电平)。
RTR的全称为“远程发送请求(Remote Transmission Request)”。RTR位在数据帧里必须为“显性”,而在远程帧里必须为“隐性”。RTR是区别数据帧和远程帧的标志。
帧起始
由1个显性位组成
帧结束
由7个隐性位组成
仲裁段和控制段
CAN总线采用的"线与"的规则进行总线仲裁,即1&0=0,且0为显性。当多个节点同时给CAN总线发送数据时(总线竞争),只要某时刻存在一个节点上的发送数据为显性电平,则此时CAN总线电平为显性电平。如下图所示CAN收发器在发送数据时会同时检测总线上的电平是否与发送数据对应电平相同,如果不同则停止发送并做出处理。
如何仲裁,举例如下:
注:SRR(Substitute Remote Request)为代替远程请求位,在扩展帧中恒为隐性位1。SRR位的作用在于:在前11位ID相同的情况下,扩展帧的优先级要低于标准帧。
故关于仲裁有如下结论:
①帧ID值越小,优先级越高;
②由于数据帧的RTR位为显性电平而远程帧为隐性电平,故帧格式和帧ID相同的情况下,数据帧优先级高于远程帧;
③由于标准帧的IDE位为显性电平而扩展帧的为隐性电平,故帧格式和帧ID相同的情况下,标准帧优先级高于扩展帧。
数据段(数据帧)
一个数据帧传输的数据量为0~8字节,数据量小,发送和接收时间短,实时性高,被干扰的概率小,抗干扰能力强。
CRC段
CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。 CRC校验段由15位CRC值和1位CRC界定符构成如图所示。(远程帧校验范围为帧起始+仲裁段+控制段,因为远程帧没有数据段。)
ACK段
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平如图所示。此时,发送节点的发送位为隐性电平,而监测到的总线电平为显性电平(接收节点发送的),发送节点据此判定发送成功且继续发送完剩余帧。
2.2 过载帧与帧间隔
过载帧
当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点。过载帧由过载标志和过载帧界定符组成如下图。
可能存在多个节点同时过载且过载帧发送有时间差问题,会出现过载标志叠加后超过6个位的现象如下图所示。
过载标志的连续6+个显性位会屏蔽掉总线上其他节点 的发送,相当于把其他节点的发送推迟了,总线在过载帧这段时间内“休息”。
有三种情况会引起过载帧:
①接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。
②在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位);
③CAN节点在错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。
帧间隔
帧间隔用于将数据帧或远程帧和它们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
主动错误状态的帧间隔:
被动错误状态的帧间隔:
间隔段:连续三个隐性位;间隔段期间,所有节点不允许发送数据这或遥控帧,只要在这期间监听到显性位,接收节点就会发送过载帧。
空闲段:连续隐性位,个数不一定,0个或者多个都可以。总线空闲的时间是任意长的,只要总线空闲,节点就可以竞争总线。
暂停段:只有处于被动错误状态的节点在发送帧间隔的时候,才会在帧间隔中插入8个连续隐性位的暂停段。
详细见:CAN协议过载帧和帧间隔 。
2.3 错误帧
CAN-bus的错误类型共有五种如下:
当出现上述5种错误之一时,发送或接收节点将发送错误帧,帧结构如下,其中错误标识分为主动错误标识和被动错误标识:
为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态及其行为如下图所示。
2.4 位填充机制
帧起始、仲裁段、控制段、数据段以及CRC校验值段(不包括CRC界定符),均通过位填充方式编码。
所谓位填充即指:无论何时,发送器只要检测到位流中有5个连续相同逻辑的位,便会自动在位流中插入一个相反电平的补码位。接收器会自动删除这个插入的填充位。
数据帧或远程帧的剩余位域(CRC界定符、应答域和帧结尾域)形式固定,不填充;错误帧和过载帧也不填充。
作用
①CAN网络同步需要足够多的上升沿,这是CAN协议规定位填充的目的之一。
②确保数据帧不会被当作错误帧(由6个连续的显性或隐性位组成)、确保正确识别帧结束标志(7个连续隐性位)。
2.5 位定时与采样点
以1Mbps的传输速率为例,则速率的周期为1000ns,即CAN总线每传输一位数据需要1000ns的时间周期。但是CAN总线数据传输有一定的延时,因此必须合理考虑每一位数据的采样点位置,以满足延时的要求。下图是CAN总线网络通信的位定时与采样示意图,其中位时间为1000ns。
如图所示,CAN总线中每一位数据由四部分构成:同步段、传播段、相位缓冲段1、相位缓冲段2。
同步段:用于总线各个节点之间的同步。
传播段:用于补偿信号的物理传播延时。
相位缓冲段1 && 相位缓冲段2:用于补偿信号沿的相位误差,以便更精确地进行采样,类似于建立时间和保持时间。
3 CAN总线工作原理
①CAN总线没有主从节点之分,所有CAN总线上的节点都是地位等价的。当CAN总线上的一个节点发送数据时,它以报文的形式广播给网络中的而所有节点;这样对于每个节点来说,无论数据是否发给自己,都对其进行接收。
②CAN总线每组报文开头的11位字符为标识符,定义了报文的优先级;在同一个总线中,标识符是唯一的,不可能有两个节点发送具有相同标识符的报文。当然接收节点也会根据标识符来判断是否接收这帧信息,一般称这项技术为报文滤波技术。
③CAN总线接收节点可以通过远程数据请求发送远程帧请求发送节点发送相应的数据,回应节点传送的数据帧与请求数据的远程帧具有相同的标识符。
④CAN总线的优先权由发送数据报文中的标识符决定报文占用总线的优先权;标识符越小,优先权越高。
⑤CAN总线的仲裁机制:只要总线空闲,任何节点都可以向总线发送报文。如果有两个或两个以上的节点同时发送报文,就会引起总线访问碰撞。通过使用标识符逐位仲裁可以解决这个碰撞问题。而且当具有相同标识符的数据帧和远程帧同时发送时,数据帧优先于远程帧。
⑥目前CAN总线通信协议仅仅包括OSI七层互联参考模型中的数据链路层和物理层。
处理数据流程如下: