CAN 总线协议详解

Controller Area Network — 从汽车电子到工业控制的事实标准

1. 什么是 CAN 总线

📌 一句话概括

CAN(Controller Area Network,控制器局域网)是一种多主站、基于消息广播的串行通信总线协议,专为在恶劣电磁环境中实现微控制器与设备之间的高可靠性、实时性通信而设计。

核心特征

特征说明
🔗 多主站架构任何节点都可以主动发送数据,无需中心控制器协调
📨 基于消息的寻址数据帧以消息 ID(标识符)寻址,而非节点地址;多个节点可同时接收同一消息
非破坏性逐位仲裁多个节点同时发送时,ID 最小的帧自动胜出,不会丢失任何已发送数据
🛡️ 多层错误检测位错误、CRC 校验、位填充错误、格式错误、ACK 错误——五重检测机制
🔧 故障界定节点自动检测自身故障程度并降级(Error Active → Error Passive → Bus Off)
📏 短帧结构数据帧有效载荷 0–8 字节(经典 CAN),最大 64 字节(CAN FD)
🌡️ 恶劣环境适应差分信号、共模抑制,天生抗电磁干扰(EMI)

2. 发展历史与背景

1983 — Robert Bosch GmbH 启动车内网络项目,目标是减少豪华车中日益庞大的线束
1986 — CAN 协议首次在 SAE(汽车工程师学会)大会上公开发表
1987 — Intel 推出第一款 CAN 控制器芯片 82526;Philips 推出 82C200
1991 CAN 2.0 规范发布,分为 Part A(11 位 ID)和 Part B(29 位扩展 ID)
1992 — Mercedes-Benz W140 S-Class 成为首款量产搭载 CAN 的乘用车
1993 ISO 11898 国际标准正式发布
2012 CAN FD 1.0 发布,突破 1 Mbps 速率限制和 8 字节负载上限
2015 — ISO 11898-1:2015 将 CAN FD 纳入国际标准
2024 CAN XL 规范完善,目标速率 10+ Mbps,负载最大 2048 字节

3. 为什么需要 CAN — 核心设计目标

在 CAN 出现之前,汽车内部的电子控制单元(ECU)之间通过点对点线束连接。随着 ECU 数量从个位数激增到上百个,线束重量、成本和复杂度失控——豪华车线束总长度可超过 5 公里,重量超过 60 公斤

CAN 解决的五个核心问题

问题CAN 的解决方案
🚗 线束爆炸一条双绞线总线替代成百上千根点对点连线
⏱️ 实时性确定性延迟——优先级最高的消息在最坏情况下的延迟是可精确计算的
🔒 数据一致性广播式通信确保所有节点在同一时刻收到相同数据(组内一致性)
电磁兼容差分信号(CAN_H / CAN_L)天然抗共模干扰,适合汽车点火系统等强 EMI 环境
🛡️ 故障安全节点可自动退出总线而不影响其他节点通信(故障界定机制)

4. 网络拓扑与物理层

📌 物理层核心参数

传输介质双绞线(屏蔽或非屏蔽),典型阻抗 120 Ω
信号方式差分电压信号(CAN_H 与 CAN_L)
总线终端两端各 120 Ω 终端电阻,抑制信号反射
最大速率1 Mbps(经典 CAN,40 m 内)
最大距离约 1000 m(速率降至 ~50 kbps 时)
节点数上限理论无上限(ID 字段决定),实际受收发器驱动能力限制,通常 ≤ 30–120
拓扑线性总线(Multi-Drop),允许多个短分支(Stub)

差分信号原理

CAN 使用两根信号线——CAN_HCAN_L——传输互补的电压信号:

总线状态CAN_H 电压CAN_L 电压差分电压逻辑位
显性(Dominant)~3.5 V~1.5 V~2.0 V0
隐性(Recessive)~2.5 V~2.5 V~0 V1
🔑 关键设计: 显性位会覆盖隐性位——如果任一节点驱动显性,总线就呈现显性。这正是非破坏性逐位仲裁和错误信令的物理基础。隐性位相当于"谁都不说话",显性位相当于"有人大声喊"。

速率与距离的权衡

比特率最大总线长度(近似)
1 Mbps40 m
500 kbps100 m
250 kbps250 m
125 kbps500 m
50 kbps1000 m

