关于CAN总线的被动错误标志的问题?
4 个回答
谢谢。
挺久没接触相关内容了,我凭印象答一下,不一定对,供参考。
1. 检测到任何错误的情况下发送,比如Bit Error、Stuff Error等,我没记错的话应该是检测到错误的下一位就发送,有特例。
CAN总线有一条设计原则:当节点自身出现错误时,避免干扰其它正常节点的运行。当节点进入Error-Passive时,表明自身已检测到较多次错误且未恢复,但此时从宏观来看,无法确定错误是否由自身导致,因此将其Error Flag缄默掉是符合CAN总线的设计原则的。
(以上原因是我脑补的。)
2. 违反位填充,但未必触发Stuff Error,因为CAN总线具有显性位“吃掉”隐性位的特性。当其它节点仍在正常通信时,Error-Passive节点发送的Error Flag对总线不造成影响;但如果总线上只剩下Error Frame,则能够触发Stuff Error。
CAN总线中主动错误和被动错误的通俗解释
首先建议把广泛使用的“主动错误”和“被动错误”概念换成“主动报错”和“被动报错”。
1. 主动报错站点
只要检查到错误,它立即“主动地”发出错标识。所谓“出错标识“,它本身就是一个“错误的位序列”(连续的6个显性位,不满足CAN协议的“最多5个连续的同性位”要求),目的是“主动地”告诉大家:即使你们没有发现“刚才我已发现”的错误,现在我“以身作则”出错啦!你们该看到这个错误了吧!
2. 被动报错站点
如果检查到错误,它只能干瞪眼“被动地”等别人(主动报错站点)报错,等待的时候它可不能去动总线(发了的隐性错误标志,也不能被总线上其他节点察觉到),直到识别出由主动报错站点发出 的“错误的位序列”,它才松了一口气:有人正式报错了!然后他就可以去竞争总线,该干啥干啥。
3. 出错标识本身没有什么优先级的问题。
4. 对于通过竞争得到总线使用权的发送站点来说,它在一边发一边听,有可能出现以下几种情况:
(a) 它自己就发现错误,它就干脆哗啦哗啦,乱发一气(连续的发六个同性位)。目的就是告诉别人(别的站点):出错了!
(b) 它自己没有发现错误,但作为主动报错的接收站点发现了错误(比如因为线路长,干扰大引起的错误),这个发现错误的站点就会立即哗啦哗啦往总线上乱发一气(连续的发六个显性位)。目的就是告诉你自己以及告诉别人(发送站点和别的站点):出错了!
(c) 它自己没有发现错误,但作为被动报错的接收站点发现了错误(比如因为线路长,干扰大引起的错误),这个发现错误的站点只能慢慢的等待,等待别的主动报错站点报错。如果别的主动报错站点没发现错误,那就继续等,一直等到该发ACK的时候不给发送站发这个显性的ACK信号,当然了其他站点可能会发这个ACK,那说明其他站点没有发生错误,没办法,别人能正常通信,你不能!然后积攒到一定的时候,你就脱离总线吧!再继续等待一段时间,脱胎换骨,重新回到总线上(这个时候错误记录都清0了,你变成了主动报错站!)。
就象你在学校课堂黑板上写字,写错一个笔画你自己没发现,但被别的经常写错字的同学(被动报错站点)发现了,但他不能说,非常尬(老师同学们早不信他了,他自己经常写错字),他就只能等,等老师来发现你的错误(等待主动报错站点报错),但有时候老师没眼力,那他就只能等到老师问大家“他写的对不对”的时候,他不说话表示抗议(不发ACK)(他的抗议没人吊他的),不过老师却主动说你写的对(给你发ACK)!那位同学没办法,只能含着泪默默的在心里记一刀(错误计数+1)继续等,等到他也当老师了(脱胎换骨了)终于看到别人错误的时候,能跳出来叫一声!你丫写错了傻比!...
以上为转自网络,已经找不到源头了,再加上我的一点杜撰,应该比较好理解CAN错误帧这一段了
对于第二个问题,发送出的被动错误标志是六个连续的隐性位,总线上的规则是线与,所以如果还有其他信息发送的话这些隐性位会被盖掉(遇到显性位的话),所以不会引起位填充错误,感觉你问的主要是这个
1 被动错误的发送时机?
错误帧分两种情况
a 位错误、位填充错误、格式错误、应答错误产生后,都是在当前发送的下一位发送错误帧;
b CRC检验错误发生后,不立即发送错误帧,而是放在ACK界定符后发送。
2 被动错误标志(6个连续隐性位)也违反了位填充,是否会触发位填充错误?
任何状态下的六个连续相同位都违反位填充,但不是所有的都会触发位填充错误,要看有没有在总线上表现出来六个连续相同的位。如果总线上只剩下错误被动被动节点,则会触发位错误;