CAN是事件触发的通信协议,它用标识符(ID)的无损仲裁方法调度不同消息的传送。仲裁依靠的是位值,因此位值采样准确性很重要。为在所有节点得到相同的准确的采样,位时间的同步就是关键。正常传送中也要克服节点间时钟差造成的采样点变动,减少读出时的错误。但是位时间能否实现同步,取决于时钟的偏差。为此CAN标准规定了时钟容差的计算方法。现在发现,标准规定的计算公式不够用,它会影响应用的可靠性。特别是汽车工业常用的标准儿939是基于CAN 2.0B的,时钟容差对CAN 2.OB的影响较大,因此对此加以修正非常重要。对于标准的完整理解不仅与应用有直接关系,对进一步提高CAN性能也会有新的启示。
1 ISO 1 1898-1:2003关于时钟容差的规定
ISO 11898-1:2003第12.4.1.2款规定位时间单位为Tq,它是可组态的参数。1位共有NTQ(8~25)个Tq,Tq由振荡器分频而得,受硬件的振荡器与分频器资源所限,其选择有限。每1位分成4段:同步段S(Tq)、传输段Pr(Tq~8Tq)、缓冲1段P1(Tq~8Tq)和缓冲2段P2(Tq~8 Tq),它们都是可组态的参数。位值的采样在P1与P2的分界处。CAN将同步分为2种:硬同步和重同步。总线空闲时开始新帧SOF的隐位到显位的跳变沿(R/D跳变沿)引起硬同步,立即复位本地位时间到S段。在帧传送中的R/D跳变沿引起重同步,跳变沿落在上一位采样后的P2段时将该P2缩短,跳变沿落在S后时加长本位P1的长度,此时本地位时间修正的最大绝对量不超过SJW(重同步跳转宽度)的值。SJW是1个组态参数,在Tq~4 Tq之间。关于CAN位时间与同步的一些较为深入的探讨可参见参考文献。
在CAN标准中,采用振荡器容差这一术语来代表时钟容差。实际实现时,有的实现方案用振荡器加锁相环构成时钟,此时CAN的时钟偏差就由2部分构成。为了与标准文字一致,本文不把时钟容差与振荡器容差严格区分。将振荡器的频率相对误差表示为△,时,按ISO11898-1的12.4.2.5款规定,它的约束有2条。
①正常传送时由于CAN填充位规则,重同步的距离最多为10位。为同步正确,有:
(2×△f)×10×NBT<SJW (1)
其中,NBT为标称位时间。
②出错时,有错的节点要发报错帧。为了区分是本地错还是全局错,要考察发出主动报错标志后的第7位是否还是显位。由于出错前可能有6位显位,所以2个同步段S相隔13位。容许的差小于缓冲段长:
(2×△f)×(13×NBT-P2)<MIN(P1,P2) (2)
在2个不等式中选最小者为本应用的时钟容差。例如Tbit=1 000 ns,总线长20 m,收发器的延迟为150 ns时,整个传输延迟为Tprop=500 ns,取Tq=125 ns,算出Pr=4,P1=1,P2=2,SJW=1,NBT=8。由上述二式算出的△f分别为0.006 25和0.004 90,取其中小者0.004 90,即接近0.5%。
2 发送器时钟同步中产生的问题
CAN总线具有显位优先于隐位的特性,即当总线上有多个节点同时发送时,只要有1个节点发的是显位,总线上最终的结果就是显位。所以当2个相距有一定距离的节点同时发送显位时,由于传输需要时间,在一个节点处看不到另一个节点的R/D跳变沿(如图1所示,e为同步的相位差),因为总线的电平早已被该节点置为显位。
在这种情况下,节点A、B即使时钟有差别,也无法建立同步。设A比B快,仅当节点A的同步段S比节点B的同步段S越来越超前,且其超前量大于传输时间时,节点B才能看见A的R/D跳变沿,B才会开始进行同步。
现在分析2个发送器在仲裁区的同步问题。假定它们看到总线空闲并同时开始发送,它们的ID只是最后1位不同。有文献介绍发送节点同步过程时,假定总线空闲时有1个发送器领先于其他发送器,且超过Pr/2段发送的情况。由于事件发生的随机性,这只是特例。对于定时消息,它们由本节点的时钟触发。但本地时钟问并无同步,它们之间又存在频率差异,所以定时消息规定应发出的时间的相位差会周期性地变化。1个发送器领先所有其他发送器的情况也只是特例。在本文假设下,由于在ID前各位出现的R/D跳变沿均未被对方看见,它们之间没有同步关系。到最后1位,假定时钟慢的节点有显位而时钟快的节点有隐位,并假定ID前1位是隐位,那么慢节点的R/D跳变沿将可能被快的节点看到。但是,它将有很大的相位差,可能已经超过了重同步跳转宽度SJW,从而无法使该快节点正确同步,便会导致采样在慢节点送来的电平尚未稳定的地方产生位值读错。
在CAN 2.0B的29位ID的最后1位,即仲裁域的第31位,由于可能还有7个填充位,即已有37位未进行同步。为了采样正确,未同步时快慢发送节点同步段的差应小于重同步跳转宽度SJW:
(2×△f)×37×NBT≤SJW (3)
以前述例子的数据,NBT=8,SJW=1,得△f≤0.001 68,减小了很多。