这是由信号在电缆中的传播延迟决定的——仲裁机制要求一个位的时间必须足够长,让信号在最远两个节点之间往返。

ISO 11898 标准族

标准内容
ISO 11898-1数据链路层和物理层信令
ISO 11898-2高速 CAN 物理层(CAN_H/CAN_L 收发器规范)
ISO 11898-3低速容错 CAN 物理层
ISO 11898-4时间触发 CAN(TTCAN)
ISO 11898-5低功耗 CAN 收发器
ISO 11898-6选择性唤醒 CAN 收发器

5. 帧类型总览

CAN 2.0 定义了四种帧类型

帧类型英文用途方向
数据帧 Data Frame 发送节点向接收节点传输数据(最常用的帧) 发送节点 → 接收节点
远程帧 Remote Frame 请求某个 ID 的数据(某个节点请求另一个节点发送特定数据) 请求节点 → 数据源节点
错误帧 Error Frame 任何节点检测到总线错误时发送 任意节点 → 所有节点
过载帧 Overload Frame 在连续帧之间插入额外延迟(现代 CAN 控制器极少使用) 接收节点 → 发送节点
⚠️ 实际注意: CAN FD 已弃用远程帧。在实际系统中,远程帧的使用非常少见——大多数设计中,节点周期性地主动广播数据即可满足需求。

6. 数据帧结构详解

这是 CAN 协议的核心——下面逐字段拆解 标准格式(11 位 ID)数据帧

SOF1 bit
ID [10:0]11 bits
RTR1 bit
IDE1 bit
r01 bit
DLC4 bits
DATA0–8 bytes
CRC15 bits
CRC DEL1 bit
ACK2 bits
EOF7 bits
IFS3 bits

▲ 标准 CAN 数据帧(11 位 ID)——图示未按比例

逐字段详解

字段全称位宽说明
SOF Start of Frame 1 帧起始——单个显性位。所有节点用它同步时序。
ID Identifier 11 (标准)
29 (扩展)
仲裁字段核心。决定消息优先级(越小优先级越高),也用作消息内容的"标签"——接收节点通过过滤 ID 决定是否处理该帧。
RTR Remote Transmission Request 1 显性 = 数据帧;隐性 = 远程帧
IDE Identifier Extension 1 显性 = 标准 11 位 ID;隐性 = 扩展 29 位 ID
r0 Reserved 1 保留位(在 CAN FD 中改为 FDF 位——FD Format indicator)
DLC Data Length Code 4 数据字节数(经典 CAN:0–8;CAN FD:0–8, 12, 16, 20, 24, 32, 48, 64)
DATA Data Field 0–8 B 实际有效载荷
CRC Cyclic Redundancy Check 15 (CAN 2.0)
17/21 (CAN FD)
循环冗余校验——多项式:x¹⁵ + x¹⁴ + x¹⁰ + x⁸ + x⁷ + x⁴ + x³ + 1
CRC DEL CRC Delimiter 1 单个隐性位,分隔 CRC 与 ACK
ACK Acknowledgement 2 Slot(1 bit,发送节点发隐性,至少一个正确接收的节点将其覆盖为显性)+ Delimiter(1 bit 隐性)
EOF End of Frame 7 连续 7 个隐性位标记帧结束
IFS Interframe Space 3 帧间间隔——强制 3 位隐性,为控制器处理提供时间

标准帧 vs 扩展帧

特性标准帧 (CAN 2.0A)扩展帧 (CAN 2.0B)
标识符宽度11 位29 位(11 + 18)
唯一 ID 数量2,048约 5.37 亿
SRR 位有(Substitute Remote Request,替代标准帧 RTR 位置)
兼容性仅标准帧控制器扩展帧控制器兼容标准帧
典型应用小型车身网络复杂系统(J1939 卡车/客车网络)
SOF
Base ID
[28:18]
SRR
IDE
Ext ID
[17:0]
RTR
r1,r0
DLC
DATA
CRC
ACK
EOF

▲ 扩展 CAN 数据帧(29 位 ID)

位填充(Bit Stuffing)

🔄 什么是位填充?

SOF 到 CRC 序列(不含 CRC Delimiter)之间,发送方在每出现 5 个连续相同极性位后自动插入一个反极性位。接收方执行对称的去填充操作。

