文章

CAN总线仲裁(Bus Arbitration)机制

任何总线设计都要考虑到,如果出现两个节点同时要发送数据的时候,该怎样处理。CAN总线就使用总线仲裁的机制来处理这种冲突。

在CAN消息结构图上可以看到Arbitration Field主要就是指消息的identifier。仲裁其实就是比较两个同时发送消息的identifier的大小,并且是逐个bit地比较。

dominant level是逻辑上的0。而recessive level是逻辑上的1。

任何节点在侦测到总线idle时都可以随时发送消息。

发送节点在整个发送过程中都会一直监控着总线,一旦某个发送节点侦测到一个dominant level而此时它发送的是recessive level,

它就会立即退出仲裁过程,而成为一个接收节点,等待下一次总线idle时再发送。

仲裁跨越整个Arbitration Field,最终只有一个发送节点能独占总线,将数据发送出去。

由于dominant level是逻辑上的0,所以实际就是比较谁的仲裁区域的数据越小,谁就能赢得优先发送的权力。

也可以认为仲裁区域内的数据越小,说明这个消息重要度越高。

当远程帧碰到同一时刻需要发送与此远程帧相同Id的数据帧时,远程帧由于RTR位是隐性的,而数据帧RTR位是显性的,所以数据帧会得到优先发送权。

当11-bit id的数据帧A与29-bit的数据帧B(前11位与数据帧A相同)同时发送,数据帧A由于RTR位为显性,而数据帧对应的SRR位为隐形,所以数据帧A会得到优先发送权。