CAN (Controller Area Network) 协议2025年03月17日 | 阅读 9 分钟 CAN 是 Controller Area Network 协议的缩写。它是由 **Robert Bosch** 在 1986 年左右开发的一种协议。CAN 协议是一种标准,旨在允许微控制器和其他设备在没有主机计算机的情况下进行通信。使 CAN 协议在其他通信协议中独一无二的特性是其广播类型的总线。这里的广播意味着信息会传输到所有节点。节点可以是传感器、微控制器或通过 USB 线缆或以太网端口允许计算机在网络上进行通信的网关。CAN 是一种面向消息的协议,这意味着消息携带消息标识符,并且基于标识符来决定优先级。CAN 网络中不需要节点标识,因此可以非常容易地将其插入或删除出网络。它是一种串行半双工异步通信协议。CAN 是一种双线通信协议,因为 CAN 网络通过双线总线连接。这两根线是具有 120 欧姆特性阻抗的绞线对,两端均有终端电阻。最初,它主要用于车辆内部通信,但现在已用于许多其他场合。例如 UDS 和 KWP 2000,CAN 也可用于车载诊断。 为什么选择 CAN?由于电子设备数量的增加,需要一个集中式的标准通信协议。例如,现代汽车中可能有 7 个以上的 TCU 用于各种子系统,如仪表板、变速箱控制、发动机控制单元等等。如果所有节点都一对一连接,通信速度会非常高,但电线的复杂性和成本会非常高。在上述示例中,单个仪表板需要 8 个连接器,因此为了克服这个问题,引入了 CAN 作为一种集中式解决方案,只需要两根线,即 CAN high 和 CAN low。使用 CAN 协议的解决方案因其消息优先级而非常高效,并且作为节点可以插入或移除而不影响网络的灵活性。 CAN 协议的应用最初,CAN 协议旨在解决车辆内部通信问题。但后来,由于其提供的功能,它被用于各种其他领域。CAN 协议的应用包括:
CAN 分层架构众所周知,OSI 模型将通信系统划分为 7 个不同的层。但 CAN 分层架构由两层组成,即 数据链路层和物理层。 ![]() 让我们来了解这两个层次。
CAN 规范定义了 CAN 协议和 CAN 物理层,这些均在 CAN 标准 ISO 11898 中定义。ISO 11898 有三个部分:
CiA DS-102:CiA 的全称是 CAN in Automation,它定义了 CAN 连接器的规范。 就实现而言,CAN 控制器和 CAN 收发器通过应用程序、操作系统和网络管理功能在软件中实现。 CAN 帧格式让我们来了解 CAN 帧的结构。 ![]()
现在我们将了解数据如何通过 CAN 网络传输。 ![]() CAN 网络由多个 CAN 节点组成。在上面的例子中,我们考虑了三个 CAN 节点,并将它们命名为节点 A、节点 B 和节点 C。CAN 节点由以下三个元素组成:
在上图中,使用屏蔽双绞线电缆来传输或接收数据。它也称为 CAN 总线,CAN 总线由两条线组成,即 CAN low 线和 CAN high 线,分别称为 CANH 和 CANL。传输是通过施加到这些线路上的差分电压来实现的。CAN 使用双绞线电缆和差分电压是因为其所处的环境。例如,在汽车中,电机、点火系统和其他许多设备可能会由于噪声导致数据丢失和数据损坏。两根线的绞合也减少了磁场。总线两端均以 120 欧姆的电阻端接。 CAN 特性![]() 通过差分电压,我们将确定 0 和 1 如何通过 CAN 总线传输。上图是显示 CAN low 和 CAN high 电压水平的电压图。在 CAN 术语中,逻辑 1 被称为隐性(recessive),逻辑 0 被称为显性(dominant)。当 CAN high 线和 CAN low 线均施加 2.5 伏电压时,实际差分电压为零伏。CAN 收发器将 CAN 总线上的零伏读取为隐性或逻辑 1。零伏是总线的理想状态。当 CAN high 线被拉高到 3.5 伏,CAN low 线被拉低到 1.5 伏时,总线的实际差分电压将为 2 伏。CAN 收发器将其视为显性位或逻辑 0。如果总线状态达到显性或逻辑 0,则任何其他节点都无法将其变为隐性状态。 从 CAN 特性中学到的要点
CAN 总线逻辑![]() ![]() 从上述情况我们可以了解到,显性状态会覆盖隐性状态。当节点同时发送显性位和隐性位时,总线保持显性。只有当所有节点都发送隐性位时,才会出现隐性电平。这种逻辑称为 AND 逻辑,在物理上通过开漏电路实现。 CAN 通信原理我们知道消息是根据仲裁字段中设置的优先级发送的。对于标准帧,消息标识符为 11 位,而对于扩展帧,消息标识符为 29 位。这允许系统设计者在设计时就设计消息标识符。消息标识符越小,消息的优先级就越高。 让我们通过流程图来了解仲裁是如何工作的。 ![]() 发送方希望发送消息,并等待 CAN 总线空闲。如果 CAN 总线空闲,发送方会发送 SOF 或显性位来访问总线。然后,它会发送消息标识符位,从最高有效位开始。如果节点在传输隐性位时检测到总线上存在显性位,则表示该节点已输掉仲裁,并停止传输后续位。发送方将等待,并在总线空闲后重新发送消息。 CAN 仲裁示例![]() 如果我们考虑三个节点,即节点 1、节点 2 和节点 3,它们的节点消息标识符分别为 0x7F3、0x6B3 和 0x6D9。 ![]() 上面图中显示了所有三个节点的最高有效位传输。 第 11 位:由于所有三个节点的位都是隐性的,因此总线位也将保持隐性。 第 10 位:所有节点都有第 10 位为隐性,因此总线也将保持隐性。 第 9 位:节点 1 是隐性位,而其他节点是显性位,因此总线也将保持显性。在这种情况下,节点 1 输掉了仲裁,因此它停止发送位。 第 8 位:节点 2 和节点 3 都发送隐性位,因此总线状态将保持隐性。 第 7 位:节点 2 发送显性位,而节点 3 发送隐性位,因此总线状态将保持显性。在这种情况下,节点 3 输掉了仲裁,因此它停止发送消息,而节点 2 赢得了仲裁,这意味着它将继续保持总线控制,直到消息被接收。 下一主题HTTP 状态码 |
我们请求您订阅我们的新闻通讯以获取最新更新。