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 protocol

让我们来了解这两个层次。

  • 数据链路层:此层负责节点到节点的数据传输。它允许您建立和终止连接。它还负责检测和纠正物理层可能发生的错误。数据链路层分为两个子层:
    1. MAC:MAC 是 Media Access Control 的缩写。它定义了网络中的设备如何访问介质。它提供数据的封装和解封装、错误检测和信号传输。
    2. LLC:LLC 是 Logical Link Control 的缩写。它负责帧接收过滤、过载通知和恢复管理。
  • 物理层:物理层负责原始数据的传输。它定义了电压电平、定时、数据速率和连接器等参数的规范。

CAN 规范定义了 CAN 协议和 CAN 物理层,这些均在 CAN 标准 ISO 11898 中定义。ISO 11898 有三个部分:

  • ISO 11898-1:本部分包含数据链路层和物理信号链路的规范。
  • ISO 11898-2:本部分属于高速 CAN 的 CAN 物理层。高速 CAN 允许数据速率高达 1 Mbps,用于车辆的动力总成和充电区域。
  • ISO 11898-3:本部分也属于低速 CAN 的 CAN 物理层。它允许数据速率高达 125 kbps,低速 CAN 用于通信速度不关键的场合。

CiA DS-102:CiA 的全称是 CAN in Automation,它定义了 CAN 连接器的规范。

就实现而言,CAN 控制器和 CAN 收发器通过应用程序、操作系统和网络管理功能在软件中实现。

CAN 帧格式

让我们来了解 CAN 帧的结构。

CAN protocol
  • SOF:SOF 是 Start Of Frame 的缩写,表示新的帧进入网络。它有 1 位。
  • 标识符:CAN 2.0 A 规范中定义的标准数据格式使用 11 位消息标识符进行仲裁。基本上,这个消息标识符决定了数据帧的优先级。
  • RTR:RTR 是 Remote Transmission Request 的缩写,它定义了帧类型,是数据帧还是远程帧。它有 1 位。
  • 控制字段:它包含用户定义的函数。
    1. IDE:控制字段中的 IDE 位是 Identifier Extension 的缩写。显性 IDE 位定义 11 位标准标识符,而隐性 IDE 位定义 29 位扩展标识符。
    2. DLC:DLC 是 Data Length Code 的缩写,它定义了数据字段中的数据长度。它有 4 位。
    3. 数据字段:数据字段最多可以包含 8 字节。
  • CRC 字段:数据帧还包含一个 15 位的循环冗余校验字段,用于检测传输过程中可能发生的损坏。发送方在发送数据帧之前计算 CRC,接收方也计算 CRC,然后将计算出的 CRC 与发送方收到的 CRC 进行比较。如果 CRC 不匹配,接收方将生成错误。
  • ACK 字段:这是接收方的确认。在其他协议中,在收到所有数据包后会发送一个单独的确认数据包,但在 CAN 协议中,不会为确认发送单独的数据包。
  • EOF:EOF 是 End Of Frame 的缩写。它包含 7 个连续的隐性位,称为帧结束。

现在我们将了解数据如何通过 CAN 网络传输。

CAN protocol

CAN 网络由多个 CAN 节点组成。在上面的例子中,我们考虑了三个 CAN 节点,并将它们命名为节点 A、节点 B 和节点 C。CAN 节点由以下三个元素组成:

  • Host
    主机是运行特定应用程序的微控制器或微处理器。主机决定收到的消息的含义以及接下来应该发送什么消息。
  • CAN 控制器
    CAN 控制器处理 CAN 协议描述的通信功能。它还触发 CAN 消息的传输或接收。
  • CAN 收发器
    CAN 收发器负责在 CAN 总线上发送或接收数据。它将从 CAN 总线上收集到的数据流转换为 CAN 控制器可以理解的数据信号。

在上图中,使用屏蔽双绞线电缆来传输或接收数据。它也称为 CAN 总线,CAN 总线由两条线组成,即 CAN low 线和 CAN high 线,分别称为 CANH 和 CANL。传输是通过施加到这些线路上的差分电压来实现的。CAN 使用双绞线电缆和差分电压是因为其所处的环境。例如,在汽车中,电机、点火系统和其他许多设备可能会由于噪声导致数据丢失和数据损坏。两根线的绞合也减少了磁场。总线两端均以 120 欧姆的电阻端接。

CAN 特性

CAN protocol

通过差分电压,我们将确定 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 特性中学到的要点

  • 逻辑 1 是隐性状态。要在 CAN 总线上发送 1,CAN high 和 CAN low 都应施加 2.5V。
  • 逻辑 0 是显性状态。要在 CAN 总线上发送 0,CAN high 应施加 3.5V,CAN low 应施加 1.5V。
  • 总线的理想状态是隐性。
  • 如果节点达到显性状态,则任何其他节点都无法将其恢复到隐性状态。

CAN 总线逻辑

CAN protocol
CAN protocol

从上述情况我们可以了解到,显性状态会覆盖隐性状态。当节点同时发送显性位和隐性位时,总线保持显性。只有当所有节点都发送隐性位时,才会出现隐性电平。这种逻辑称为 AND 逻辑,在物理上通过开漏电路实现。

CAN 通信原理

我们知道消息是根据仲裁字段中设置的优先级发送的。对于标准帧,消息标识符为 11 位,而对于扩展帧,消息标识符为 29 位。这允许系统设计者在设计时就设计消息标识符。消息标识符越小,消息的优先级就越高。

让我们通过流程图来了解仲裁是如何工作的。

CAN (Controller Area Network) protocol

发送方希望发送消息,并等待 CAN 总线空闲。如果 CAN 总线空闲,发送方会发送 SOF 或显性位来访问总线。然后,它会发送消息标识符位,从最高有效位开始。如果节点在传输隐性位时检测到总线上存在显性位,则表示该节点已输掉仲裁,并停止传输后续位。发送方将等待,并在总线空闲后重新发送消息。

CAN 仲裁示例

CAN protocol

如果我们考虑三个节点,即节点 1、节点 2 和节点 3,它们的节点消息标识符分别为 0x7F3、0x6B3 和 0x6D9。

CAN protocol

上面图中显示了所有三个节点的最高有效位传输。

第 11 位:由于所有三个节点的位都是隐性的,因此总线位也将保持隐性。

第 10 位:所有节点都有第 10 位为隐性,因此总线也将保持隐性。

第 9 位:节点 1 是隐性位,而其他节点是显性位,因此总线也将保持显性。在这种情况下,节点 1 输掉了仲裁,因此它停止发送位。

第 8 位:节点 2 和节点 3 都发送隐性位,因此总线状态将保持隐性。

第 7 位:节点 2 发送显性位,而节点 3 发送隐性位,因此总线状态将保持显性。在这种情况下,节点 3 输掉了仲裁,因此它停止发送消息,而节点 2 赢得了仲裁,这意味着它将继续保持总线控制,直到消息被接收。


下一主题HTTP 状态码