目的:

  • 保证足够的边沿密度,防止接收节点时钟漂移失步
  • 防止数据中意外出现类似 EOF(6 个连续隐性位)或错误标志(6 个连续显性位)的序列

示例:

原始数据:  00000 11111  →  (5 个 0,插入 1)  (5 个 1,插入 0)
填充后:    000001111110

7. 总线仲裁机制

📌 核心原理

CAN 的非破坏性逐位仲裁(CSMA/CR — Carrier Sense Multiple Access / Collision Resolution)是其最精妙的设计之一:多个节点可以同时开始发送,在仲裁字段期间,谁先发出隐性位而检测到总线仍为显性,谁就自动退出竞争——没有数据丢失,没有时间浪费。

仲裁过程示例

假设三个节点同时发送,ID 分别为 0x3A4 (01110100100)0x3A8 (01110101000)0x3E0 (01111100000)

位位置:   10   9   8   7   6   5   4   3   2   1   0
Node A:    0   1   1   1   0   1   0   0   1   0   0   (0x3A4) ← 胜出!
Node B:    0   1   1   1   0   1   0   1   0   0   0   (0x3A8)
Node C:    0   1   1   1   1                       (0x3E0 — 在 bit5 丢失仲裁)

    前 4 位一致(0111),bit4 一致(0)
    bit3: C 发隐性(1),总线上 A/B 发显性(0) → C 检测到冲突,立即停止,转为接收
    bit2: 一致(1)
    bit1: B 发隐性(1),A 发显性(0) → B 停止
    → A 赢得仲裁,不损失任何已发送数据!

关键推论

8. 错误检测与故障界定

五种错误检测机制

#错误类型检测方式检测节点
1 位错误 发送节点将总线实际电平与自身发送的电平比较(仲裁字段和 ACK 期间除外) 发送节点
2 位填充错误 在需要填充的区间内检测到第 6 个连续相同极性位 所有节点
3 CRC 错误 接收方计算的 CRC 与帧中 CRC 字段不匹配 接收节点
4 格式错误 固定格式位(CRC Delimiter、ACK Delimiter、EOF)中出现非法值 所有节点
5 ACK 错误 发送节点在 ACK Slot 期间未检测到显性位(无任何节点正确接收) 发送节点

错误帧

任何节点检测到上述任一错误后,立即发送错误标志(6 个连续显性位——故意违反位填充规则),随后是所有节点发出的 8 位隐性错误界定符。这确保整个网络在最短时间内知晓该帧无效

故障界定状态机

每个 CAN 控制器维护两个错误计数器——TEC(发送错误计数)REC(接收错误计数),根据以下规则转换状态:

状态条件行为
🟢 Error Active TEC < 128 且 REC < 128 正常参与通信;检测到错误时发送 6 位显性主动错误标志
🟡 Error Passive TEC ≥ 128 或 REC ≥ 128 仍可收发;检测到错误时发送 6 位隐性被动错误标志(不干扰总线)
🔴 Bus Off TEC ≥ 256 完全断开——停止一切收发。需软件干预(通常检测 128 次连续 11 位隐性后恢复)

计数器修改规则(简化)

事件TEC 变化REC 变化
成功发送一帧−1(下限 0)
成功接收一帧−1(下限 0,若此前 < 128)
发送节点检测到错误+8
接收节点检测到错误+1 (或 +8 若为主动错误标志期间)
🎯 设计哲学: 故障界定机制实现了优雅降级——一个即将失效的节点不会拖垮整个网络。这被称为"故障静默"(Fail-Silent)策略,是 CAN 在汽车等安全关键系统中被广泛信赖的核心原因。

9. 位时序与同步

CAN 不使用独立的时钟线——时钟信号嵌入在数据流中,通过位边沿进行同步(异步串行通信)。每个位时间被划分为四个非重叠段:

