CAN通信协议入门
CAN(Controller Area Network)通信协议是工业控制、汽车电子等领域极其重要的串行通信总线标准。它以其高可靠性、实时性、抗干扰能力和多主机结构而著称。下面是关于系统性地入门CAN协议的整理:
一、 CAN协议的核心设计目标
- 可靠性: 在电磁干扰强烈的环境(如汽车引擎舱)下稳定工作。
- 实时性: 对传输延迟有严格要求,关键信息能优先发送。
- 多主结构: 没有传统意义上的“主/从”机之分,网络上任何节点都可以在总线空闲时主动发送信息(广播)。
- 基于优先级的总线访问: 通过非破坏性的“仲裁”机制解决多个节点同时发送的冲突,让高优先级的信息先发送。
- 广播通信: 一个节点发送的信息,所有其他节点都能收到(但可以选择是否处理)。
- 错误检测与处理: 内置强大的错误检测机制(CRC、位填充、ACK、帧检查等)和错误处理(节点自动关闭输出)。
二、 CAN协议的核心概念
-
差分信号:
- CAN使用两条线传输信号:CAN_H和CAN_L。
- 信号状态由两条线之间的电压差表示:
- 显性电平: CAN_H - CAN_L ≈ 2V (通常代表逻辑 0)。这是总线上的“强势”状态。
- 隐性电平: CAN_H - CAN_L ≈ 0V (通常代表逻辑 1)。这是总线上的“弱势”状态。
- 优点: 抗共模干扰能力强(比如电源噪声同时影响两条线时,电压差基本不变)。
-
总线拓扑:
- 所有节点(ECU - Electronic Control Unit)都挂接在一条总线上(CAN_H和CAN_L)。
- 总线两端需要终端电阻(通常是120Ω),用于匹配线路阻抗,消除信号反射。
-
消息帧(Message Frame):
- CAN通信的基本单位是“帧”(Frame)。节点发送数据时,是以“帧”的形式广播出去的。
- 标准帧: 11位标识符(ID),数据域最多8字节。
- 扩展帧: 29位标识符(ID),数据域最多8字节(使用更广泛)。
- 关键字段:
- 标识符: 唯一标识一个消息(在同一个网络上不能重复)。它决定了消息的优先级!ID值越小,优先级越高。 非常重要!
- 数据长度码: 指示数据域包含的字节数(0-8)。
- 数据域: 实际要传输的数据(0-8字节)。虽然短,但适合传输控制指令、状态信息等。
- CRC: 循环冗余校验码,用于接收方检查数据是否正确。
- ACK槽: 发送方会留一个位时间(ACK Slot)。所有正确接收到该帧(无CRC错误) 的节点,无论其是否需要该帧数据,都会在这个槽内发送一个显性位(0)来应答发送方。如果发送方没收到ACK,就知道发送失败,会尝试重发。
-
非破坏性逐位仲裁:
- 核心机制: 当多个节点同时开始发送时,它们一边发送自己的ID位,一边监听总线状态。
- 仲裁规则:
- 节点发送隐性位(1),但监听到总线是显性位(0) -> 说明有更高优先级的节点在发送显性位 -> 本节点立即停止发送,转为接收模式。
- 节点发送显性位(0),监听到总线也是显性位(0) -> 继续发送。
- 节点发送隐性位(1),监听到总线也是隐性位(1) -> 继续发送。
- 结果: 优先级最高(ID值最小)的帧会赢得仲裁,完整发送出去。其他节点在仲裁过程中退出发送,并在总线空闲后自动重试。这个过程不会破坏正在发送的高优先级帧的数据。
-
错误检测与处理:
- CAN协议设计了5种错误检测机制:
- 位监控: 发送节点同时监听总线,确保发送的位与读回的位一致。
- 位填充: 为了保证同步,在连续发送5个相同极性位后,自动插入一个相反极性的位。接收方会删除这个填充位。如果检测到连续6个相同位,就认为是错误(填充规则违反)。
- 帧检查: 检查帧格式中固定格式位(如CRC界定符、ACK界定符、帧结束等)是否正确。
- CRC校验: 接收方独立计算CRC,并与收到的CRC比较。
- ACK检查: 发送方检查是否在ACK槽收到了显性位。
- 错误处理:
- 每个节点内部有一个发送错误计数器和接收错误计数器。
- 检测到错误时,节点会立即发送一个“错误帧”(连续6个显性位)来主动破坏当前总线上的错误传输,通知所有节点。
- 根据错误类型(是发送错误还是接收错误)和严重程度,计数器会增加。
- 当计数器超过一定阈值时,节点会进入不同的错误状态(错误主动 -> 错误被动 -> 总线关闭),限制其发送能力,避免故障节点持续干扰总线。
- CAN协议设计了5种错误检测机制:
三、 CAN协议的分层模型(OSI简化版)
- 物理层: 定义电气特性(电压、信号、线缆、连接器、终端电阻)、比特率(常见125kbps, 250kbps, 500kbps, 1Mbps)。负责实际电平转换和收发。
- 数据链路层: 这是CAN协议的核心。包含:
- LLC (Logical Link Control): 帧接收过滤、过载通知、恢复管理。
- MAC (Medium Access Control): 帧封装/解封、帧编码(位填充)、错误检测/信令、仲裁、ACK应答、串行化/反串行化。定义帧结构和总线访问规则(仲裁)。
- 应用层: CAN协议本身不定义应用层!它只负责可靠地传输原始数据帧。实际应用中需要更高层的协议来定义数据的含义、命令、状态、网络管理、节点诊断等。常见的基于CAN的应用层协议有:
- CANopen: 广泛应用于工业自动化、医疗设备等。
- J1939: 商用车(卡车、客车、工程机械、船舶)标准。
- DeviceNet: 工业自动化领域。
- ISO-TP (ISO 15765-2): 用于在CAN上传输超过8字节的长数据(如汽车诊断UDS/OBD-II)。
四、 CAN协议的特点总结
- 优点:
- 高可靠性和强大的错误处理能力。
- 实时性好(基于优先级仲裁)。
- 多主结构,灵活组网。
- 抗干扰能力强(差分信号)。
- 成本相对较低(双绞线即可)。
- 缺点:
- 数据负载较小(最大8字节/帧),传输大块数据效率低(需上层协议如ISO-TP分包)。
- 协议本身不定义数据含义(需应用层协议)。
- 带宽有限(最高1Mbps,实际常用500kbps或更低)。
- 总线拓扑长度和速度成反比(1Mbps时典型长度<40米)。
五、 典型应用领域
- 汽车电子: 发动机控制、变速箱控制、ABS、安全气囊、车身控制(门窗、灯光)、仪表盘、信息娱乐系统等。现代汽车可能有多个CAN网络(高速CAN, 低速容错CAN)。
- 工业自动化: PLC、传感器、执行器、电机驱动器、HMI之间的通信。
- 医疗设备: 医疗仪器内部组件通信。
- 楼宇自动化: 电梯控制、HVAC系统。
- 航空航天: 飞机内部子系统通信(有更严格的变种如CAN Aerospace)。
- 船舶: 发动机监控、导航系统。