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位,检测到显性电平,同样的道理,此时也是不允许其他节点发送数据,故要发送过载帧。

六、帧间隔

  帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。如下图所示
在这里插入图片描述
  它能够避免处于被动错误状态的节点长期占用总线,保证主动错误节点优先发送。

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值