CAN (Controller Area Network) 协议 是一种高性能的、面向消息的、串行通信总线协议,最初由德国博世 (Bosch) 公司在1980年代开发,旨在解决汽车电子系统中大量的ECU (Electronic Control Unit) 之间复杂而繁琐的布线问题。如今,CAN协议已广泛应用于汽车、工业自动化、医疗设备、航空电子、机器人等多个领域,成为嵌入式系统中最常用的通信协议之一。

核心思想:CAN协议是一种多主、总线仲裁、基于消息广播、高可靠性的串行通信协议。它允许网络中的所有节点在不中断其他节点通信的情况下,通过非破坏性仲裁机制共享总线,并提供强大的错误检测和故障隔离能力。


一、CAN协议的核心特点

CAN协议之所以如此流行,得益于其独特的设计理念和以下核心特点:

  1. 多主通信 (Multi-Master):网络中的任何节点都可以作为发送方,在总线空闲时发起通信。所有连接到总线的节点都可以接收并处理消息。
  2. 非破坏性位仲裁 (Non-Destructive Bitwise Arbitration)
    • 这是CAN协议最独特和强大的功能之一。当多个节点同时试图发送消息时,它们会通过比较消息的仲裁段(Identifier) 来决定哪个消息优先发送。
    • ID值越小(二进制数值越低),优先级越高。
    • 仲裁过程是逐位进行的,优先级低的节点会在发送低电平(显性位,Dominant)时检测到其他节点发送高电平(隐性位,Recessive)时,立即退出总线竞争,等待下一轮发送。优先级高的消息则继续发送,不会被破坏
  3. 基于消息的通信 (Message-Based)
    • CAN总线上没有设备地址。数据以“消息”的形式广播,每个消息都有一个唯一的标识符 (Identifier, ID)
    • 网络中的所有节点都可以接收到所有消息。每个节点根据消息的ID来判断是否需要处理该消息。
    • ID不仅标识消息内容,还决定了消息的优先级。
  4. 广播通信 (Broadcast Communication):发送节点将消息广播到总线上,所有接收节点都可以接收。
  5. 数据一致性 (Data Consistency):如果一个消息被任何一个节点确认收到错误,发送节点会重发该消息,直到所有接收节点都正确收到。
  6. 高可靠性和错误检测 (High Reliability & Error Detection):CAN协议内置了强大的错误检测机制,包括:
    • 循环冗余校验 (CRC):检测数据传输中的位错误。
    • 位填充 (Bit Stuffing):防止长串相同位导致的时钟同步问题,并作为错误检测的一部分。
    • 帧校验 (Frame Check):检测帧结构错误。
    • 应答校验 (ACK Check):确保至少有一个接收器正确收到消息。
  7. 故障隔离 (Fault Confinement):CAN节点能够区分临时性错误和永久性故障。如果一个节点频繁出错,它会被自动隔离(进入错误被动或总线关闭状态),以免影响整个网络的正常通信。
  8. 灵活性:通过软件配置,可以方便地增加或移除节点,而无需对硬件或其他节点进行大量修改。
  9. 物理层多样性:支持多种物理层实现,如高速CAN (ISO 11898-2) 和低速容错CAN (ISO 11898-3)。

二、CAN协议的OSI模型层次

CAN协议主要覆盖OSI模型中的数据链路层 (Data Link Layer)物理层 (Physical Layer)

2.1 物理层 (Physical Layer)

物理层定义了信号的电气特性、传输介质和总线拓扑。

  • 传输介质:通常使用两根双绞线 (CAN_H 和 CAN_L),抗噪声能力强。
  • 信号电平:差分信号传输。
    • 显性位 (Dominant):逻辑0,CAN_H和CAN_L之间有电压差(CAN_H高,CAN_L低)。
    • 隐性位 (Recessive):逻辑1,CAN_H和CAN_L电压差接近0(通常都拉到中间电平)。
  • 总线终端电阻:总线的两端需要连接120欧姆的终端电阻,以消除信号反射,保证信号完整性。
  • 传输速率
    • 高速CAN (High-Speed CAN, ISO 11898-2):波特率高达1 Mbps,适用于大部分汽车应用。
    • 低速容错CAN (Low-Speed Fault-Tolerant CAN, ISO 11898-3):波特率最高125 Kbps,即使一根线损坏也能通信,适用于对容错性要求高的场景。
  • 总线拓扑:线型拓扑结构,所有节点并行连接到总线。

数据链路层定义了消息帧的结构、仲裁机制、错误检测和故障处理。这是CAN协议的核心。

三、CAN协议消息帧结构

CAN协议定义了两种主要的消息帧格式:标准帧 (CAN 2.0A)扩展帧 (CAN 2.0B)

3.1 标准帧 (Standard Frame) 结构

标准帧包含11位标识符 (ID)。

1
2
3
[SOF] [仲裁段] [控制段] [数据段] [CRC段] [ACK段] [EOF]
1 11位ID RTR 6位 0-8字节 15位 2位 7位
+ SRR
  • SOF (Start Of Frame):1位显性位 (Dominant),表示帧的开始。
  • 仲裁段 (Arbitration Field)
    • Identifier (ID):11位,决定消息的优先级。ID值越小,优先级越高。
    • RTR (Remote Transmission Request) 位:1位,用于区分数据帧和远程帧。
      • 显性 (0):数据帧,包含数据。
      • 隐性 (1):远程帧,请求某个ID的数据。
  • 控制段 (Control Field)
    • IDE (Identifier Extension) 位:1位,用于区分标准帧和扩展帧。
      • 显性 (0):标准帧。
      • 隐性 (1):扩展帧。
    • r0 (Reserved Bit 0):1位保留位。
    • DLC (Data Length Code):4位,表示数据段的字节数 (0-8字节)。
  • 数据段 (Data Field):0到8个字节的数据。
  • CRC 段 (Cyclic Redundancy Check Field)
    • CRC Sequence:15位CRC校验码,用于错误检测。
    • CRC Delimiter:1位隐性位,将CRC与ACK段分隔开。
  • ACK 段 (ACKnowledgement Field)
    • ACK Slot:1位,接收到有效消息的节点会在此位置发送一个显性位,表示应答。
    • ACK Delimiter:1位隐性位。
  • EOF (End Of Frame):7位隐性位,表示帧的结束。

