国家兴亡匹夫有责,从神九用到CAN总线讲起(8)不要迷信
这样细节的讨论对没有花力气读过CAN原理的人可能比较吃力。为此简单介绍一下CAN的帧结构:CAN的帧由头部的仲裁域、控制域、数据域、CRC校验和、认可域和帧结束部分(EOF)构成。仲裁域主要是消息的标识符,不同优先级的标识符同时出现在总线上时,优先级最高者胜出,就按帧的剩余部分继续发送,而竞争失败者停止发送,转为接收者。控制域内有4位,决定数据域的字节数。
CAN帧的查错措施中对发生在控制域的位错是靠EOF的设计实现的。其原理是规定填充位规则只管到CRC结束处,而EOF部分为连续的7个1。当控制域发生位错时,原来传送的帧长被误读,产生了变形的帧。如果变形帧长于原帧,那么原帧的EOF部分将落到变形帧的数据域或CRC域,由于EOF部分破坏了数据域或CRC域的填充位规则,接收节点就查到错,在EOF第6位处发报错帧。如果变形帧短于原帧,那么接收节点会在期待的EOF部分收到原帧的数据或CRC,就不会有连续的7个1,接收节点就会发现不满足ACK分界符或EOF部分的格式错,从而在EOF的任一个位置(查到错后的一位)发报错帧。由于这种机制,不但有接收错的节点不会产生错收,也保证了系统内所有节点的一致性。
但是当有第二个位错时,这一机制存在漏洞。图1中发生在传送EOF第5位的1如果有位错,那么EOF部分和数据部分的区别就不再存在。变形帧就存在漏检的可能性。就可以理解为收到了有填充位的数据F1,或者由于正在送数据F1的填充位时出了错,被理解为收到了期待的EOF。
图2是DLC由0111变为0011的例子(DLC2传送中由1变为0),长帧读为短帧:图2 DLC2传送中由1变为0时帧的变化
此时原帧的第6个数据字节具有图1中F1的值,其填充位在传送中出错变为1,从而使变形帧读为Ack+EOF,格式是符合标准的。对任意H*D1D2D3总存在一种C1*C2*,它满足CRC检验及其分界符的格式检验,所以出现变形帧通过CRC检验的概率是2-16。对D6即F1来讲,只要前7位为0111111,就能保证接收节点在填充位传送出错时EOF的格式检验通过(因为CAN规定接收节点的格式检验只到EOF第6位)。所以F1出现的概率是2-7。7字节的帧,11位标识符可能有2个填充位,自DLC1到CRC结束共73位,可能含18个填充位,帧长最多为119位,原帧二位错发生位置的组合有119*118/2=7021种,所以发生在DLC2及D6填充位处错的概率为1/7021=1.4*10-4。这一情形下的漏检概率为Pun=2-16*2-7*1.4*10-4=1.69*10-11。
节点收下变形帧后,如果有新帧发送,它会干扰其它节点对原帧的收发,从而引起报错,但是这种后果已经影响不到该节点已经收下的帧。
这种漏检的情况还有;数据由6字节变到2字节(DLC2传送中由1变为0),Pun=1.69*10-4*2-23;数据由8字节变到0字节(DLC3传送中由1变为0)Pun=1.21*10-4*2-23;数据由4字节变到0字节(DLC2传送中由1变为0),Pun=2.55*10-4*2-23。总的错帧漏检率为Pun=8.1*10-11,仅此一项,它已经大于Bosch声称的漏检率4.7*10-11,所以不要迷信外国。
说到迷信,从字面上讲,就是自己不动脑子,只要是权威说的就不加思考地接受了,这当然省事,因为有了事可以推托:外国人也是这样的,我们水平低,能不错吗?这样的态度无异于认为我们是****。我认为为了把我们的事做好,每个数据都应审核一下,也许过去没有发现错,才办了错事,那确实是当时认识水平不够。但今天已经给你指出了问题,就不要再推托了。
现在国际上在推行汽车的功能安全标准ISO26262,那么对于以前已经被安全认证过的东西,是否要因为新发现了有安全漏洞而推翻呢?我认为功能安全的概念中有重要的一条,即功能安全存在于整个产品的设计、生产、维修生命周期中。新发现有错表示原来的安全指标分解过程有错,不能被确认(Validation)了,自然要重新确认,否则搞什么认证和确认都是假的了,只留下粉刷现实的印记而已。希望管事的人不要叶公好龙。
现在谈谈CAN FD:这是2011年Bosch推出的可变速率的CAN升级版本,它仍然声称在安全性方面错帧漏检率是4.7*10-11。
Total residual error probability for undetected corrupted messages: less than
message error rate * 4.7 * 10-11.
但是在它的二种速率交替时,会有慢速读取高速位流而出错的情况,形成第3种错帧漏检机制。详见:杨福宇,“有关CAN FD的评论“,《单片机与嵌入式系统应用》,2012, No.7,p.34-36,40 。它在实质上与本文是一样的,第二个错造成误读为EOF。CAN FD在DLC的值大于1000之后定义的帧长变化是大于4的,所以长帧读为短帧出现的情况要多许多,同样可用上述方法分析。只是因为帧长加大,二位错发生位置的组合数变得很大,从这个角度使第三种错帧漏检率降下来。
用户1454308 2015-8-10 13:13
用户1406868 2015-3-25 09:30
用户1724555 2014-12-4 14:29
用户1670098 2013-6-15 21:02
用户1328555 2013-4-21 00:09
用户1229813 2013-3-23 17:18
guojianjun5_823636633 2013-3-22 16:21
用户1549025 2013-3-11 16:26
介绍的非常不错,让我开眼界学习了
用户1613976 2013-3-11 13:57
用户1659756 2013-3-9 07:11