在了解CAN bus总线的工作机制时,不知道大家是否有以下一个疑问,就是那么多ECUs同时收发消息,那如何保证数据数据有条不紊的运行呢?
CAN的数据结构
我们已经在前期介绍过CAN的总线数据帧结构:
具体的内容可以参考:
下面我们从两个方面重点来介绍下:
数据传输
CAN协议是基于消息的,这意味着总线上的所有节点都能够传输和接收消息,并且它们总是在监听广播的消息。虽然所有节点都能够传输消息,但在任何给定时间,总线上只能有一个消息在传输。
最常见的是,与每个节点相关的CAN控制器实现了一个过滤器,检查广播消息的仲裁ID,并在接受仲裁ID在特定范围内的消息,或者忽略范围外的消息。
例如,假设我们在CAN总线上有三个节点。节点1传输了一个带有车辆当前速度的消息,并用ID 0x121标记该消息。节点2接受仲裁ID在0x100-0x1FF范围内的数据。消息的ID在这个范围内,所以节点2接受了这个消息。节点3接受仲裁ID在0x320-0x352范围内的数据。消息的ID不在这个范围内,所以节点3忽略了这个数据。
优先级仲裁
在其他一些网络配置过程中,老需要对设备进行拨码或者设定地址,而在CAN协议使用所谓的无损位仲裁(lossless bitwise arbitration)来确定消息的优先级。让我们来分解一下这个概念。
虽然每个节点都能够传输和接收消息,但在任何给定时间,只有一条消息可以占用总线。总线访问是事件驱动的,几个节点可能同时开始传输。在这种情况下,优先级更高的消息“赢得”总线访问权。消息优先级是通过逐位(即位仲裁)查看仲裁ID来确定的——二进制标识符越低,优先级越高(因此逻辑上的‘1’位是隐性的,而显性的‘0’位是占优势的)。赢得仲裁的节点继续其消息传输,而不会被另一个节点延迟、破坏或损坏消息。这被称为无损仲裁。传输优先级较低的消息的节点将在优先级较高的消息传输时停止传输。一旦总线被释放,该节点将再次尝试传输其消息。
让我们来看一个例子,考虑两个设备同时尝试在CAN总线上传输的情况,如下图所示。设备A的仲裁ID为11001000111。设备B的仲裁ID为11011111111。设备A将赢得总线访问权,因为它的仲裁ID更低(第4位是‘0’)。设备A继续消息传输,而设备B等待总线空闲后再尝试。
除了在传输中识别消息外,仲裁ID还决定了消息的优先级。ID值越低,优先级越高。如果多个节点同时尝试将消息传输到CAN总线上,优先级最高(仲裁ID值最低)的消息将获得总线访问权。低优先级节点必须等到总线可用后才能再次尝试传输。
参考链接: