CAN总线在硬件系统中占有一席之地,是国际上应用最广泛的现场总线之一,与我们收藏过的SPI、UART不同,属于“高端高效”系列。
什么是CAN总线?
嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,像机器人、工业、自动控制系统中,都有广泛的应用。随着国家对海防的越来越重视,对CAN的需求也会越来越大。
概述
CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。
想到CAN就要想到德国的Bosch公司,因为CAN就是这个公司和Intel于80年代末开发的。
CAN有很多优秀的特点,使得它能够被广泛的应用。比如:传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构。
近些年来,CAN控制器价格越来越低,很多MCU也集成了CAN控制器。现在每一辆汽车上都装有CAN总线。
一个典型的CAN应用场景:
图1. 一个典型的CAN应用场景
CAN总线标准
CAN总线标准只规定了物理层和数据链路层,需要用户自定义应用层。不同的CAN标准仅物理层不同。
图2. CAN总线标准
CAN收发器负责逻辑电平和物理信号之间的转换。
将逻辑信号转换成物理信号(差分电平),或者将物理信号转换成逻辑电平。
CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。
图3-1. ISO11898高速CAN电平 图3-2. ISO11519-2低速CAN电平
高低电平幅度低,对应的传输速度快;
图4. CAN标准比对
*双绞线共模消除干扰,是因为电平同时变化,电压差不变。
物理层
CAN有三种接口器件:
多个节点连接,只要有一个为低电平,总线就为低电平,只有所有节点输出高电平时,才为高电平。所谓”线与”。
CAN总线有5个连续相同位后,就插入一个相反位,产生跳变沿,用于同步。从而消除累积误差。
和485、232一样,CAN的传输速度与距离成反比。
CAN总线的终端电阻的接法如下图5所示:
图5. 低速/高速 CAN-bus终端电阻接法
增加终端电阻的目的是为了增强CAN通讯的可靠性,消除CAN总线终端信号反射干扰。
Note: 一般如果CAN总线使用的是在双绞线上运行,这时我们会增加120Ω的电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。
数据链路层
CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。
数据帧用来节点之间收发数据,是使用最多的帧类型;远程帧用来接收节点向发送节点接收数据;错误帧是某节点发现帧错误时用来向其他节点通知的帧;过载帧是接收节点用来向发送节点告知自身接收能力的帧;用于将数据帧、远程帧与前面帧隔离的帧。
CAN的报文格
在总线中传送的报文,每帧由7部分组成。CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位。
在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位(RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。
控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (RO),为将来扩展使用。它的最后四个位用来指明数据场中数据的长度(DLC)。数据场范围为0~8个字节,其后有一个检测数据错误的循环冗余检查(CRC)。
应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。
报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。
如图6所示,具体某一位或某几位下面会详细介绍。
图6. CAN总线报文结构
数据帧
数据帧根据仲裁段长度不同分为标准帧(2.0A)和扩展帧(2.0B)。
数据帧是由:帧起始,仲裁断,控制端,数据段,CRC段,ACK段和帧结束构成。如图7所示。
图7. 数据帧类型及结构
帧起始和帧结束
帧起始:由单个显性位(低电平)组成,总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。
帧结束:由7个连续的隐形位(高电平)组成。
(注:显性电平和隐性电平是相对于CAN_H和CAN_L而言的差分信号电平,并非TTL电平上的高低电平,需要注意)如图8所示。
图8. 帧起始和帧结束
仲裁段
CAN-bus是如何解决多个节点同时发送数据,即总线竞争的问题?该问题由仲裁段给出答案。
CAN-bus并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本不同,帧ID分为11位和29位两种。如图9所示:
图9. 数据帧结构
如图10所示CAN控制器在发送数据的同时监测数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。
图10. 仲裁处理
假设节点A、B和C都发送相同格式相同类型的帧,如标准格式数据帧,它们竞争总线的过程如图11所示:
图11. 仲裁机制
从该分析过程得出结论是:帧ID值越小,优先级越高;
对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。由于数据帧的RTR位为显性电平,远程帧为隐性电平,所以帧格式和帧ID相同的情况下,数据帧优先于远程帧;由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐形电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
控制段
控制段共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成如图12所示。
图12. 数据帧结构
数据段
一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合如图13所示。
图13. 数据段
数据量小,发送和接收时间短,实时性高,被干扰的概率小,抗干扰能力强。
CRC段
CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。 CRC校验段由15位CRC值和1位CRC界定符构成如图14所示。
图14. CRC段
ACK段
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平如图15所示。
图15. ACK段
远程帧
与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)如图16所示。
图16. 远程帧结构
如下图所示由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平。
所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高如图17所示:
图17. 数据帧于远程帧仲裁机制
数据帧与远程帧的区别如图18所示。
图18. 数据帧远程帧比较
错误帧
尽管CAN-bus是可靠性很高的总线,但依然可能出现错误;CAN-bus的错误类型共有5种(如图19所示)。
图19. 错误帧类型
当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识如图20所示。
图20. 错误帧电平结构
为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态及其行为如图21所示。
图21. 错误帧处理机制
(注:这些错误处理的机制是由硬件自主完成的这样做的目的就是只要CAN在收到数据肯定是正确的数据)。
过载帧
当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成如图22所示。
图22. 过载帧结构
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象如图23所示。
图23. 过载帧具体结构
帧间隔
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
帧间隔过后,如果无节点发送帧,则总线进入空闲。
帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧。
CAN总线发送总流程
CAN-bus整个链路层处理数据的流程是如图24所示:
图24. CAN总线发送总流程
系列回顾:
参考资料:
https://www.cnblogs.com/jacklu/p/4729638.html
https://blog.csdn.net/liuligui5200/article/details/79030676
项目驱动–CAN-BUS现场总线基础教程—-周立功,黄晓清
现场总线技术及其应用第二版–清华大学出版社
扫描上图二维码可直达课程页面,马上试听
往期精彩:
理解UVM-1.2到IEEE1800.2的变化,掌握这3点就够