CAN总线之CAN的报文格式

(来自博客:http://blog.csdn.net/maifansnet/article/details/51417148)

一、帧

CAN协议的报文传输主要由下面的4种帧来实现:
数据帧:从发送端携带数据到接收端。
远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。
错误帧:任何单元检测到一总线错误就发出错误帧。
过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。

同时帧间空间用来间隔数据帧/远程帧与其他帧。

1.数据帧


一个完整的数据帧有7部分组成,依次为帧起始(SOF)、仲裁场(Arbitration Field)、控制场(Control Field)、数据场(Data Field)、CRC场、应答场(ACK Field)、帧结尾(EOF)。

帧起始是数据帧和远程帧开始的标志,它是一个显性位。一个CAN节点只有在总线处于空闲状态时才可以发送帧起始。


仲裁场在帧起始之后,控制场之前,共12位(注:协议的讲解以CAN2.0A为基础[3],CAN2.0B版本的仲裁场为32位[4])分为两部分11位的标识符和1位的远程发送请求位(RTR)。在数据帧中RTR为显性,在远程帧中RTR为隐性。所以如果相同标识符的数据帧与远程帧发生冲突,数据帧优先。


仲裁场之后便是控制场。控制场的头两位为保留位,为隐性。后面是数据长度代码(DataLengthCode)。数据长度代码指示了数据场中字节的个数。数据长度的大小在DLC的表示。
DLC最大为8。
对于超出8的情况,各厂家有不同的实现。有的实现忽略“越界”DLC,传输8 bytes的数据和“错误”的DLC。有的传输8 bytes的数据并改DLC为8。有的直接不传输任何东西。
数据场在控制场之后,传输数据的长度由DLC决定。如果DLC为0,则没有数据场。数据场中高位先传输。

CRC场在控制场和数据场之后,由CRC序列和界定符组成。CRC序列是帧起始,仲裁场,控制场和数据场组成的位流的CRC校验值。其中CRC校验的生成多项式为X15+ X 14+ X10+ X8+ X7+ X4+ X3+ 1。CRC序列之后是一个“隐性”CRC结束符。


CRC场之后便是应答场。应答场由2个位组成,应答位和应答结束符。发射单元会发送“隐性”的应答位和应答结束符至总线上。而接收单元如果接收到的数据都是有效的,会在发射单元发送应答位的同时发送一个“显性”位至总线上,所以一个有效的数据帧,应答位在总线上应该表现为“显性”。

数据帧的最后为帧结尾,由7个连续的“隐性”位组成。

2.远程帧

远程帧的主要作用是向其他的CAN节点发送数据请求,发送相同标识符的数据帧。与数据帧相比,远程帧的RTR位是隐性的,而且没有数据场。DLC中的值是数据帧的数据长度。

3.错误帧


错误帧由错误标志的叠加和结束符组成。
错误标志有主动错误标志与被动错误标志。主动错误标志为6个显性位,被动错误标志为6个隐性位。
错误主动节点与错误被动节点(参考“CAN节点的错误状态”)对错误的反应是不一样的。

当错误主动节点检测到错误时,会发送主动错误标志。而主动错误标志又会影响总线上原有传输内容的结构,从而让其他未检测到错误的节点发现错误。一种情况是错误帧破坏了应答场和帧结尾的固有形式;另一种情况是错误帧破坏了位填充规则。当其他节点发现错误后,也会发送错误帧。这样就会造成一个错误标志的叠加会有6-12bits大小。


上图演示了第二种情况时的各个节点发送错误帧的情况。节点1首先检测到错误,发送错误帧,在连续发送了6个显性位之后,节点2和3检测到位填充错误,也发送错误帧。这样总线上错误帧的叠加就达到了12位。

所有节点发送完错误标志之后就会发送一个隐性位,并监控总线,直到总线上出现一个隐性位。然后在发送7个隐性位。这样一个错误帧就发送完毕了。

4.过载帧


过载帧与主动错误帧非常类似,特别是位的组成和全局化的过程。主要的差别在于错误帧发生着数据帧,远程帧期间。而过载帧发生于间歇字段期间。
过载帧是由过载标志的叠加和过载结束符组成。有两种情况可以触发过载帧:
CAN节点的内部需求,例如需要时间准备数据帧的数据。这种情况下过载帧只允许起始于帧间隔的第一个位。
在帧间隔内侦测到显性位。这种情况下,过载帧起始于检测到显性位的后一位。
过载标志由6个显性位组成,过载帧破坏了间歇字段的结构从而导致了过载帧的全局化。发完过载标志后,CAN节点会往总线发送隐性位,并监控总线直至出现隐性位。然后再发送7个隐性位。

e.帧间空间
数据帧与远程帧的前面必然有帧间空间。对于主动错误节点和被动错误节点,帧间空间的结构稍有不同。对于主动错误节点,帧间空间由3个显性位的间歇字段和总线空闲组成。在间歇字段不允许发送数据帧与远程帧。总线空闲的长度任意,当有显性位时就被认为是帧起始。
被动错误标志除了上边两部分外,在间歇字段之后还有8个显性位的挂起传输。在挂起传输阶段被动错误节点不可以发送数据帧与远程帧。

  • 11
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值