详解常用的CAN总线(下):错误帧

接口/总线/驱动

1116人已加入

描述

错误帧种类

错误帧种类分为5种,分别是:位发送错误、ACK错误、位填充错误、CRC错误、格式错误。

CRC校验

位发送错误

节点将自己发送到总线上的电平与同时从总线上回读到的电平进行比较,如果发现二者不一致,那么这个节点就会检测出一个位错误。

实际上所谓“发出的电平与从总线上回读的电平不一致”,指的就是节点向总线发出隐性位,却从总线上回读到显性位或者节点向总线发出显性位,却从总线上回读到隐性位这两种情况。

ACK错误

ACK在ACK段中讲解过,按照CAN协议的规定,发送节点Node_A在一帧报文(数据帧或者遥控帧)发出之后,如果接收节点Node_B成功接收了该帧报文,那么接收节点Node_B就要在该帧报文ACK槽对应的时间段内向总线上发送一个显性位来应答发送节点Node_A。

这样发送节点Node_A就会在ACK槽时间段内从总线上回读到一个显性位。因此:当发送节点Node_A在ACK槽时间段内没有回读到显性位,那么发送节点Node_A就会检测到一个ACK应答错误。这表示没有一个节点成功接收该帧报文,此时CAN总线认为是ACK应答错误。

位填充错误

帧起始到CRC校验之前的物理上电平不允许有6个连续的相同电平,发送器只要检测到位流中有5个连续相同逻辑的位,便会自动在下一位插入一个相反的电平。

CRC校验

从帧起始到CRC之间,接收节点检测到有6个连续相同的位电平时,也就是违反5位相同位插入1位相反位的“位填充”原则;因为ACK域和帧结束域电平固定,也无需填充;帧起始、仲裁域、控制域、数据域以及CRC校验和域,均通过位填充方法编码。

位填充是指:无论何时,发送器只要检测到位流中有5个连续相同逻辑的位,便会自动在位流中插入一个补码位。举例来说,如果连续5个显性位,则在5个显性位之后自动插入1个隐性位,接收器会自动删除这个插入的填充位。

数据帧或远程帧的剩余位域(CRC界定符、应答域和帧结尾域)形式固定,不填充;错误帧和过载帧也不填充。

那么位填充规则的作用是什么呢?原因有两点:

1.CAN网络同步需要足够多的上升沿,这是CAN协议规定位填充的目的之一。

2.确保数据帧不会被当作错误帧(由6个连续的显性或隐性位组成)、确保正确识别帧结束标志(7个连续隐性位)。

CRC错误

发送端送出的CRC序列由发送器算出,接收器执行同样的CRC算法,若计算结果与接收到的CRC序列不符,则认为CRC错误。

帧格式错误

主动错误状态: 处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出主动错误标志。

如果发出主动错误帧的节点是发送节点,这个情况下就相当于:刚刚发送的那一帧报文发错了,现在破坏掉它(发送主动错误帧),你们不管收到什么都不算数;

如果发出主动错误帧的节点是接收节点,这个情况就相当于:刚刚收报文的时候发现了错误,不管你们有没有发现这个错误,现在主动站出来告诉大家这个错误,并把这一帧报文破坏掉(发送主动错误帧),刚才你们收到的东西不管对错都不算数了。

处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它自己遇到,正是因为这一点,整个总线才相信它报告的错误,允许它破坏掉发送中的报文,也就是将这一次的发送作废。

被动错误状态: 错误比较多,很可能错误是人为导致的,通知其他节点有错但是不干扰他们正常收发数据,也不要求重发,同时不能连续发送了,得再插入8位隐性位的“延迟传送”段;这样是为了让其他正常节点(处于主动错误)优先使用总线。

被动错误的节点很可能存在硬件故障,不能让它拖累整个网络;

过载帧:接收节点向总线上其它节点报告自身接收能力达到极限的,可以这样理解:接收节点Node_A接收报文的能力达到极限了,于是Node_A就会发出过载帧来告诉总线上的其它节点(包括发送节点),接收节点Node_A已经没有能力处理你们发来的报文了。

过载帧包括:过载标志和过载界定符两个部分。

过载标志:连续6个显性位。

过载界定符:连续8个隐性位。

与错误帧类似,过载帧中有过载帧重叠部分,且形成过载重叠标志的原因与形成错误帧中的错误重叠标志的原因是相同的。

那么怎么通俗的理解过载帧呢?

接收节点Node_A达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候Node_A通过发送过载帧的方式来破坏其它节点的发送,这样在Node_A发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了,也就是说Node_A在其发送过载帧的这段时间得以“休息”。

帧间隔: 用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。也就是说数据帧(或者远程帧)通过插入帧间隔可以将本帧与先行帧(数据帧、远程帧、错误帧、过载帧)分隔开来。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分