3.2 扩展帧 (Extended Frame) 结构

扩展帧包含29位标识符 (ID)。

1
2
3
[SOF] [仲裁段] [控制段] [数据段] [CRC段] [ACK段] [EOF]
1 29位ID RTR 6位 0-8字节 15位 2位 7位
+ SRR + IDE

与标准帧的主要区别在于仲裁段:

  • ID (Identifier):由11位基本ID和18位扩展ID组成,共29位。
  • SRR (Substitute Remote Request) 位:扩展帧独有,用于在仲裁过程中,让扩展帧(即使其基本ID与标准帧相同)在优先级上低于标准帧。
  • IDE (Identifier Extension) 位:隐性 (1),表示这是扩展帧。

3.3 远程帧 (Remote Frame)

远程帧不包含数据段,其RTR位为隐性(1)。它用于请求网络中的某个节点发送特定ID的数据帧。

四、CAN协议的错误处理机制

CAN协议的错误处理是其高可靠性的关键。

  1. 错误检测 (Error Detection)
    • 位填充 (Bit Stuffing):在传输中,任何连续的5个相同电平位后面都会插入一个反向电平位。如果接收器检测到6个连续的相同电平位,则认为发生了位错误。
    • CRC 校验 (Cyclic Redundancy Check):对整个消息进行校验,检测传输错误。
    • 帧校验 (Frame Check):检测帧的结构是否符合规范。
    • 应答错误 (ACK Error):如果发送器发送了消息,但在ACK Slot没有收到任何显性应答,则认为是应答错误。
    • 位监视 (Bit Monitoring):发送节点在发送数据的同时监视总线电平。如果发送的电平与总线实际电平不符(除了仲裁过程),则认为发生位错误。
  2. 错误通知 (Error Signaling)
    • 当节点检测到错误时,会发送一个错误帧 (Error Frame)
    • 错误帧由连续6个显性位 (Active Error Frame) 或连续6个隐性位 (Passive Error Frame) 组成,故意违反位填充规则,以通知所有其他节点总线上发生了错误。
    • 所有接收到错误帧的节点都会丢弃当前正在传输的消息,并等待总线空闲后重传。
  3. 故障隔离 (Fault Confinement)
    • 每个CAN控制器内部维护两个计数器:发送错误计数器 (TEC)接收错误计数器 (REC)
    • 根据错误类型和发生的频率,这两个计数器会增加或减少。
    • Error Active (错误主动):正常状态。TEC/REC较低。节点可以发送和接收。
    • Error Passive (错误被动):TEC/REC达到阈值(如128)。节点仍能发送和接收,但发送错误帧时是被动错误帧(6个隐性位),且在发送消息前需要等待额外的时间。
    • Bus-off (总线关闭):TEC达到更高阈值(如255)。节点被隔离,不能发送或接收任何消息。需要软件干预(如复位)才能重新回到总线。
    • 这种机制确保了一个故障节点不会使整个网络瘫痪。

五、CAN协议的应用

CAN协议因其高可靠性、实时性和低成本等优点,在多个领域得到广泛应用:

  • 汽车电子
    • CAN-BUS:用于发动机管理、变速器控制、ABS、ESP、安全气囊、车身电子(车窗、门锁)、仪表盘等。
    • CAN-FD (CAN Flexible Data Rate):新一代CAN协议,支持更高的数据速率和更长的数据段(最高64字节),以满足自动驾驶、信息娱乐系统等对带宽和数据量的需求。
  • 工业自动化
    • CANopen:基于CAN的更高层协议,提供设备行规和通信行规,简化了工业设备的互操作性,广泛用于传感器、执行器、PLC、机器人等。
    • DeviceNet:另一种基于CAN的工业控制协议,常用于离散制造领域。
  • 医疗设备:诊断设备、病人监护仪、成像设备。
  • 航空电子:飞机内部通信系统。
  • 电梯控制:实现多点实时通信。
  • 机器人:关节控制、传感器数据集成。
  • 智能家居:楼宇自动化。

六、CAN FD (CAN Flexible Data Rate)

CAN FD是CAN协议的演进版本,主要改进点在于:

  • 灵活数据速率 (Flexible Data Rate):在仲裁段和数据段使用不同的波特率。仲裁段保持传统CAN的速率,以确保兼容性;数据段可以提高到传统CAN的5-8倍(甚至更高)的速率。
  • 数据段长度增加:从传统CAN的8字节增加到最大64字节,大大提高了数据传输效率。
  • 兼容性:CAN FD控制器可以与传统CAN控制器在同一网络中工作(但CAN FD帧只能由CAN FD控制器识别和处理)。

七、总结

CAN协议作为一种成熟、稳定且功能强大的通信总线技术,在过去的几十年中证明了其在恶劣环境下(如汽车)的卓越性能。其独特的非破坏性仲裁机制、强大的错误检测和故障隔离能力,使其成为实时控制和高可靠性通信的理想选择。随着汽车行业向电动化、智能化发展,以及工业4.0的推进,CAN及其增强版本(如CAN FD)将继续在嵌入式系统领域发挥关键作用。