一、CAN-bus信号产生原理
众所周知,一个标准CAN节点由微处理器、控制器、收发器构成。多个节点成总线型架构挂在一起,两个端节点上并有终端电阻。其结构简图如下图所示。
图1 CAN-bus节点网络结构
可以看出,与总线直接相连的是CAN节点的收发器,起内部电路等效如下图所示,CAN-H、CAN-L直接由三极管驱动,近似可以看成电流型输出。结合上文所述网络架构中的终端电阻,节点发出信号时电流流过终端电阻产生电压信号,当同一时间多个节点同时发出信号时就会使总线上的电流高于单一节点发出的电流,使得我们观察电压信号时出现突增的现象。
图2 CAN收发器结构
CAN-bus是总线型结构,通常状态下一般只有一个节点占有总线。那么有几种情况会导致多个节点同时发出,进而导致幅值出现“异常”呢,下文通过致远电子CANScope分析仪的几个测试案例总结一下。
二、应答位上的幅值“异常”
最常见的,当CAN网络上存在3个以上的节点时,应答位上的幅值要明显高于同一报文的其他位置,如下图所示。可以看到报文在ID段、数据段、CRC校验段处的幅值均比较一致,但是到应答位处时幅值出现突增。这是为什么呢,大家都知道CAN-bus总线拥有自动应答机制,即当某一节点发送完一帧报文时,所有总线中的其余非只听节点均会在应答位处做出响应,如果报文被成功识别则发出一个显性位做为应答信号。
结合上文所述,应答位此时CAN总线上的电流是若干节点电流叠加的综合,所以应答位的幅值高就很容易讲通了。
图3 应答位上的幅值“异常”
三、ID段上的幅值“异常”
CAN-bus总线的一大特点就是多主结构,即网络中所有节点功能对等,没有主从机的概念,所有节点均可自由收发数据。保证多主结构得以实现的关键在于CAN总线的仲裁机制也称优先级机制。当网络中同时有多个节点同时发送数据时会在ID段处产生仲裁,优先级高的节点会最终占有总线。
如下图所示,可以看到在图中的标记处波形出现了“台阶”。正是由于在“台阶”出现前有两个节点同时发出数据,导致幅值增高,在“台阶”处某一节点由于优先级高占有总线,另一个节点暂时退出,使得幅值又回归平常。
图4 ID段上的幅值异常
四、错误帧上的幅值“异常”
再看看这个案例,可以看到在波形的后半部分也出现了台阶式的幅值增高,光标卡住的显性电平区间可以看到宽度明显超过了5个标准位宽,按照CAN总线的位填充规则(不能存在连续六个相同的显性位或隐性位)表明这是一条错误帧。但是不要误会,并不是因为这个幅值“异常”而导致的错误帧,我们知道CAN总线有错误重发机制,以保证总线传输数据的可靠性。这种可靠性正式通过错误帧的“一票否决制”实现的。
当网络中某一节点识别到一条认为是有问题的报文后会发送六个连续的显性位(即错误帧),投出这一否决票通知网络上所有其他节点,本条报文无效。此后其他节点会以“跟票”的形式全部发出六个显性位错误帧。所以此时多个节点重叠部分的错误帧的幅值就会高一些了。
图5 错误帧上的幅值异常