缩写功能
同步段SYNC_SEG位边沿预期出现的窗口——固定 1 Tq
传播时间段PROP_SEG补偿物理信号在总线上的传播延迟——1–8 Tq
相位缓冲段 1PHASE_SEG1采样点之前的缓冲区——1–8 Tq;可被同步延长
相位缓冲段 2PHASE_SEG2采样点之后的缓冲区——2–8 Tq;可被同步缩短
⏱️ Tq(Time Quanta,时间量子): CAN 时钟的基本单位。Tq = 预分频器值 × 晶振周期。例如:16 MHz 晶振、预分频 2 → Tq = 125 ns。一个位通常由 8–25 个 Tq 组成。

采样点(Sample Point)位于 PHASE_SEG1 结束处,即总线电平被读取为逻辑值的位置。典型设置在位的 75%–87.5% 处。

硬同步与重同步

10. CAN FD — 灵活数据速率

📌 一句话概括

CAN FD(CAN with Flexible Data-Rate)是 CAN 2.0 的直接演进,在保持向后兼容性的同时,解决了经典 CAN 的两大瓶颈——1 Mbps 速率上限每帧最多 8 字节有效载荷

CAN FD 的核心改进

特性经典 CANCAN FD
仲裁阶段速率≤ 1 Mbps≤ 1 Mbps(与经典 CAN 兼容)
数据阶段速率= 仲裁速率最高 8 Mbps(实测可达 12 Mbps)
最大有效载荷8 字节64 字节
CRC 长度15 位17 位(≤ 16 字节负载)/21 位(20–64 字节负载)
位填充固定 5 → 1数据阶段:固定(CRC 前插入 4 个填充位计数位),无动态填充
BRS 位不存在Bit Rate Switch — 指示是否在数据阶段切换速率
ESI 位不存在Error State Indicator — 指示发送节点错误状态

CAN FD 帧结构(与经典 CAN 的差异)

SOF
ID
IDE
FDF
res
BRS
ESI
DLC
DATA
0–64 B
CRC 17/21
ACK
EOF

▲ CAN FD 数据帧 — 绿色 字段为 CAN FD 新增/改变,数据段以高速率传输

CAN FD DLC 编码

经典 CAN 的 DLC 直接表示 0–8。CAN FD 复用 DLC 的 9 个值映射到更大范围:

DLC 值数据长度DLC 值数据长度
0 – 80 – 8 字节1224 字节
912 字节1332 字节
1016 字节1448 字节
1120 字节1564 字节

11. CAN XL — 下一代演进

📌 一句话概括

CAN XL(Extra Large)是 CAN 协议族的第三个主要世代,目标是将有效载荷提升至 2048 字节、数据阶段速率提升至 10+ Mbps,同时保持与经典 CAN 和 CAN FD 的物理层兼容(共用总线收发器)。

三代 CAN 对比

特性经典 CANCAN FDCAN XL
发布年份199120122024 (CiA 规范)
最大有效载荷8 字节64 字节2048 字节
数据阶段速率1 Mbps≤ 8 Mbps10–20 Mbps
CRC15 位17/21 位多种选项
与旧设备共存✅ 同总线共存✅ 同总线共存
主要目标车身控制ECU 刷写、诊断ADAS、雷达/摄像头原始数据、SOA 骨干

12. 高层协议:CANopen 与 J1939

CAN 规范只定义了物理层和数据链路层(OSI 第 1、2 层)。要在实际系统中使用,还需要高层协议定义 ID 分配、数据编码、网络管理等。以下是两个最主流的高层协议:

CANopen(工业自动化)

特性说明
标准化组织CiA(CAN in Automation),标准:CiA 301
寻址方式11 位 ID 被分为 4 位功能码(FCC)+ 7 位节点 ID
核心概念对象字典(Object Dictionary)——每个设备的所有参数和数据统一映射到 16 位索引 × 8 位子索引的表格
通信模型PDO(过程数据对象——实时数据广播)+ SDO(服务数据对象——配置/参数读写)+ NMT(网络管理)+ SYNC/EMCY
典型应用电机驱动、传感器/执行器、医疗设备、机器人

SAE J1939(商用车与重型机械)

特性说明
标准化组织SAE(汽车工程师学会)
寻址方式29 位扩展 ID,划分为优先级、PDU 格式、目标地址、源地址等
数据编码Suspect Parameter Number(SPN)——每个信号有全局唯一的 19 位编号
速率典型 250 kbps / 500 kbps
典型应用卡车、客车、农用机械、工程机械——仪表盘、发动机 ECU、变速箱、制动系统

