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 RTUCAN
通信模型主从轮询 (Master-Slave)多主广播 (Multi-Master)
触发方式主机请求触发事件触发 / 周期性发送
实时性较低 (受轮询周期限制)极高 (高优先级消息几乎无延迟)
数据量单帧可大 (256 字节)单帧小 (每帧最多 8 字节)
抗干扰强 (RS-485)极强 (差分 + 硬件级错误处理)
典型应用传感器采集、参数配置车辆控制、运动控制、实时系统

为什么选择 CAN

  1. 实时控制:适合对延迟敏感的场合(如电机控制、车辆刹车)。
  2. 布线简单:两根线连接所有设备。
  3. 可靠性:硬件自动处理重发、错误检测和节点离线(Bus Off),软件负担极小。