一、CAN总线的仲裁机制
can总线只有一条,当多个ECU节点想同时发送数据时,就需要一种仲裁机制只允许一个ECU发送报文成功。
结论:多个ECU节点同时发送报文,报文的id(标准数据帧的标识符)越小,优先级越高。
CAN总线的总线仲裁机制是一种非破坏性的仲裁机制, 既不会造成已发送数据的延迟,也不会破坏已发送数据的仲裁机制。
二、前置知识
ECU发送报文(电平)的同时,也在读取总线上的电平。can报文的发送是依靠连接在总线上的CAN收发器。CAN收发器内部有两个端,一个是被标记为Tx的标记端,一个是被标记为Rx的接收端,它们同时进行工作,也就是说它们一边发一边接收。
每一个节点通过它们的收发器时时刻刻监视着总线上的电平信号。
假设当前总线有3个ECU节点,有任意一个节点发送了一个显性的低电平(硬件物理层讲就是接地), 总线上由于开路接地就导致总线上是低电平,呈现出显性的状态。只有当总线上所有的节点都在发送高电平时,总线上才呈现出隐性的状态。
三、仲裁过程
我们用三个节点A、B、C举例。
假设A、B、C三个节点想同时发送报文,节点A、B、C发出的CAN报文标识符分别是0x67C、0x65A、0x65D,显然节点B的报文id最小。
如下图:帧起始时,节点A想发送的是低电平,实际上总线上回读的信号也是显性的,两个信号一致。因此,节点A可以继续发送报文。
如下图: ID的bit位5,节点A发出的是隐性电平1,节点A发出的高电平,但回读到的是低电平(因为被节点B、C拉低了)。因此,认为节点A仲裁失败。 一旦一个节点仲裁失败,就不会继续发送报文,转为只接收只接听的模式。
而节点B、C发送的电平和回读的一致,因此可以继续发送报文。
如下图:bit位为2时,节点C仲裁失败,节点B胜出可以继续发送完报文。
四、总结
仲裁看节点发送的电平是否和总线上对应的电平一致,一致就可以继续发送;否则仲裁失败,停止发送。这种仲裁机制的巧妙之处在于不需要额外地发出专门做裁决的报文,既不浪费时间,也不破坏报文数据。
其中非常根本的一个底层机制是,一旦某一个节点发出显性电平,总线的电平就会呈现出显性的低电平0(这样发出高电平1的节点自然仲裁失败,因为id小的优先级高)。