CAN与CANOpen(一)基本概念
3.3帧
CAN协议的报文传输主要由下面的4种帧来实现:
- 数据帧:从发射端携带数据到接收端。
- 远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。
- 错误帧:任何单元检测到一总线错误就发出错误帧。
- 过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。
同时帧间空间用来间隔数据帧/远程帧与其他帧。
3.3.1数据帧
图6数据帧
图7图例
图6是一个数据帧的示意图。其中绿色标识隐性,黑色表示显性,黄色标识显性或隐性(图7),以下相同。
一个完整的数据帧有7部分组成,依次为帧起始(SOF)、仲裁场(Arbitration
Field)、控制场(Control Field)、数据场(Data
Field)、CRC场、应答场(ACK
Field)、帧结尾(EOF)。
帧起始是数据帧和远程帧开始的标志,它是一个显性位。一个CAN节点只有在总线处于空闲状态时才可以发送帧起始。
图8仲裁场
仲裁场在帧起始之后,控制场之前,共12位(注:协议的讲解以CAN2.0A为基础[3],CAN2.0B版本的仲裁场为32位[4])分为两部分11位的标识符和1位的远程发送请求位(RTR)。在数据帧中RTR为显性,在远程帧中RTR为隐性。所以如果相同标识符的数据帧与远程帧发生冲突,数据帧优先。
图9控制场与数据场
仲裁场之后便是控制场。控制场的头两位为保留位,为隐性。后面是数据长度代码(DataLengthCode)。数据长度代码指示了数据场中字节的个数。图10说明了数据长度的大小在DLC的表示。
图10数据长度代码
DLC最大为8。
对于超出8的情况,各厂家有不同的实现。有的实现忽略“越界”DLC,传输8
bytes的数据和“错误”的DLC。有的传输8
bytes的数据并改DLC为8。有的直接不传输任何东西。
数据场在控制场之后,传输数据的长度由DLC决定。如果DLC为0,则没有数据场。数据场中高位先传输。
图11 CRC场
CRC场在控制场和数据场之后,由CRC序列和界定符组成。CRC序列是帧起始,仲裁场,控制场和数据场组成的位流的CRC校验值。其中CRC校验的生成多项式为X15+
X 14+ X10+ X8+
X7+ X4+ X3+
1。CRC序列之后是一个“隐性”CRC结束符。
图12应答场与帧结尾
CRC场之后便是应答场。应答场由2个位组成,应答位和应答结束符。发射单元会发送“隐性”的应答位和应答结束符至总线上。而接收单元如果接收到的数据都是有效的,会在发射单元发送应答位的同时发送一个“显性”位至总线上,所以一个有效的数据帧,应答位在总线上应该表现为“显性”。
数据帧的最后为帧结尾,有7个连续的“隐性”位组成。
3.3.2远程帧
图13远程帧
远程帧的主要作用是向其他的CAN节点发送数据请求,发送相同标识符的数据帧。与数据帧相比,远程帧的RTR位是隐性的,而且没有数据场。DLC中的值是数据帧的数据长度。
3.3.3错误帧
图14错误帧
错误帧由错误标志的叠加和结束符组成。
错误标志有主动错误标志与被动错误标志。主动错误标志为6个显性位,被动错误标志为6个隐性位。
错误主动节点与错误被动节点(参考“CAN节点的错误状态”)对错误的反应是不一样的。
当错误主动节点检测到错误时,会发送主动错误标志。而主动错误标志又会影响总线上原有传输内容的结构,从而让其他未检测到错误的节点发现错误。一种情况是错误帧破坏了应答场和帧结尾的固有形式;另一种情况是错误帧破坏了位填充规则。当其他节点发现错误后,也会发送错误帧。这样就会造成一个错误标志的叠加会有6-12bits大小。
图15本地错误的全局化
图15就演示了第二种情况时的各个节点发送错误帧的情况。节点1首先检测到错误,发送错误帧,在连续发送了6个显性位之后,节点2和3检测到位填充错误,也发送错误帧。这样总线上错误帧的叠加就达到了12位。
所有节点发送完错误标志之后就会发送一个隐性位,并监控总线,直到总线上出现一个隐性位。然后在发送7个隐性位。这样一个错误帧就发送完毕了。
3.3.4过载帧
图16过载帧
过载帧与主动错误帧非常类似,特别是位的组成和全局化的过程。主要的差别在于错误帧发生着数据帧,远程帧期间。而过载帧发生于间歇字段期间。
过载帧是由过载标志的叠加和过载结束符组成。有两种情况可以触发过载帧:
- CAN节点的内部需求,例如需要时间准备数据帧的数据。这种情况下过载帧只允许起始于帧间隔的第一个位。
- 在帧间隔内侦测到显性位。这种情况下,过载帧起始于检测到显性位的后一位。
过载标志由6个显性位组成,过载帧破坏了间歇字段的结构从而导致了过载帧的全局化。发完过载标志后,CAN节点会往总线发送隐性位,并监控总线直至出现隐性位。然后再发送7个隐性位。
3.3.5帧间空间
图17 主动错误节点的帧间空间结构
图18被动错误节点的帧间空间结构
数据帧与远程帧的前面必然有帧间空间。对于主动错误节点和被动错误节点,帧间空间的结构稍有不同。对于主动错误节点,帧间空间由3个显性位的间歇字段和总线空闲组成。在间歇字段不允许发送数据帧与远程帧。总线空闲的长度任意,当有显性位时就被认为是帧起始。
被动错误标志除了上边两部分外,在间歇字段之后还有8个显性位的挂起传输。在挂起传输阶段被动错误节点不可以发送数据帧与远程帧。