CAN总线通信技术广泛应用于多个行业,是每个总线设计工程师必学的一个通讯网络。然而,对于CAN通信中的错误帧,许多人仅停留在表面了解,缺乏深入理解,这导致许多工程师在面对总线通信故障时感到无从下手。
错误标定
检测到错误条件的站通过发送错误标志指示错误。对于“错误主动”的节点,错误信息为“主动错误标志”,对于“错误被动”的节点,错误信息为“被动错误标志”。站检测到无论是位错误、填充错误、形式错误,还是应答错误,这个站会在下一位时发出错误标志信息。
只要检测到的错误的条件是CRC错误,错误标志的发送开始于ACK界定符之后的位(其他的错误条件除外)。如图1所示:
图1 CRC错误帧
故障界定
至于故障界定,单元的状态可能为以下三种之一:“错误主动”、“错误被动”、“总线关闭”。
“错误主动”的单元可以正常地参与总线通讯并在错误被检测到时发出主动错误标志。
“错误被动”的单元不允许发送主动错误标志。“错误被动”的单元参与总线通讯,在错误被检测到时只发出被动错误标志。而且,发送以后,“错误被动”单元将在初始化下一个发送之前处于等待状态。(见“挂起发送”)“总线关闭”的单元不允许在总线上有任何的影响(比如,关闭输出驱动器)。
三个转态的转换方式如图2所示:
图2 CAN状态转换图
在每一总线单元里使用两种计数以便故障界定: 发送错误计数、 接收错误计数。
这些计数按以下规则改变(注意,在给定的报文发送期间,可能要用到的规则不只一个):
1、当接收器检测到一个错误,接收错误计数就加1。在发送主动错误标志或过载标志期间所检测到的错误为位错误时,接收错误计数器值不加1。
2、当错误标志发送以后,接收器检测到的第一个位为“显性”时,接收错误计数值加8。
3、当发送器发送一错误标志时,发送错误计数器值加8。
例外情况1:发送器为“错误被动”,并检测到一应答错误(注:此应答错误由检测不到一“显性”ACK 以及当发送被动错误标志时检测不到一“显性”位而引起)。
例外情况2:发送器因为填充错误而发送错误标志(注:此填充错误发生于仲裁期间。引起填充错误是由于:填充位〈填充位〉位于RTR位之前,并已作为“隐性”发送,但是却被监视为“显性”)。
例外情况1和例外情况2时,发送错误计数器值不改变。
4、发送主动错误标志或过载标志时,如果发送器检测到位错误,则发送错误计数器值加8。
5、当发送主动错误标志或过载标志时,如果接受器检测到位错误(位错误),则接收错误计数器值加8。
6、在发送主动错误标志、被动错误标志或过载标志以后,任何节点最多容许7个连续的 “显性”位。以下的情况,每一发送器将它们的发送错误计数值加8,及每一接收器的接收错误计数值加8:
当检测到第14个连续的“显性”位后;
在检测到第8个跟随着被动错误标志的连续的“显性”位以后;
在每一附加的8个连续“显性”位顺序之后。
7、报文成功传送后(得到ACK及直到帧末尾结束没有错误),发送错误计数器值减1,除非已经是0。
8、如果接收错误计数值介于1和127之间,在成功地接收到报文后(直到应答间隙接收没有错误,及成功地发送了ACK位),接收错误计数器值减1。如果接收错误计数器值是0,则它保持0,如果大于127,则它会设置一个介于119到127之间值。
9、当发送错误计数器值等于或超过128时,或当接收错误计数器值等于或超过128时,节点为“错误被动”。让节点成为“错误被动”的错误条件致使节点发出主动错误标志。
10、当发送错误计数器值大于或等于256时,节点为“总线关闭”。
11、当发送错误计数器值和接收错误计数器值都小于或等于127时,“错误被动”的节点重新变为“错误主动”。
12、在总线监视到128次出现11个连续“隐性”位之后,“总线关闭”的节点可以变成“错误主动”(不再是“总线关闭”),它的错误计数值也被设置为0。
备注1:
一个大约大于96的错误计数值显示总线被严重干扰。最好能够预先采取措施测试这个条件。
备注2:
起动/睡眠:如果起动期间内只有1个节点在线,以及如果这个节点发送一些报文,则将不会有应答,并检测到错误和重复报文。由此,节点会变为“错误被动”,而不是“总线关闭”。