其他重要高层协议

协议领域特点
ISO 15765 (ISO-TP)汽车诊断在 CAN 上传输大于 8 字节的数据——UDS(统一诊断服务)和 OBD-II 的传输层
DeviceNet工业自动化基于 CAN 物理层的 CIP(通用工业协议),主要由 Rockwell/Allen-Bradley 推动
CANaerospace航空电子轻量级、高确定性的飞机内部通信
NMEA 2000船舶电子基于 J1939 的船舶网络标准

13. CAN 与其他总线协议对比

特性CANLINFlexRayEthernet (Automotive)
最大速率1 Mbps (经典)
8 Mbps (FD)
20 kbps10 Mbps100 Mbps – 10 Gbps
拓扑线性总线单主多从星型/总线/混合星型(交换机)
介质双绞线单线双绞线/光纤双绞线/光纤
成本极低中–高
实时确定性✅ 优秀✅ 优秀✅ 极佳(TDMA)⚠️ 需 TSN 支持
典型应用动力总成、车身、底盘车窗、座椅、雨刷线控制动、X-by-WireADAS、信息娱乐骨干
成本/节点$1–5$0.5–2$10–30$5–50
💡 现实格局: 现代汽车通常同时运行多种总线——CAN(动力总成/底盘控制)、LIN(简单执行器)、车载以太网(ADAS 摄像头/信息娱乐)。CAN 凭借其低成本、高可靠性和成熟的生态系统,在可预见的未来仍将占据核心地位。

14. 典型应用场景

行业具体应用常用高层协议
🚗 乘用车 发动机管理、变速箱控制、ABS/ESP 制动、空调、仪表盘、车身控制模块 ISO 15765 (UDS)、OEM 私有协议
🚛 商用车/工程机械 柴油机 ECU、后处理 SCR/DPF、自动变速箱、车载称重、车队管理 SAE J1939
🏭 工业自动化 伺服驱动、PLC 间通信、传感器网络、I/O 模块 CANopen、DeviceNet
🏥 医疗设备 CT/MRI 扫描台控制、输液泵、手术机器人 CANopen
🚢 船舶 引擎监控、GPS、深度探测、自动驾驶 NMEA 2000
🚀 航空航天 无人机飞控、卫星内部通信 CANaerospace
🔋 能源 电池管理系统(BMS)、光伏逆变器、充电桩 CANopen、私有协议

15. 总结与速查表

CAN 协议核心参数速查

参数经典 CAN 2.0CAN FD
标准ISO 11898-1:2003ISO 11898-1:2015
帧格式标准 11 bit / 扩展 29 bit同 CAN 2.0 + FDF 位标识
最大速率(仲裁)1 Mbps1 Mbps
最大速率(数据)= 仲裁速率≤ 8 Mbps(实际可更高)
有效载荷0 – 8 字节0 – 8, 12, 16, 20, 24, 32, 48, 64 字节
CRC15 位17 位 (≤ 16 B) / 21 位 (≥ 20 B)
帧尾EOF 7 隐性位EOF 7 隐性位(同)
帧间间隔IFS 3 隐性位IFS 3 隐性位(同)
错误检测5 种机制5 种机制 + 改进 CRC + 填充位计数
位填充动态(每次 5 相同位)仲裁阶段同;数据阶段固定偏移

CAN 设计哲学总结

🎯 优先级驱动消息 ID 即优先级——紧急事件天然优先
🔄 发布/订阅模型节点不关心谁接收——广播后由接收方过滤
🛡️ 分布式容错无单点故障——没有主节点,任何节点可随时加入/退出
⏱️ 实时确定性最坏情况延迟可计算——适合硬实时系统
🔌 即插即用新节点可接入运行中的总线(需正确配置速率和 ID 过滤)
📐 极简物理层一对差分信号线,无需复杂布线
🎯 记住这一点就够了:
CAN 总线的核心思想是——用一对差分信号线,通过基于优先级的非破坏性逐位仲裁,让多个节点在没有中央调度器的情况下自主、可靠、实时地共享数据。它从一个简单的汽车线束优化方案,成长为横跨汽车、工业、医疗、航空的通用嵌入式通信基础设施。理解 CAN,就理解了实时嵌入式网络设计的精髓。