首页天道酬勤can总线帧结构,CAN帧一直重发

can总线帧结构,CAN帧一直重发

张世龙 05-12 21:44 83次浏览

1 .在发送错误帧的帧结构消息时,如果总线上的节点检测到错误,则所述节点发送错误帧以通知总线上的节点他/她自己发生了错误。

错误帧由错误标志和错误修饰符两部分组成。

活动错误标志: 6个连续的显性位;

被动错误标志: 6个连续的隐性位

错误标记: 8个连续的隐藏位。

可以看到错误标志之后重叠了0~6位的错误标志。 这个段落最低有0位,最多有6位。 这一段是如何形成的,将在后面叙述。

2 .错误帧检测2.1比特填充原则在理解CAN总线上的错误检测之前,首先需要了解什么是比特填充。

CAN协议规定,如果相同极性的电平持续5位,则添加极性相反的位。

对于发送节点:

当发送数据帧和遥控器帧时,如果sof到CRC (除CRC定界符之外)之间的比特流的相同极性的电平持续5个比特,则在下一个比特中插入与前5比特相反的电平;对于接收节点:

接收数据帧和远程帧时,如果sof~CRC(CRC定界符除外)之间的比特流的相同极性级别持续5位,则必须删除以下位进行接收:

注意:填充位的添加和删除由发送节点和接收节点完成,CAN-BUS只负责发送,不操作信号。

3 .错误帧类型在CAN总线通信中,有位错误、ACK错误、填充错误、CRC错误、格式错误5种错误。

3.1位错误节点将自己发送到总线的电平与同时从总线读取的电平进行比较,如果发现两者不匹配,则节点检测位错误。

实际上,“发布的电平与从总线读取的电平不匹配”是指节点在总线上发布隐性位,从总线读取显性位,或者节点在总线上发布显性位,从总线读取隐性位

Tips:有三个非位错误的异常。

在仲裁区域中,节点将隐性位发送到总线,但是返回到显性位进行读取,以便如果不被认为是位错误,那么该节点指示仲裁失败;

在ACK时隙中,节点向总线发送了隐性位,但是读取显性位,并不将其视为比特错误。 这表明所述节点当前正在发送的帧消息被至少一个其它节点正确地接收到;

该节点发送被动错误标志,而节点Node_A连续将六个隐性位(被动错误标志)发送给总线,但返回显性位,不被视为位错误。 由于被动错误标志是六个连续的隐性比特,因此在总线上,线路和机制可能使这六个连续的隐性比特“侵蚀”到从其他节点发送的显性水平;

3.2根据确认错误CAN协议的规定,在发送了一帧消息(数据帧或远程帧)之后,接收节点Node_B成功接收该帧的消息接收节点Node_B通过在与该帧的消息ACK时隙相对应的时间跨度向总线发送显性比特以响应发送节点node,从而在ACK时隙时间里从总线读取显性比特。 因此:

如果发射节点Node_A在ACK时隙时间未返回到显性位,则发射节点Node_A检测到ACK响应错误。 这意味着没有节点成功接收到帧消息。

3.3在连续检测到6个同性比特(数据帧远程控制帧的SOF~CRC序列)时,需要执行填充错误比特填充原则,即检测到一个填充错误

3.4 CRC错误发送节点Node_A在发送数据帧或远程帧时计算该帧消息的CRC序列。 如果接收节点Node_B在接收消息时也运行相同的CRC算法,并且如果接收节点Node_B计算出的CRC序列值与来自发送节点Node_A的CRC序列值不匹配,则接收节点将检测到CRC错误。

3.5在格式错误1帧的消息发送期间,如果在必须发送规定值的区域检测到不正确的值,则检测出格式错误。

CAN消息中具有规定值的区域如下。

数据帧和远程帧的CRC修饰符、ACK修饰符、EOF; 错误帧定界符过载帧定界符4 .错误通知前一节描述了CAN通信有五种错误,介绍了在什么情况下可以检测到这些错误,检测到错误后,检测到错误的节点向总线发送错误帧,在总线上

某些错误帧具有主动错误标志和被动错误标志。 此外,错误标志重叠部分的字节数也不同。 问题如下。

什么时候发送带有活动错误标记的错误帧;

什么时候发送带有被动错误标志的错误帧;

在什么时候发送错误帧;

错误标记重叠的部分是如何形成的;

4.1节点错误状态根据CAN协议的规定,CAN总线上的节点始终处于以下三种状态之一:

活动错误状态

被动错误状态

关闭状态

当满足一个条件时,节点可以从一个状态转变到另一个状态。

1)主动错误状态

节点在活动错误状态下可以正常通信;

处于活动错误状态的节点(接收节点或发送节点)在检测到错误时发出活动错误标志。2)被动错误状态

节点在被动错误状态下可以正常通信;


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

⚠️注意:这里说处于主动错误状态或被动错误状态的节点仍然可以正常通信,这里的正常通信指的是:节点仍然能够从总线上接收报文,也能够竞争总线获胜后向总线上发送报文。但是不代表接收的报文一定正确也不代表一定能正确的发送报文。
3)总线关闭状态
节点处于总线关闭状态,那么该节点不能收发报文;
处于总线关闭状态的节点,只能一直等待,在满足一定条件的时候,再次进入到主动错误状态。

4.2 错误状态的转换

