文章
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会得到优先发送权。
