CAN协议详解
CAN (Controller Area Network) 协议 是一种高性能的、面向消息的、串行通信总线协议,最初由德国博世 (Bosch) 公司在1980年代开发,旨在解决汽车电子系统中大量的ECU (Electronic Control Unit) 之间复杂而繁琐的布线问题。如今,CAN协议已广泛应用于汽车、工业自动化、医疗设备、航空电子、机器人等多个领域,成为嵌入式系统中最常用的通信协议之一。
核心思想:CAN协议是一种多主、总线仲裁、基于消息广播、高可靠性的串行通信协议。它允许网络中的所有节点在不中断其他节点通信的情况下,通过非破坏性仲裁机制共享总线,并提供强大的错误检测和故障隔离能力。
一、CAN协议的核心特点
CAN协议之所以如此流行,得益于其独特的设计理念和以下核心特点:
- 多主通信 (Multi-Master):网络中的任何节点都可以作为发送方,在总线空闲时发起通信。所有连接到总线的节点都可以接收并处理消息。
- 非破坏性位仲裁 (Non-Destructive Bitwise Arbitration):
- 这是CAN协议最独特和强大的功能之一。当多个节点同时试图发送消息时,它们会通过比较消息的仲裁段(Identifier) 来决定哪个消息优先发送。
- ID值越小(二进制数值越低),优先级越高。
- 仲裁过程是逐位进行的,优先级低的节点会在发送低电平(显性位,Dominant)时检测到其他节点发送高电平(隐性位,Recessive)时,立即退出总线竞争,等待下一轮发送。优先级高的消息则继续发送,不会被破坏。
- 基于消息的通信 (Message-Based):
- CAN总线上没有设备地址。数据以“消息”的形式广播,每个消息都有一个唯一的标识符 (Identifier, ID)。
- 网络中的所有节点都可以接收到所有消息。每个节点根据消息的ID来判断是否需要处理该消息。
- ID不仅标识消息内容,还决定了消息的优先级。
- 广播通信 (Broadcast Communication):发送节点将消息广播到总线上,所有接收节点都可以接收。
- 数据一致性 (Data Consistency):如果一个消息被任何一个节点确认收到错误,发送节点会重发该消息,直到所有接收节点都正确收到。
- 高可靠性和错误检测 (High Reliability & Error Detection):CAN协议内置了强大的错误检测机制,包括:
- 循环冗余校验 (CRC):检测数据传输中的位错误。
- 位填充 (Bit Stuffing):防止长串相同位导致的时钟同步问题,并作为错误检测的一部分。
- 帧校验 (Frame Check):检测帧结构错误。
- 应答校验 (ACK Check):确保至少有一个接收器正确收到消息。
- 故障隔离 (Fault Confinement):CAN节点能够区分临时性错误和永久性故障。如果一个节点频繁出错,它会被自动隔离(进入错误被动或总线关闭状态),以免影响整个网络的正常通信。
- 灵活性:通过软件配置,可以方便地增加或移除节点,而无需对硬件或其他节点进行大量修改。
- 物理层多样性:支持多种物理层实现,如高速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,即使一根线损坏也能通信,适用于对容错性要求高的场景。
- 总线拓扑:线型拓扑结构,所有节点并行连接到总线。
2.2 数据链路层 (Data Link Layer)
数据链路层定义了消息帧的结构、仲裁机制、错误检测和故障处理。这是CAN协议的核心。
三、CAN协议消息帧结构
CAN协议定义了两种主要的消息帧格式:标准帧 (CAN 2.0A) 和 扩展帧 (CAN 2.0B)。
3.1 标准帧 (Standard Frame) 结构
标准帧包含11位标识符 (ID)。
1 | [SOF] [仲裁段] [控制段] [数据段] [CRC段] [ACK段] [EOF] |
- 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字节)。
- IDE (Identifier Extension) 位:1位,用于区分标准帧和扩展帧。
- 数据段 (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 | [SOF] [仲裁段] [控制段] [数据段] [CRC段] [ACK段] [EOF] |
与标准帧的主要区别在于仲裁段:
- 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协议的错误处理是其高可靠性的关键。
- 错误检测 (Error Detection):
- 位填充 (Bit Stuffing):在传输中,任何连续的5个相同电平位后面都会插入一个反向电平位。如果接收器检测到6个连续的相同电平位,则认为发生了位错误。
- CRC 校验 (Cyclic Redundancy Check):对整个消息进行校验,检测传输错误。
- 帧校验 (Frame Check):检测帧的结构是否符合规范。
- 应答错误 (ACK Error):如果发送器发送了消息,但在ACK Slot没有收到任何显性应答,则认为是应答错误。
- 位监视 (Bit Monitoring):发送节点在发送数据的同时监视总线电平。如果发送的电平与总线实际电平不符(除了仲裁过程),则认为发生位错误。
- 错误通知 (Error Signaling):
- 当节点检测到错误时,会发送一个错误帧 (Error Frame)。
- 错误帧由连续6个显性位 (Active Error Frame) 或连续6个隐性位 (Passive Error Frame) 组成,故意违反位填充规则,以通知所有其他节点总线上发生了错误。
- 所有接收到错误帧的节点都会丢弃当前正在传输的消息,并等待总线空闲后重传。
- 故障隔离 (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)将继续在嵌入式系统领域发挥关键作用。