现在我们知道:
处于主动错误状态的节点在检测到错误时会发送带有主动错误标志的错误帧;
处于被动错误状态的节点在检测到错误时会发送带有被动错误标志的错误帧。
那么一个CAN节点在什么情况下处于主动错误状态,什么情况下处于被动错误状态呢?
根据CAN协议的规定,在CAN节点内,有两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。
⚠️注意:这两个计数器计得不是收发报文的数量,也不是收发错误帧的数量。TEC和RCE计数值的变化,是根据下表的规定来进行的

CAN节点错误状态的转换,就是基于这两个计数器来进行的。

可以看出,节点错误状态的转换就是一个“量变”到“质变”的过程:
1) 主动错误状态
最开始TCE和REC都小于127时,就处于主动错误状态。
在这一状态下,节点检测到一个错误就会发送带有主动错误标志的错误帧,因为主动错误标志是连续六个显性位,所以这个时候主动错误标志将会“覆盖”掉总线上其它节点的发送,而之前在CAN总线上传输的报文就被这“六个连续显性位”破坏掉了。
如果发出主动错误帧的节点是发送节点,这个情况下就相当于:刚刚发送的那一帧报文我发错了,现在我破坏掉它(发送主动错误帧),你们不管收到什么都不算数;
如果发出主动错误帧的节点是接收节点,这个情况就相当于:刚刚我收报文的时候发现了错误,不管你们有没有发现这个错误,我现在主动站出来告诉大家这个错误,并把这一帧报文破坏掉(发送主动错误帧),刚才你们收到的东西不管对错都不算数了。
Tips: 处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它自己遇到,正是因为这一点,整个总线才相信它报告的错误,允许它破坏掉发送中的报文,也就是将这一次的发送作废。
2)被动错误状态
如果某个节点发送错误帧的次数较多,必将使得TCE>127 或者 REC>127,那么该节点就处于被动错误状态。

在这一状态下,节点Node_A检测到一个错误就会发送带有被动错误标志的错误帧,因为被动错误标志是连续六个隐性位,所以这个时候总线上正在传输的报文位流不会受到该被动错误帧的影响,其它的节点该发送的发送,该接收的接收,没人搭理这个发送被动错误帧的节点Node_A。

如果发出被动错误帧的节点Node_A为报文的发送节点,那么在发送被动错误帧之后,刚刚正在发送的报文被破坏,并且Node_A不能在错误帧之后随着连续发送刚刚发送失败的那个报文\。随之而来的是帧间隔,并且连带着8位隐性位的 “延迟传送” 段;这样总线电平就呈现出连续11位隐性位,总线上的其它节点就能判定总线处于空闲状态,就能参与总线竞争 。此时如果Node_A能够竞争成功,那么它就能接着发送,如果竞争不能成功,那么就接着等待下一次竞争。这种机制的目的正是为了让其它正常节点(处于主动错误)优先使用总线。
Tips: 处于被动错误状态,说明这个节点目前是不太可靠的,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能仅仅只有它自己遇到,正是因为这一点,整个总线才不信任它报告的错误,从而只允许它发送六个连续的隐性位,这样它才不会拖累别人。
3)总线关闭状态
如果一个处于被动错误状态的节点,仍然多次发送被动错误帧,那么势必导致TEC > 255,这样就处于总线关闭状态。
在总线关闭状态下的节点Node_A不能向总线上发送报文,也不能从总线上接收报文,整个节点脱离总线。等到检测到128次11个连续的隐性位时,TEC和REC置0,重新回到主动错误状态。

按照我的理解这个所谓“检测到128次11个连续隐性位”其实就是让这个节点隔离一段时间冷静下,因为它一旦处于总线关闭状态,就不会和总线有任何的联系,这个时候只要它计算时间等于达到传送128次11个连续隐性位所用的时间,就可以重新连到总线上。

⚠️注意: 处于总线关闭状态说明,这个节点目前挂掉了,总线先把它踢开,这样它才不会拖累别人,等到它冷静一段时间之后再回到总线上。

4.3 错误帧的发送

在检测到错误之后,什么时候发送错误帧呢?
按照CAN协议的规定:

位错误、填充错误、格式错误、ACK错误。 在错误产生的那一位的下一位开始发送错误帧。

CRC错误 紧随ACK界定符后的位发送错误帧

例子1:

(1)发送节点Node_A发送一个显性位,但是却从总线上听到一个隐形位,于是Node_A节点就会检测到一个位错误;
(2)Node_A检测到位错误之后,立即在下一位开始发送主动错误帧:6个连续显性位的主动错误标志+8个连续隐性位的错误界定符;
(3)对应Node_A发出的主动错误标志,总线上电平为6个连续显性位;
(4)接收节点Node_B和Node_C从总线上听到连续6个显性位,那么就会检测到一个填充错误,于是这两个节点都会发送主动错误帧;
(5)对应Node_B和Node_C发出的主动错误标志,总线电平又有6个连续显性电平,对应Node_B和Node_C发出的错误界定符,总线电平有8个连续的隐性电平。
(6)在间歇场之后,Node_A节点重新发送刚刚出错的报文。

例子2:

从上图中可以看出错误帧之中,错误标志重叠部分是怎样形成的,这个例子中,位错误的错误标志与填充错误的错误标志重叠两位,剩下的部分还有四位:

成为C语言高手的书籍,单总线协议C语言版 二总线,平台