最近在学习CAN总线协议,结合推断,总结了一下CAN总线发生错误和过载时的处理过程。
源发送节点A,接收节点B1,接收节点B2(B泛指所有接收节点),其余节点C(不匹配A发送帧标识符)
1.B1检测到A发送帧的错误后,立刻发送6个显性位,破坏正在发送的帧(B1作为接收端,破坏了A发送的数据),并将错
误帧广播发送到所有节点.(因为错误帧没有段标识指定发送给特定节点,因此为广播方式)。
2.A,B2,C,由于B1发送的6bit显性位,违反了位填充规则或破坏了应答场或帧结束场的固定格式。
3.A,B2,C发送错误标志。(各自的错误计数器增长)
4.A,B,C发送完自身主动发送的6bit显性位后,发送1bit隐性位,等待检测总线为隐性时(表明无节点还在发送错误标志后),随后发送剩余7位的隐性位(错误定界符)。至此,所有节点错误帧发送完毕。
5.等待总线进入空闲状态
6.A节点开始重发。
源发送节点A,接收节点B1(隐性),接收节点B2(显性)(B泛指所有接收节点),其余节点C(不匹配A发送帧标识符)
1.B1检测到A发送帧的错误后,发送6bit的隐性位,不破坏总线数据.其余接收节点依然能正确接收数据.
2.B1在发送隐性错误标志的同时,便一直等待6个具有相同极性的连续位.(即等待其他节点发出的错误标志)。
3.B2作为主动错误节点也检测到A发送数据的错误,发送6bit显性错误标志.(若只有B1作为接收节点,则A由于等待
不到应答,产生ACK错误,发送6bit显性位依然会唤醒B1节点)
4.B1接收到B2发出的6bit连续错误标志后,从无限等待连续位的状态解除.并发送1位隐性标志,随后同主动错误节点一样,等待总线电平为隐形后,发送剩余的7bit错误定界符.
5.A ,C因为B2发送6bit显性位,触发了本节点的错误(错误种类可能不同),将发送错误标识。在发送完成后,按规定发送错误定界符。(各自的错误计数器增长)
6.等待总线进入空闲状态。
7.A节点开始重发数据。
A做为发送节点,在发送过程中,可能检测到的错误种类有: 位错误,ACK错误,填充错误.
1.当B1检测到A发送帧错误的时刻,在SOF-CRC之间,B发送6bit显性位.如A发送的下一位为隐形位,将引起A节点的位错误,A立刻停止
发送数据,转为发送错误帧,首先发送6bit显性位.则这种情况下: B节点的错误标志位 宽为 6 + 1 = 7bit
2.B1检测到A发送帧错误的时刻,在SOF-CRC之间,B发送6bit显性位.如A发送的接下来n位都为显性位,并不会引起A节点的位错误,但是触发了其余的错误判定.
在这种情况下又会有两种分支: 1.在ACK之前,检测到6bit显性位,则A产生填充错误.2.在ACK之前,没有发生填充错误,A节点将产生
ACK错误.即破坏了应答场的固定格式.
在这种情况下: B1节点的错误标志位宽: n(1~6)+6 .
3.B1检测到A发送帧错误的时刻在EOF过程中,B1发送显性位,破坏了EOF固定格式,将导致检测到固定格式错误的节点(只有接受节点检测固定格式错误,因此B2将检测到固定格式错误,A将检测到位错误)发送错误标志.
在这种情况下;B1节点的错误标志位宽:1+6 = 7bit
这也就解释了为什么错误标位总长度为6〜12。
源发送节点A(连续发送),接收节点B,C为其余节点
1.B在接收本帧后,由于自身节点原因,发送过载帧. (过载标志位中自身发送的6位显性位将破坏总线上的数据的传输)
2.A连续发送数据帧,在下次发送前,插入帧间间隔.
3.B发送的过载帧标识,破坏了帧间间隔的固定格式,(在帧间间隔的间歇场,本应该为3bit隐形位,当B发送过载表示后,检测到第1,2bit为显性. 即标识一次过载).A.C发送过载标志.
4.B发送6bit显性位后,发送1bit隐性位,等待总线检测为隐性后(此时表明所有的节点已经发送完自身的6bit过载位),发送剩余的7bit过载界定符.
5.AC在发送完自身的6bit过载标识后,同B行为相同.
1.B在接收本帧后,由于自身节点原因,发送过载帧.(过载标志位中自身发送的6位显性位将破坏总线上的数据的传输)
2.A为单次发送,发送完本帧数据后,进入监听状态,因此不在总线上插入帧间间歇.(也即无法判定帧过载条件)
3.A,C无法识别B的过载标志,(和错误标志区分,错误检测时在帧发送期间,而过载检测在帧间间歇.),此时总线也不为空闲状态,
AC并不对B的过载帧做出响应.
在发送显性位的这段时间,B占有总线,为B处理数据争取了时间。
需要注意:
1.数据帧和远程帧有起始位,错误帧,过载帧不含起始位.
2.固定格式错误中,帧结束场格式错误,指检测到隐形电平后,发送连续7bit隐形位的格式被显性位破坏.