1 出错的情况
在CAN协议2.OA版3.1.3款中提到:为了使报错帧正确结束,消极报错节点可能需要处于空闲状态至少3位的时间(如果消极报错接收节点发生本地错),因此总线不应满负荷运行。这是引发应用故障的原因。节点间并无时间同步,因而即便总线有空闲时间,也不能保证像上述要求那样的分布。在总线的利用率较低时,挂起待发的消息将在服务间隔(intermission,缩写为I.M.)后立即发送。这在标准中也有规定:在另一条消息发送过程中挂起待发的消息在服务间隔后的第一位启动(发送)。
现在考虑一种情况:由于电磁干扰,某消极报错节点发生一个本地错(其他节点未发现有错),它就发一个消极报错标志(P.E.Flag)。因为是隐位,其他节点对这个消极报错标志也无响应。这一消极报错帧的报错标志在数据帧ACK分界符后的EOF部分得到确认(如图1所示),但是它的消极报错帧分界符(P.E.Del)延续到EOF域最后一位以及服务间隔之后。如果此时有3位的总线空闲时间,那么新帧的开始位(SOF)将是该消极报错节点服务间隔的第一位。按ISO16845标准,此显位被解读为对超载帧的请求,由消极报错节点发送的超载帧将引起其他节点的位填充错,使它们发送主动报错帧。主动报错帧与超载帧将在总线上叠合,虽然比特流的解释对该消极报错节点和其他节点而言是不同的,但两种帧分界符的结束时刻是一样的。所有节点都会在此刻复位CAN协议状态机的状态,使它回到开始服务间隔的状态。这解释了。BoschCAN协议的说明。但如果对3位总线空闲时间没有保证,那又该如何呢?
对报错帧分界符格式错的检查在国际标准化组织(ISO)的标准ISO16845中有明确的规定:在消极报错帧分界符中的任何显位是一种格式错。第7.5.6款和8.5.13款是对应消极报错接收节点和消极报错发送节点消极报错帧分界符格式错的测试方法,第7.6.12款和8.6.9款是消极报错节点消极报错帧分界符查到格式错时,接收错计数器与发送错计数器增加机制的检查方法。因此,消极报错节点与其他节点不同步时,另一个节点开始发送新消息,其SOF将被该消极报错节点视为消极报错帧分界符内的格式错。它将在其他节点新帧传送过程中开始一个新的消极报错帧,新的消极报错标志将在其他节点新帧的EOF部分得到确认,新消极报错帧分界符再一次延续到超过其他节点服务间隔之后。只要挂起的消息未发完,这一过程将不断重复。在此时间段里,消极报错节点不能接收或发送任何消息,因为它总在不断发送消极报错帧。这延迟了该节点应发送的消息,而不管消息的优先级有多高,也就引起了优先级逆转。由于电磁干扰的随机性,无法对系统进行调度分析。这个消极报错节点有2种可能的方式退出循环。如果在后面不断发送的新帧的某处出现了主动报错帧,该消极报错节点的消极报错帧将与主动报错帧重叠,重复过程结束。但在正常应用场合中,错误是很少发生的,因此后续的传送越正常,该消极报错节点等效离线状态时间越长。另一个可能是经过一些传送后不再有挂起待发的帧,总线空闲时间足够长,正如协议设想的那样,能使消极报错帧的分界符正常结束,消极报错帧分界符格式错的重复也就此结束。
2 可能的情景
除了上述消极报错接收节点的本地故障会引起等效离线的失效以外,其他情景下消极报错节点也有可能与簇内其他节点丢失状态同步。这些情景在三方面超出了Bosch CAN协议设计时的设想:第一,不仅消极报错接收节点会丢失同步,而且消极报错发送节点也会丢失同步;第二,在有些场合,为了实现同步,所需的总线空闲时间要更多(至少为10位);第三,不仅消极报错节点的本地错会引起问题,在少数场合,主动报错节点的本地故障也会引起问题。下面举一些例子,实际上有问题的情景远不止这些。
在图2中,消极报错接收节点由于电磁干扰而未能查出总线上的一个全局错(即漏判性质的本地错),但是过后它发现了因其他节点所发送主动报错帧引起的位填充错,它发送的消极报错帧将迟于其他节点的主动报错帧结束,因此丢失了同步。
在图3中,消极报错接收节点在EOF域中发生误判性质的本地错。