CAN协议的错帧漏检率推导及改进过程简介
扫描二维码
随时随地手机看文章
当数据在传送中出错,且错帧被漏检时,就意味着错误的数据被送到应用层,除非应用层有额外的数据识别措施,这个数据就可能引起不可预测的结果。CAN协议声称有很低的错帧漏检率(4.7&TImes;10-11&TImes;出错率),有的宣传材料在一定条件下推出要1000年才有1次漏检,这是不正确的。错帧漏检率是一个十分重要的指标,很多应用就是看到Bosch CAN2.0规范上的说明才选用CAN的。但是对这个指标的来源仅有极少的公开资料,以及很少的讨论,使用户很难对它确认或验证,这给用户带来风险。本文采用了重构出错漏检实例的方法,导出了CAN的漏检错帧概率下限,它比CAN声称的要大几个数量级。在许多应用中,CAN已是可靠性和价格平衡下的不二选择,或者已被长期生产和使用,面对这个新发现的问题,在CAN本身未作改进之前,迫切需要一种“补丁”来加以改善。由于篇幅有限,所以只能摘要介绍错帧漏检率的推导过程,重点在提供解决方案。
1 关于CAN漏检错帧概率文献的讨论
Bosch CAN2.0规范说它的漏检错帧概率小于错帧率(message error rate)&TImes;4.7&TImes;10-11。它的来源见参考文献,其中没有提供产生漏检的分析算法,仅提到用大量仿真得到了公式。要判断一个帧出错后是否会漏检,至少要计算2次CRC,对每一bit仅就汇编语言也需要几条指令,以该文考虑的80~90 bit的帧,CRC覆盖58~66 bit就要循环58~66次,以1989年时常用的PDP11或VAX机,一条机器指令要0.1 μs左右,一帧的判断要0.07 ms,即使不停机做一年,能作2.20×1011帧,考虑58 bit可构成258=2.88×1017种不同的帧,再加有58×57种不同的加入2位bit错的位置组合,所以能作的仿真只是可能情况的微乎其微的一部分(百万分之一)。由于样本太小,归纳的公式也就很难把影响因素考虑完整。
1999年Tran对错帧漏检率也作了研究,鉴于分析困难,他也采用计算机大量仿真的办法,针对11位ID 、8字节数据帧,他用的是600 MB的Alpha服务器。与上述讨论一样,虽然仿真量很大,仍然是可能情况的极小部分。
CAN有关的另一个标准CANopen Draft Standard 304 (2005)给出的错帧漏检率是(7.2×10-9)。同样来自CAN自动化协会的不同数据,使人无可适从。
2 新错帧漏检率的导出
本文的研究方法是构造出漏检的实例,确定该种实例占可能的帧的概率,乘以与该实例相应的出多位错的概率,然后求出所有可能的实例,得到CAN的错帧漏检率。本文对最有可能造成漏检的二位错情况进行分析,然后扩大为有多位错。数据域取8字节,并假定错都发生在数据域内。它并没有将超过CRC校验能力时的分散的多bit错漏检率考虑进去,所以得到的是漏检错帧概率的下界。
2.1 CAN位填充中有错时的位序错开
在有可能产生填充的位流中有bit错时,就有可能造成发送方与接收方只有一方执行填充规则,造成填充位与信息位理解的错乱。图1(a)的第3位传送中出错,结果发送方的填充位1被接收方误读为数据1,整个接收数据比发送数据长了1位。图1(b)的第3位传送中的错使接收方产生了删除填充位的条件,因此它把发送的数据1删去,接收数据流短了1位。
图1 CAN的位填充规则使出错后接收位流变化
从位流变化可以知道,如果发生的2个bit错正好一次是图1(a)的类型,一次是图1(b)的类型,那么发送数据流和接收数据流的长度将仍然相等,如果2个错都发生在数据域,CAN的其他检验是发现不了它们的。
2.2 发生漏检的条件
发送的位流与接收的位流可写为多项式形式Tx(x)和Rx(x),CRC检验就是用CAN的生成多项式G(x)除这2个式子,得到的余数称为CRC值,如果2个余数相同,CRC检验通过。当发生传送错误,Rx (x)= Tx(x)+U(x)×G(x)时,对Tx(x)和Rx(x)求到的余数是相同的,这时就发生了错帧的漏检。因此只要找到U(x),就可以构造出漏检的实例。