CAN 总线协议入门与实战
CAN(Controller Area Network)总线最初由 Bosch 公司为汽车开发,因其高可靠性、实时性和抗干扰能力,现已广泛应用于汽车电子、工业自动化、医疗设备等领域。本文将介绍 CAN 总线的基础知识。
1. 物理层:差分电平
CAN 总线也是基于差分信号传输的(类似 RS-485),但电平定义不同。它仅有两条线:CAN_H 和 CAN_L。
CAN 不像 RS-485 那样定义 “0” 和 “1”,而是定义了 显性电平 (Dominant) 和 **隐性电平 (Recessive)**。
- **显性电平 (逻辑 0)**:CAN_H - CAN_L ≈ 2V (CAN_H=3.5V, CAN_L=1.5V)。
- **隐性电平 (逻辑 1)**:CAN_H - CAN_L ≈ 0V (两条线都约为 2.5V)。
线与机制(Wired-AND):这是 CAN 总线最核心的物理特性。只要总线上有一个节点发送显性电平(0),总线就是显性电平。只有所有节点都发送隐性电平(1),总线才表现为隐性电平。这也解释了为什么 0 是显性。
2. 帧结构(标准帧 vs 扩展帧)
CAN 数据以帧(Frame)为单位传输。最常用的是 数据帧。
标准帧 (Standard Frame) - CAN 2.0A
- **Arbitration Field (仲裁场)**:包含 11位 ID 和 RTR 位。
- **Control Field (控制场)**:包含 DLC (Data Length Code),表示数据长度(0-8字节)。
- **Data Field (数据场)**:0-8 字节的有效载荷。
- CRC Field:校验码。
- ACK Field:应答位。
扩展帧 (Extended Frame) - CAN 2.0B
- Arbitration Field:包含 29位 ID (11位 Base ID + 18位 Extended ID)。
- 其余部分类似。
3. 仲裁机制 (Arbitration)
CAN 总线没有主从之分(Multi-Master),任何节点都可以在空闲时发送数据。如果多个节点同时发送,如何避免冲突?答案是非破坏性位仲裁。
利用 “线与” 机制:
- 所有节点同步发送 ID。
- 节点一边发,一边监听总线电平。
- 如果节点发送 1 (隐性),但监听到总线是 0 (显性),说明有优先级更高的节点在发送。
- 该节点立即停止发送,转为接收状态。
结论:ID 值越小,优先级越高(前导 0 越多,越容易占据总线)。
4. 错误处理与离线机制
CAN 拥有强大的错误检测机制(位错误、填充错误、CRC 错误等)。
- TEC/REC:每个节点都有发送错误计数器 (TEC) 和接收错误计数器 (REC)。
- Error Active:正常状态,发现错误发送主动错误帧(6个显性位)。
- Error Passive:错误较多,发送被动错误帧(6个隐性位),不影响总线。
- Bus Off:TEC > 255,节点自动脱离总线,停止通信。
5. 总结与应用
在编写 CAN 驱动或应用层协议时,需要注意:
- 波特率计算:CAN 时钟分频、时间段(BS1, BS2)设置比较复杂,需仔细计算采样点(通常在 75%-87.5% 处)。
- 过滤器配置:为了减轻 CPU 负担,务必配置硬件过滤器(Filter),只接收关心的 ID。
- 终端电阻:同样需要 120Ω 终端电阻,防止反射。
CAN 总线虽然配置繁琐,但其硬件级的重发和校验机制,让软件层省去了很多可靠性设计的麻烦。
- Title: CAN 总线协议入门与实战
- Author: Evek Golden
- Created at : 2025-05-05 00:02:00
- Updated at : 2026-06-12 08:57:02
- Link: https://blog.cocodemo.uno/posts/can7m3p/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments