本文主要是介绍3 CAN错误帧、过载帧、帧间隔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、错误帧、过载帧、帧间隔的格式
这三种帧的格式远比数据帧简单,但它背后的机制比较复杂,需要重点掌握,详细的机制后面讲,先看每种帧的格式。
1、错误帧
当节点检测到总线上有错误出现时,会发送一包错误帧。格式如下图所示:
(1)错误标志
错误标志分为两类:主动错误标志和被动错误标志。
主动错误标志为6个显性电平,被动错误标志为6个隐性电平。
(2)错误界定符
错误界定符为8个隐性电平。
但实际使用中错误帧的格式一般如下所示,在错误标志后面,可能还会有0~6位的错误标志重叠。原因后续再讲。
2、过载帧
当节点正在忙,却检测到总线上有数据在发送,则会发送一包过载帧,格式如下图所示:
(1)过载标志
过载标志为6个显性电平。
(2)过载界定符
过载界定符为8个隐性电平。
同样的,实际使用中过载帧的格式一般如下所示,在过载标志后面,可能还会有0~6位的过载标志重叠。
3、帧间隔
当需要连续发送多个数据帧时,需要在每帧之间加一包帧间隔。帧间隔有两种形式,
主动错误状态:间隔段+空闲段。
被动错误状态:间隔段+暂停段+空闲段。
(1)间隔段
间隔段为3个隐性电平
(2)暂停段
只出现在被动错误状态,为8个隐性电平。
(3)空闲段
空闲段就是总线的空闲状态,即隐性电平,个数无所谓。
二、错误种类
CAN之所以有很强的可靠性,离不开它的错误检测机制,CAN总线一共有5中错误:
1、位错误
节点将自己发送到总线上的电平与从总线上读回的电平进行比较,如果二者不一致,则产生位错误。
不过有3种例外不属于位错误:
(1)在仲裁区,节点发送隐性位却读到显性位,表示该节点仲裁失败,故不认为是位错误。
(2)ACK标记,发送节点的ACK标记为隐性电平,如果某个节点成功接收到数据并CRC校验成功,则该位被接收节点拉为显性电平,故不认为是位错误。
(3)节点发送被动错误帧的错误标志时,该标志为6个隐性电平,很有可能因为“线与”的特性,被其他节点的电平线与,而读到显性电平,故不认为是位错误。
2、ACK错误
节点发送隐性电平的ACK标记后,如果某个节点成功接收数据,该接收节点会把ACK标记拉为显性电平,如果在ACK标记时间段内,发送节点没有读到显性电平,则产生ACK错误。
3、填充错误
CAN有一个特殊的同步机制,它利用了传输数据的电平跳变进行节点间的时钟同步,但是如果电平一直不跳变怎么办?所以CAN引入了填充机制,CAN规定,当相同极性的电平持续5位时,则添加一个极性相反的位。这样就能保证最大不会超过5位,节点间就能进行一次时钟同步。
对于发送节点,在发送数据帧和遥控帧时,在SOF~CRC之间的位(包含SOF,不包含CRC界定符),如果相同极性的电平持续5位,那么插入一位极性相反的电平。
对于接受节点,在接受数据帧和遥控帧时,在SOF~CRC之间的位,如果接受到相同极性的电平持续5位,那么删除接收到的下一个位。
如下图所示:
所以节点检测到总线上的数据帧和遥控帧的SOF~CRC之间出现连续6个极性相同的电平时,产生填充错误。
4、CRC错误
发送节点和接收节点均会对数据帧和遥控帧的SOF~Data段的位(包含SOF)进行CRC校验,如果两个节点计算的CRC不一致,则接收节点产生CRC错误。
5、格式错误
每种帧都会存在已经有预定值的区域,如果节点检测到这些区域与预定值不同,则产生格式错误。
有预定值的区域:数据帧和遥控帧的CRC界定符、ACK界定符、EOF;错误帧界定符;过载帧界定符。
三、节点错误状态
对每一节点,它总是处于如下三种状态之一:主动错误状态、被动错误状态、总线关闭状态。它们的转换关系如下图所示:
每个节点,都有两个计数器:TEC,发送错误计数器;REC,接收错误计数器。可以发现,状态之间的扭转,主要靠TEC和REC这两个值,这两个值的变化主要如下表所示。一定要注意,这两个计数器不是计收发报文的数量,也不是收发错误帧的数量。
1、主动错误状态
节点初始化完毕后,进入主动错误状态,在该状态下,一旦检测到错误,则会发送主动错误状态的错误帧。
如果发送节点检测到错误,则之前的帧会先停止发送,再发出主动错误帧,表示之前的帧有错误,被主动破坏掉。因为主动错误标志是6个显性电平,根据线与特性,总线上一定会出现6个显性电平,这就使得接收节点会检测出位填充错误,因为每5个连续相同极性的电平必须要跟一个极性相反的电平。当错误帧发送完毕后,需要发送主动错误状态下的帧间隔。
如果接受节点检测到错误,它会直接发送主动错误帧,表示当前发送节点发送的帧有错误,同时因为线与特性,正在发送的帧也会被破坏掉。同时其他的接收节点也会检测到填充错误。
如下图所示,发送节点检测到位错误,它会直接产生主动错误帧,同时其他的接收节点因为主动错误标志,检测到填充错误,也会产生主动错误帧,最后,他们在总线上产生的错误帧的主动错误标志由6个隐性电平,直接扩大到了12个,这就是错误标志重叠区的由来。当主动错误帧发送完毕,会紧跟着一个帧间隔,因为这是主动错误状态,故帧间隔只有间隔段。显然,错误帧的错误界定符的8个显性电平+帧间隔的间隔段的3个显性电平,总线上共出现了连续11个显性电平,总线进入空闲状态。
下图展示了另一种报错误帧的情况,发送节点检测到位错误,产生错误帧,然后接收节点产生填充错误帧,此时,错误标志重叠区由6位扩展到了10位。
处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它自己遇到,正是因为这一点,总线才相信它报告的错误,允许它破坏掉发送中的报文。
2、被动错误状态
在主动错误状态下,如果节点的TCE>127或者REC>127,它就会进入被动错误状态。在该状态下,一旦检测到错误,则会发送被动错误状态的错误帧。
如果发送节点检测到错误,则之前的帧会先停止发送,再发出被动错误帧,表示之前的帧有错误,被主动破坏掉。但因为被动错误标志是6个隐性电平,它不会影响总线上的电平。错误帧结束后,要发送被动状态下的帧间隔,它包含间隔段和暂停段,因为间隔段+暂停段是连续11个隐性电平,故总线进入空闲状态。其他的节点可以参与总线仲裁。
如果接收节点检测到错误,它会直接发送被动错误帧,表示当前发送节点发送的帧有错误,同样的,也不会影响总线上的电平,发送节点会接续发送,其他的接收节点也会继续接收。
之所以有被动错误状态,说明这个节点目前是不太可靠的,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能仅仅只有它自己遇到,正是因为这一点,总线才不信任它报告的错误,从而只允许它发送六个连续的隐性位,这样它才不会拖累其他节点。
3、总线关闭状态
在被动错误状态下,如果节点的TEC > 255,它就会进入总线关闭状态。在总线关闭状态下的节点不能向总线上发送报文,也不能从总线上接收报文,整个节点脱离总线。等到检测到128次11个连续的隐性位时,TEC和REC置0,重新回到主动错误状态。
四、错误帧
有关错误帧的使用的机制,上面几节基本上已经讲完了。还剩下错误帧的发送时机。
当节点检查到位错误、填充错误、格式错误、ACK错误时,会在错误产生的下一位马上开始发送错误帧。
当节点检查到CRC错误时,会在ACK界定符之后发送错误帧。
五、过载帧
当某个节点没有做好接收下一帧数据的准备时,会发送过载帧。
过载帧的过载标志为6个显性电平,显然会直接屏蔽其他节点发送的数据,导致填充错误,强制令发送节点停止发送。
一般情况下,会有3中情况引起过载帧:
(1)接收节点自身原因,接收节点因为某种原因需要延迟接收下一包数据帧或者遥控帧。
(2)在帧间隔的间隔段的前两位检测到显性电平,因为正常的间隔段是3个隐性电平,如果突然检测到显性电平,一般是数据帧的SOF,这说明有节点想要发送数据,但CAN规定,此时不允许有其他节点发送报文,故要发送过载帧,破坏发送节点的数据,推迟发送。
(3)在错误界定符或过载界定符的第8位,检测到显性电平,同样的道理,此时也是不允许其他节点发送数据,故要发送过载帧。
六、帧间隔
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。如下图所示
它能够避免处于被动错误状态的节点长期占用总线,保证主动错误节点优先发送。
这篇关于3 CAN错误帧、过载帧、帧间隔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!