Controller Area Network — 从汽车电子到工业控制的事实标准
CAN(Controller Area Network,控制器局域网)是一种多主站、基于消息广播的串行通信总线协议,专为在恶劣电磁环境中实现微控制器与设备之间的高可靠性、实时性通信而设计。
| 特征 | 说明 |
|---|---|
| 🔗 多主站架构 | 任何节点都可以主动发送数据,无需中心控制器协调 |
| 📨 基于消息的寻址 | 数据帧以消息 ID(标识符)寻址,而非节点地址;多个节点可同时接收同一消息 |
| ⚡ 非破坏性逐位仲裁 | 多个节点同时发送时,ID 最小的帧自动胜出,不会丢失任何已发送数据 |
| 🛡️ 多层错误检测 | 位错误、CRC 校验、位填充错误、格式错误、ACK 错误——五重检测机制 |
| 🔧 故障界定 | 节点自动检测自身故障程度并降级(Error Active → Error Passive → Bus Off) |
| 📏 短帧结构 | 数据帧有效载荷 0–8 字节(经典 CAN),最大 64 字节(CAN FD) |
| 🌡️ 恶劣环境适应 | 差分信号、共模抑制,天生抗电磁干扰(EMI) |
在 CAN 出现之前,汽车内部的电子控制单元(ECU)之间通过点对点线束连接。随着 ECU 数量从个位数激增到上百个,线束重量、成本和复杂度失控——豪华车线束总长度可超过 5 公里,重量超过 60 公斤。
| 问题 | CAN 的解决方案 |
|---|---|
| 🚗 线束爆炸 | 一条双绞线总线替代成百上千根点对点连线 |
| ⏱️ 实时性 | 确定性延迟——优先级最高的消息在最坏情况下的延迟是可精确计算的 |
| 🔒 数据一致性 | 广播式通信确保所有节点在同一时刻收到相同数据(组内一致性) |
| ⚡ 电磁兼容 | 差分信号(CAN_H / CAN_L)天然抗共模干扰,适合汽车点火系统等强 EMI 环境 |
| 🛡️ 故障安全 | 节点可自动退出总线而不影响其他节点通信(故障界定机制) |
| 传输介质 | 双绞线(屏蔽或非屏蔽),典型阻抗 120 Ω |
| 信号方式 | 差分电压信号(CAN_H 与 CAN_L) |
| 总线终端 | 两端各 120 Ω 终端电阻,抑制信号反射 |
| 最大速率 | 1 Mbps(经典 CAN,40 m 内) |
| 最大距离 | 约 1000 m(速率降至 ~50 kbps 时) |
| 节点数上限 | 理论无上限(ID 字段决定),实际受收发器驱动能力限制,通常 ≤ 30–120 |
| 拓扑 | 线性总线(Multi-Drop),允许多个短分支(Stub) |
CAN 使用两根信号线——CAN_H 和 CAN_L——传输互补的电压信号:
| 总线状态 | CAN_H 电压 | CAN_L 电压 | 差分电压 | 逻辑位 |
|---|---|---|---|---|
| 显性(Dominant) | ~3.5 V | ~1.5 V | ~2.0 V | 0 |
| 隐性(Recessive) | ~2.5 V | ~2.5 V | ~0 V | 1 |
| 比特率 | 最大总线长度(近似) |
|---|---|
| 1 Mbps | 40 m |
| 500 kbps | 100 m |
| 250 kbps | 250 m |
| 125 kbps | 500 m |
| 50 kbps | 1000 m |
这是由信号在电缆中的传播延迟决定的——仲裁机制要求一个位的时间必须足够长,让信号在最远两个节点之间往返。
| 标准 | 内容 |
|---|---|
| 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 收发器 |
CAN 2.0 定义了四种帧类型:
| 帧类型 | 英文 | 用途 | 方向 |
|---|---|---|---|
| 数据帧 | Data Frame | 发送节点向接收节点传输数据(最常用的帧) | 发送节点 → 接收节点 |
| 远程帧 | Remote Frame | 请求某个 ID 的数据(某个节点请求另一个节点发送特定数据) | 请求节点 → 数据源节点 |
| 错误帧 | Error Frame | 任何节点检测到总线错误时发送 | 任意节点 → 所有节点 |
| 过载帧 | Overload Frame | 在连续帧之间插入额外延迟(现代 CAN 控制器极少使用) | 接收节点 → 发送节点 |
这是 CAN 协议的核心——下面逐字段拆解 标准格式(11 位 ID)数据帧:
▲ 标准 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 位隐性,为控制器处理提供时间 |
| 特性 | 标准帧 (CAN 2.0A) | 扩展帧 (CAN 2.0B) |
|---|---|---|
| 标识符宽度 | 11 位 | 29 位(11 + 18) |
| 唯一 ID 数量 | 2,048 | 约 5.37 亿 |
| SRR 位 | 无 | 有(Substitute Remote Request,替代标准帧 RTR 位置) |
| 兼容性 | 仅标准帧控制器 | 扩展帧控制器兼容标准帧 |
| 典型应用 | 小型车身网络 | 复杂系统(J1939 卡车/客车网络) |
▲ 扩展 CAN 数据帧(29 位 ID)
从 SOF 到 CRC 序列(不含 CRC Delimiter)之间,发送方在每出现 5 个连续相同极性位后自动插入一个反极性位。接收方执行对称的去填充操作。
目的:
示例:
原始数据: 00000 11111 → (5 个 0,插入 1) (5 个 1,插入 0) 填充后: 000001111110
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 赢得仲裁,不损失任何已发送数据!
| # | 错误类型 | 检测方式 | 检测节点 |
|---|---|---|---|
| 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 若为主动错误标志期间) |
CAN 不使用独立的时钟线——时钟信号嵌入在数据流中,通过位边沿进行同步(异步串行通信)。每个位时间被划分为四个非重叠段:
| 段 | 缩写 | 功能 |
|---|---|---|
| 同步段 | SYNC_SEG | 位边沿预期出现的窗口——固定 1 Tq |
| 传播时间段 | PROP_SEG | 补偿物理信号在总线上的传播延迟——1–8 Tq |
| 相位缓冲段 1 | PHASE_SEG1 | 采样点之前的缓冲区——1–8 Tq;可被同步延长 |
| 相位缓冲段 2 | PHASE_SEG2 | 采样点之后的缓冲区——2–8 Tq;可被同步缩短 |
采样点(Sample Point)位于 PHASE_SEG1 结束处,即总线电平被读取为逻辑值的位置。典型设置在位的 75%–87.5% 处。
CAN FD(CAN with Flexible Data-Rate)是 CAN 2.0 的直接演进,在保持向后兼容性的同时,解决了经典 CAN 的两大瓶颈——1 Mbps 速率上限和每帧最多 8 字节有效载荷。
| 特性 | 经典 CAN | CAN 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 FD 新增/改变,数据段以高速率传输
经典 CAN 的 DLC 直接表示 0–8。CAN FD 复用 DLC 的 9 个值映射到更大范围:
| DLC 值 | 数据长度 | DLC 值 | 数据长度 |
|---|---|---|---|
| 0 – 8 | 0 – 8 字节 | 12 | 24 字节 |
| 9 | 12 字节 | 13 | 32 字节 |
| 10 | 16 字节 | 14 | 48 字节 |
| 11 | 20 字节 | 15 | 64 字节 |
CAN XL(Extra Large)是 CAN 协议族的第三个主要世代,目标是将有效载荷提升至 2048 字节、数据阶段速率提升至 10+ Mbps,同时保持与经典 CAN 和 CAN FD 的物理层兼容(共用总线收发器)。
| 特性 | 经典 CAN | CAN FD | CAN XL |
|---|---|---|---|
| 发布年份 | 1991 | 2012 | 2024 (CiA 规范) |
| 最大有效载荷 | 8 字节 | 64 字节 | 2048 字节 |
| 数据阶段速率 | 1 Mbps | ≤ 8 Mbps | 10–20 Mbps |
| CRC | 15 位 | 17/21 位 | 多种选项 |
| 与旧设备共存 | — | ✅ 同总线共存 | ✅ 同总线共存 |
| 主要目标 | 车身控制 | ECU 刷写、诊断 | ADAS、雷达/摄像头原始数据、SOA 骨干 |
CAN 规范只定义了物理层和数据链路层(OSI 第 1、2 层)。要在实际系统中使用,还需要高层协议定义 ID 分配、数据编码、网络管理等。以下是两个最主流的高层协议:
| 特性 | 说明 |
|---|---|
| 标准化组织 | CiA(CAN in Automation),标准:CiA 301 |
| 寻址方式 | 11 位 ID 被分为 4 位功能码(FCC)+ 7 位节点 ID |
| 核心概念 | 对象字典(Object Dictionary)——每个设备的所有参数和数据统一映射到 16 位索引 × 8 位子索引的表格 |
| 通信模型 | PDO(过程数据对象——实时数据广播)+ SDO(服务数据对象——配置/参数读写)+ NMT(网络管理)+ SYNC/EMCY |
| 典型应用 | 电机驱动、传感器/执行器、医疗设备、机器人 |
| 特性 | 说明 |
|---|---|
| 标准化组织 | 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 的船舶网络标准 |
| 特性 | CAN | LIN | FlexRay | Ethernet (Automotive) |
|---|---|---|---|---|
| 最大速率 | 1 Mbps (经典) 8 Mbps (FD) | 20 kbps | 10 Mbps | 100 Mbps – 10 Gbps |
| 拓扑 | 线性总线 | 单主多从 | 星型/总线/混合 | 星型(交换机) |
| 介质 | 双绞线 | 单线 | 双绞线/光纤 | 双绞线/光纤 |
| 成本 | 低 | 极低 | 高 | 中–高 |
| 实时确定性 | ✅ 优秀 | ✅ 优秀 | ✅ 极佳(TDMA) | ⚠️ 需 TSN 支持 |
| 典型应用 | 动力总成、车身、底盘 | 车窗、座椅、雨刷 | 线控制动、X-by-Wire | ADAS、信息娱乐骨干 |
| 成本/节点 | $1–5 | $0.5–2 | $10–30 | $5–50 |
| 行业 | 具体应用 | 常用高层协议 |
|---|---|---|
| 🚗 乘用车 | 发动机管理、变速箱控制、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、私有协议 |
| 参数 | 经典 CAN 2.0 | CAN FD |
|---|---|---|
| 标准 | ISO 11898-1:2003 | ISO 11898-1:2015 |
| 帧格式 | 标准 11 bit / 扩展 29 bit | 同 CAN 2.0 + FDF 位标识 |
| 最大速率(仲裁) | 1 Mbps | 1 Mbps |
| 最大速率(数据) | = 仲裁速率 | ≤ 8 Mbps(实际可更高) |
| 有效载荷 | 0 – 8 字节 | 0 – 8, 12, 16, 20, 24, 32, 48, 64 字节 |
| CRC | 15 位 | 17 位 (≤ 16 B) / 21 位 (≥ 20 B) |
| 帧尾 | EOF 7 隐性位 | EOF 7 隐性位(同) |
| 帧间间隔 | IFS 3 隐性位 | IFS 3 隐性位(同) |
| 错误检测 | 5 种机制 | 5 种机制 + 改进 CRC + 填充位计数 |
| 位填充 | 动态(每次 5 相同位) | 仲裁阶段同;数据阶段固定偏移 |
| 🎯 优先级驱动 | 消息 ID 即优先级——紧急事件天然优先 |
| 🔄 发布/订阅模型 | 节点不关心谁接收——广播后由接收方过滤 |
| 🛡️ 分布式容错 | 无单点故障——没有主节点,任何节点可随时加入/退出 |
| ⏱️ 实时确定性 | 最坏情况延迟可计算——适合硬实时系统 |
| 🔌 即插即用 | 新节点可接入运行中的总线(需正确配置速率和 ID 过滤) |
| 📐 极简物理层 | 一对差分信号线,无需复杂布线 |