CAN (Controller Area Network)
CAN 总线是一种功能丰富的串行总线标准,以其高可靠性和实时性著称,最初由 Bosch 公司为汽车行业开发,现已广泛应用于工业自动化、船舶、医疗等领域。
协议概述
- 历史:1986 年由 Bosch 发布,1993 年成为 ISO 标准 (ISO 11898)。
- 架构:**多主(Multi-Master)**架构,网络上任意节点均可在总线空闲时发送数据。
- 物理层:使用双绞线传输差分信号 (CAN_H, CAN_L),抗干扰能力极强。
- 终端电阻:总线两端需各接一个 120Ω 电阻以抑制反射。
通信模式:事件触发与广播
与 Modbus 的“轮询”模式不同,CAN 采用事件触发和广播模式:
sequenceDiagram participant NodeA as 节点 A (电机) participant NodeB as 节点 B (控制器) participant NodeC as 节点 C (显示屏) Note over NodeA: 状态改变 NodeA->>NodeB: 广播消息 (ID: 0x123, Data: Speed) NodeA->>NodeC: (同时接收到消息) Note over NodeB: 需要发送指令 NodeB->>NodeA: 广播消息 (ID: 0x200, Data: Cmd) NodeB->>NodeC: (同时接收到消息)
特点:
- 主动推送:节点有数据时主动发送,无需主机轮询。
- 基于消息 ID:通信不针对特定地址,而是基于内容 (Message ID)。所有节点都能收到消息,根据 ID 决定是否处理。
- 非破坏性仲裁:多个节点同时发送时,ID 值越小,优先级越高。高优先级消息继续发送,低优先级节点自动停止并等待,总线数据不会混乱。
帧结构 (标准帧 2.0A)
一个标准 CAN 数据帧主要包含以下部分:
SOF ID RTR IDE r0 DLC Data CRC ACK EOF
┌───┬────────┬───┬───┬───┬───────┬───────────┬───────┬───┬───────┐
│ 1 │ 11 │ 1 │ 1 │ 1 │ 4 │ 0 ~ 64 │ 15 │ 2 │ 7 │ (bits)
└───┴────────┴───┴───┴───┴───────┴───────────┴───────┴───┴───────┘- ID (11 bits):消息标识符,决定优先级(越小越高)。
- DLC (4 bits):数据长度代码,指示数据字节数 (0-8 bytes)。
- Data (0-8 bytes):实际有效载荷。
- CRC (15 bits):循环冗余校验,保证数据完整性。
- ACK (2 bits):应答位,接收节点确认收到。
总开销: 一个包含 8 字节数据的标准帧,总长度约为 108 位 (含填充位)。 在 500 kbps 波特率下,传输一帧约需 。
Modbus RTU vs CAN
| 特性 | Modbus RTU | CAN |
|---|---|---|
| 通信模型 | 主从轮询 (Master-Slave) | 多主广播 (Multi-Master) |
| 触发方式 | 主机请求触发 | 事件触发 / 周期性发送 |
| 实时性 | 较低 (受轮询周期限制) | 极高 (高优先级消息几乎无延迟) |
| 数据量 | 单帧可大 (256 字节) | 单帧小 (每帧最多 8 字节) |
| 抗干扰 | 强 (RS-485) | 极强 (差分 + 硬件级错误处理) |
| 典型应用 | 传感器采集、参数配置 | 车辆控制、运动控制、实时系统 |
为什么选择 CAN
- 实时控制:适合对延迟敏感的场合(如电机控制、车辆刹车)。
- 布线简单:两根线连接所有设备。
- 可靠性:硬件自动处理重发、错误检测和节点离线(Bus Off),软件负担极小。