处理CAN息线Babbling ldiot失效的方法
扫描二维码
随时随地手机看文章
1 产生Bab bIino ldiot失效原因分析
在排除软件设计bug后,Babbling Idiot失效主要是由硬件故障或瞬间干扰引起的。对于硬件故障造成的Babbling Idiot失效一般容易故障重现,因此容易排障,但不能自动消除,只有通过硬件冗余和容错进行消除。对于干扰引起的Babbling Idiot失效不容易观察,尚无好的对策。下面列举一些可能的原因:
①CAN通信控制器硬件故障。例如接收器时钟变坏,在重同步时超出了重同步跳跃宽度,造成数据接收错误。一般这种情况通过波形测试可以发现。
②总线电缆连接上的故障。接插件是电子系统中最难保证可靠性的地方,环境温度变化、振动或腐蚀,连接似通似断或电阻增大,都有可能使信号的幅度变小,或因终端阻抗不匹配而使信号波形变坏而导致误读。
③系统设计或人为故障。由于粗心而造成某节点与系统内的其他节点物理层设置不一样。这种情况一般很少发生,但当网络与互联网相连时,要考虑恶意攻击。
④干扰引起的故障。干扰使主机死循环不断写消息到CAN芯片发送缓冲器,或者破坏了通信控制器内的状态或设置,造成不断重发。
2 目前的解决办法
由硬件故障引起的失效在单信道中无法加以解决,例如在连线端子处因线头搭接或潮湿而引起的对电源或地线的短路,好像在总线上不断地在发同一信号。这种情形只有通过冗余信道才能解决。对于电磁干扰等原因引起的Babbling Idiot失效,已经有了一些解决方案。
2.1 利用CAN本身的错误约束机制
在发送过程中出现了出错帧,发送器自己也发出错帧,根据标准规定,发送器的发送错计数器就加8。在重发中如仍不能纠错,就要继续重发,经过16次重发,发送器进入消极状态(error passive),32次后该节点就进入离线状态(bus off)。在这32次重发中,若有更高优先级的消息在该节点成功发送,那么进入离线的重发次数可略有增加。
CAN本身的错误约束机制可使Babbling Idiot失效只持续一段时间,这对大部分非安全应用是够了,但对安全攸关的应用是不够的。32次重发造成的对低优先级消息的阻挠,在总线速率为500 kbps、帧长为95位时,相当于6 ms;对时速为100 km/h的车来说,相当于有O.17 m不受控制。离线状态是节点Babbling Idiot失效的一个结果,但这并不是Babbling Idiot失效的最坏结果。由于CAN系统内的优先级机制和出错传递机制,当故障是由接收方面引起时,这种约束方法会错怪了发送器。例如,位时间错误的接收节点总会使发送一接收过程失败,它可能会使很多节点进入离线状态,即在CAN总线系统中由一个节点失效扩大为系统失效。
2.2 Buja等提出的方法
用一个总线监守控制CAN通信控制器向驱动器的输出,在要发消息前由主机的应用程序向总线监守发申请,以让该消息在总线有空时竞争发送。总线监守到一定时间后禁止通信控制器向驱动器的输出,这个时间取调度分析得到的该消息的最坏响应时间。这种方法就是给每条消息提供一个合法的允许发送的时间窗口,与一般时间触发通信协议里用的办法一样,不过这里是由主机的通知来开启窗口。
这种方法的缺点是:在防止Babbling Idiot错的同时,也限制了CAN的正常出错自动重发功能;否则会将一般出错自动重发看作Babbling Idiot错,造成误判。普通错形成的丢帧必须在中间层或应用层加以处理,这使处理复杂化,增加了时间与软硬件的开销。
另外,总线监守的实现还是比较复杂的,因为它必须在接收状态时及时打开不同长度的窗口,让通信控制器发出认可信号或出错帧。这就要求通信控制器与总线监守增强互动。理论上要求总线监守与通信控制器尽量相互独立(例如独立的电源、独立的时基和独立的放置空间),以免总线监守和通信控制器受到相同的故障影响。而这些要求由于互动而不易全部实现。如果在总线监守中另设CAN的接收器,则可以去掉总线监守和通信控制器之间的连接,但是总线监守内的接收与通信控制器内的接收是否一致还无法保证。在同一节点里发送不同ID消息时,主机还要将消息的ID通知总线监守,因为不同ID的消息最坏响应时间是不同的。而这一过程中还有可能出错,若要检验,那么其实现方法又添加新的不确定因数。
2.3 Broster等提出的方法
Broster方法与Buja方法的区别是:总线监守单独侦听总线上的消息流,预设一个时间窗口,以此判断是否发生Babbling Idiot错;然后告知相关节点并禁止其发送,而无需节点提出消息发送的请求。因此,理论上一个总线监守可以对很多节点进行保护,只要相应的连线不嫌累赘。对每一个偶发消息,它有一个最小到达时间间隔T,以S表示消息发生时刻,用Si+1Si代表二次连续的到达时间,就有:
如果条件(1)不满足,则可判定发生了Babbling Idiot错。然而在总线上观察到的只是一连串的消息实际到达时间E1,E2,…,Ei,Ei+1,另外已知的是由调度分析得到对每一个消息的最坏响应时间R。显然E应发生在Si和Si+R之间。Broster等构造了一个Si的预估值Gi,如果Ei不在Gi和Gi+R之间,就认为发生了Babbling Idiot错(参考文献只考虑了Gi≤Ei的判断,未考虑Ei≥Gi+R超时错)。Gi的求法甚为关键,为理解的方便,以下根据参考文献的推理过程对符号下标进行了一致性改写。在Ei没有发生Babbling Idiot错的假设下,即Gi≤Ei≤Gi+R时:
①在最坏响应的情况下Si的估计值是ESi=Ei-R,若实际上有Ei一R>Gi,就说明Gi的估计偏小(Gi小于ESi),应该以ESi+T作为下一次消息发生时刻的估计值,即Gi+1=Ei一R+T;
②没有出现最坏响应的情况时,Ei—R≤Gi,可以以Gi+T作下一次消息发生时刻的估计值,即Gi+1=Gi+T;
二者合并,就得到参考文献中的公式:
在G0=-R的初值下,假设的2个不等式都成立(参考文献中为Gi=∞,只考虑了第一个不等式)。
这种用时限的方法与Buja方法一样,限制了CAN的正常出错自动重发功能,否则会将一般出错自动重发看作Babbling Idiot错而误判。
由于参考文献仅考虑了Ei≤Gi的为BabblingIdiot错判断准则,然而总线监守本身受干扰有错也会使Gi偏大,从而造成误判。式(2)对偏小的Gi进行纠正,对偏大的Gi则无纠正设计,一直产生另一类超时错误。用市售CAN通信控制器时,作为接收节点,总线监守在听到以错误帧结束的发送时,是无法判断该消息的ID的。按照Broster的设计,总线监守在听完消息ID之后,就应进行是否有Babbling Idiot错的判定;另外,如果在仲裁区发生错误,也不得不放弃本次判断与处理,否则会累及无辜。这不仅需专门的硬件实现,也有可能已经放过了Babbling Idiot错。
2.4 有源星形耦合器方案
CAN的有源星形耦合器结构比较复杂,它要求每个节点与耦合器有一根上行通道和一根下行通道。通过对2个通道数据流的差异可以分析出有固定搭接于显位或隐位的错误,并把该节点从系统中切除。对Babbling Idiot失效只考虑了其特例bit flipping错,bit flipping错是指比特流不受限制地变化。参考文献认为当节点坏了,或节点的出错计数器增减已不按CAN规定动作,或连线有了故障时,就会出现这种情况。通过比较上行通道与下行通道在传送出错帧时的情况,可判断出每个节点的贡献,按照类似于CAN的出错计数器增减法则记录在BFC中,然后根据BFC确定是否切除该节点。例如,别人都送er-ror flag时该节点未送,若在该节点发的error flag中又有错,再或该节点发了error flag而别人都没发等情况,均可通过这种办法把坏了的节点切除。
这种方案把危险集中到有源星形耦合器,使它成为失效孤点(single point of failure)。为了解决此问题,需要增加备份有源星形耦合器,这样一来,它要比总线情况多达8倍的收发器,多达4倍的通信控制器,以及有源星形耦合器内的其他部件,成本增加太多。另外,通过对出错情况分析来处理漏网的坏节点,其覆盖面有多大尚不清楚。
3 对干扰引起Babbljng idiot失效的分析
干扰可能使节点的主机进入程序跑飞与死循环状态,主机不断要求发送特定的消息,造成Babbling Idiot失效的问题。这种问题不应由通信系统负责解决,因为通信系统无法区别这是否是正确的请求,只有高层协议可通过数据中的其他信息决定数据的取舍。但此时在信道上数据已经重复传送,带宽已被侵占。
因为对Babbling Idiot失效因果关系的直接观察很少,我们只能分析所有可能的因果关系,找出最有可能的原因,然后加以验证和提出解决方案。在数据传送过程中,由于电源或其他信道电缆的传导或幅射干扰电平的影响,会使数据出错。根据参考文献的实践,电源的瞬间跌落会传递到器件的直流电源,因此也可能引起保存在RAM中的设置数据变化。通信控制器内有几种不同的数据,干扰影响的结果是不同的。
3.1 不产生Babbling Idiot失效的情况
干扰使主机写通信控制器时帧的ID、长度或数据等变了,帧的格式没有错,这种情况就通信而言,不会感到有错,只是有一次未发或错发了的帧。在通信控制器输出的过程中干扰会使比特流发生错误,CAN的出错自动重发机制可以纠正此类错误。通信控制器内有限自动机的状态被干扰破坏会引起比特流发生错误,CAN的出错自动重发机制可以纠正此类错,因为出错重发时有限自动机的状态就复位了。干扰破坏了部分通信控制器内寄存器的内容(例如发送出错计数器、接收出错计数器、状态寄存器的某些位),有些不会造成直接的错误。有些寄存器(例如掩蔽位寄存器、过滤位寄存器)会影响正常接收,但不会造成Babbling Idiot失效,而有的通信控制器则可能造成Babbling Idiot失效。例如,若82527中2条消息的ID在掩蔽位寄存器的必须匹配位上没差别就会使高编号的消息体无休止发送;如果干扰使掩蔽位寄存器的必须匹配位发生变化,就有可能出现上述情况。但是这种重复发送并不伴有错误帧。
3.2 产生Babbling ldiot失效的情况
某些设置的改变会造成通信系统内物理层参数的不一致,例如对时钟、位时间、位极性的设定。它们在不同的通信控制器是不同的,例如82527有组态寄存器,而SJAl000没有对应的功能寄存器。物理层的不一致是造成Babbling Idiot失效的重要因素,这不在CAN协议设计的错误约束机制的覆盖范围之内。
当发送器与接收器的位时间不同时,出错是不可避免的,重发不会改变接收器的采样情况,但接收仍然会再次错,这就是说造成了Babbling Idiot失效的故障。在一个时刻只有一个发送器,但可以有多个接收器,因此接收器故障造成出错的概率更大。
位时间快的接收器可能会发现假的bit stuffing错。由于采样时间的错误,采到的值会出错,所以CRC值也是错的,它不会发送Acknowledge,但在按其时钟的EOF部分发送active error flag。如果由它产生的出错帧被别的节点识别,就会产生新的重叠的error flag,发送节点也因此而执行发送错计数器加8的操作,在Babbling Idiot失效过程中很快进入消极状态。如果在重发中有其他节点更高优先级消息的发送,这个高优先级消息由于同样的理由也会出错。每次出错所有接收节点的接收错计数器加1,而这个时钟错的接收节点由于是第一个发active errorflag的,所以它的接收错计数器加8,因此会较早进入消极状态。在这种情况下,Babbling Idiot失效的后果受CAN故障约束,会持续一段时间长。如果受影响的发送节点原来已处于消极状态,那么这个错误的接收节点就可以将它送入离线状态。如果这个发送节点的发送错计数器离256不远,则有可能将更多的发送节点送入离线状态,这样就有可能引起系统的失效。
对位时间慢的接收器也可能会发现假的bit stuffing错和CRC错,它的active error flag总能为其他节点识别。除了上述位时间慢的接收器出现的现象外,active errorflag还可能造成error flag在正常位时间下有延长到errordelimiter区的14位连续显位的错,使出错概率加大。对于发送器出现位时间错的情形,发送器快相当于接收器慢,发送器慢相当于接收器快,所以其讨论与上面是一样的。
4 可能的解决办法探讨
第2节中讨论的几种方法着眼于Babbling Idiot失效在时间上的表现,但是仅考虑传送时无出错重发的情况,所以难于应用。从干扰对形成Babbling Idiot失效的机理分析来看,故障节点会在较短时间内形成很多断断续续的出错帧,这与普通的出错重发时偶尔出现的出错帧情况有些区别。下面由此提出几种解决方案:
①在主机中统计一定时间内通信控制器出错的次数,如果超限就对通信控制器的时间设置重新进行初始化。这种方法如何解决82527掩蔽位寄存器变化带来的Babbling Idiot失效,尚待进一步研究。
②局部改进通信控制器的设计,对于常用的标准通信速率,将有关的设置固化,或减少其选择,仅利用引脚的状态来决定参数。当位时间同步误差超大时产生中断,以便主机重新进行初始化。
③改进通信控制器设计,将有关物理层的设置部分放在非易失性存储器中,可较彻底地解决抗Babbling Idiot失效问题。今天这在技术与经济上都已不成问题。
④对主机死循环造成的Babbling Idiot失效可以在发送前设检查位,此检查位确定消息发送的时间间隔,只要此间隔大于看门狗周期,就能避免此类失效。
结 语
本文与以前解决Babbling Idiot失效问题的思路不同。以前主要是阻止Babbling Idiot故障节点对系统内其他正常通信带宽的影响(即容错),而本文试图消除故障本身,减少失效扩大化的可能,即纠错。这种方法完全植根于CAN种种查错与错误通知机制以及出错重发机制,是CAN独有的。有些事件触发通信协议,底层不具备这种错误通知机制,实现上效率就比较低。在许多时间触发协议中,依靠总线监守可以防止消息在非规定时间的发送,应付Babbling Idiot失效比较有效。但它没有考虑物理层设置或调度时间表的被干扰,总线监守本身也有可能被干扰。消息出错依然存在,在更高层次的出错重发还在无效地占用带宽;而且这种错误在时间上要延续很久才会被发现,在那里要解决这种类型的错帧失效问题就没有CAN那样简单。