CAN总线采用的是非破坏性仲裁机制,这种总线仲裁方式允许总线上的任何一个设备都有机会取得总线控制权并向外发送数据。如果在同一时刻有2个或2个以上的设备要求发送数据,就会产生总线冲突,总线能够实时地检测这些冲突并对其进行仲裁,从而使具有高优先级的数据不受任何损坏地传输。本文就来讨论一下这种仲裁机制的实现方法。
1. CAN报文的优先级
在讨论CAN总线的仲裁机制之前,先来看一下CAN报文的优先级。CAN报文的优先级由报文中的仲裁段(ID)决定,如下图所示,并且报文的ID越小,优先级越高。
从图1看出,在标准帧中,报文ID为11位;在扩展帧中,报文ID为29位。另外还可以看出,标准帧的RTR位是固定的显性位,扩展帧的SRR位是固定的隐性位,这就决定了如果标准帧和扩展帧的前11位ID相同的话,标准帧的优先级高于扩展帧。
2. 总线仲裁过程
回读机制:节点在向总线发送报文的同时也对总线上的电平进行检测。通过这种机制,节点就可以判断本节点发出的二进制位与总线上当前的二进制位是否一致。
线与机制:指的是在总线上,显性位能够覆盖隐性位,这由CAN总线的物理结构决定。我们以标准数据帧为例来分析CAN总线的非破坏性逐位仲裁机制。假设总线上有两个节点A和B,当总线空闲时,这两个节点同时向总线上发送数据,如下图所示。
从上图看出,在某一时刻,节点A和B同时向总线上发送数据。在起始位SOF之后依次发送ID数据,并且节点A和B的前三位ID10、ID9和ID8数据相同,由于CAN总线的线与特性,节点A和B发出的数据与回读的数据相同,所以A与B继续发送数据。当发送到ID7时,A的ID7为显性位,B的ID7位隐性位,那么这两位的线与结果是显性,所以B回读的数据与发送的数据不一致,B马上停止发送数据退出总线竞争,并转换为接收状态。而节点A由于发出的数据与回读数据相同而取得总线控制权继续发送数据,直到报文发送结束。
从上面的分析能够看出,在整个总线竞争过程中:
(1)在节点A取得总线控制权之后,节点A继续发送自己的报文,总线竞争并不会对节点A的传输造成延时;
(2)在节点竞争过程中,并不会破坏报文内容。
正是由于上面的两个特点,才称之为非破坏性仲裁机制,这提高了CAN总线的实时性能。
总结
本文介绍了CAN报文的优先级和线与特性,并以标准数据帧的发送为例介绍了CAN总线的仲裁过程,解释了CAN总线的非破坏性仲裁特性以及因此导致的高实时性能。有兴趣的读者可以查阅相关的资料并分析标准帧和扩展帧的仲裁过程,相信可以更加加深对CAN总线的理解。