CAN通信协议详解:从入门到实践

来源:谈思实验室
2026-05-09
3156

摘要:本文主要讲述了CAN协议的基本概念和应用原理,主要从“CAN协议的应用范围与常见场景、CAN应用层协议常见分类及异同、CAN的底层电气规则及CAN帧结构、CAN协议控制器原理、实际应用中的常见问题及调试步骤”5个方面进行了阐述。

1

CAN协议的应用范围与常见场景

1.1 CAN总线简介

CAN(Controller Area Network,控制器局域网络)是由德国Bosch公司于1983年开发的串行通信协议,最初专为汽车电子系统设计,如今已广泛应用于工业自动化、医疗设备、航空航天等多个领域。

1.2 核心应用领域

1.2.1 汽车电子

CAN总线是汽车网络的核心技术,主要应用于:

  • 动力系统:发动机控制单元(ECU)、变速箱控制、ABS/ESP系统

  • 车身控制:车灯、雨刷、车窗、空调等舒适系统

  • 底盘安全:安全气囊、助力转向、胎压监测(TPMS)

  • 信息娱乐:仪表盘、导航系统、车载娱乐

一辆中高端汽车通常包含5-10条CAN总线,连接50-100个电子控制单元。

1.2.2 工业自动化

在工业领域,CAN总线被大量采用:

  • PLC控制系统:工业机器人的关节控制、产线协调

  • 过程控制:工厂自动化产线的实时监控

  • 电机驱动:伺服电机、步进电机的精确控制

  • 传感器网络:工业传感器的数据采集与传输

1.2.3 航空航天

航天嵌入式系统对可靠性的要求极高,CAN总线凭借其出色的容错能力,在以下场景得到应用:

  • 卫星姿态控制系统的内部通信

  • 运载火箭的遥测与控制

  • 航空电子设备的机内网络

  • 无人机飞控系统

1.2.4 其他领域

  • 医疗设备:CT扫描仪、MRI设备、输液泵

  • 船舶系统:船舶动力系统、导航设备

  • 轨道交通:地铁控制、列车通信网络

1.3 为什么选择CAN总线?

图片

1.4 CAN与其他总线协议的对比

在汽车和工业领域,CAN面临多种竞争协议的选择:

图片

结论:CAN在可靠性和成本之间取得了最佳平衡,特别适合对实时性和确定性有要求的中等速率应用场景。

2

CAN应用层协议常见分类及异同

2.1 应用层协议概述

CAN协议仅定义了物理层和数据链路层(ISO 11898),在实际应用中需要定义应用层协议来实现具体的通信语义。主要的CAN应用层协议包括:SAE J1939、ISO 15765(OBD-II)、DeviceNet、NMEA 2000等。

▲ CAN应用层协议分类:按应用领域划分的典型协议

2.2 主流应用层协议详解

2.2.1 SAE J1939

SAE J1939是美国汽车工程师协会制定的商用车CAN总线标准,是目前最广泛使用的商用车网络协议。

特点:

  • 基于CAN 2.0B(29位扩展帧ID)

  • 专为卡车、客车、农业机械设计

  • 支持250kbps和500kbps两种波特率

  • 定义了完整的参数组(PGN)和可疑参数编号(SPN)

29位ID结构:

图片
  • Priority(P):报文优先级,0最高,7最低

  • R:保留位,固定为0

  • DP:数据页扩展位

  • PF:PDU格式,决定是组播还是点对点

  • PS:PDU特定段,PF<240时表示目标地址,PF≥240时表示组编号

  • SA:源地址,标识发送节点

典型应用:

  • 发动机转速、扭矩、油温、水温的实时监控

  • 变速箱状态与控制

  • 车辆行驶数据记录

  • 故障诊断与报警

2.2.2 ISO 15765(OBD-II诊断协议)

ISO 15765定义了基于CAN总线的车载诊断系统(OBD-II)通信协议。

特点:

  • 主要用于乘用车诊断

  • 标准化诊断请求与响应格式

  • 支持9种标准诊断服务模式(Mode)

诊断服务模式:

图片

2.2.3 DeviceNet

DeviceNet是Rockwell Automation开发的工业自动化协议,基于CAN 2.0A(11位标准帧)。

特点:

  • 主从结构与多主从结构并存

  • 支持DeviceNet对象库

  • 最多64个节点

  • 传输速率:125kbps/250kbps/500kbps

典型应用:

  • 工业传感器与执行器的联网

  • 电机启动器、继电器模块

  • 过程仪表数据采集

2.2.4 NMEA 2000

NMEA 2000是海洋电子设备的通信标准,由美国国家海洋电子协会制定。

特点:

  • 基于J1939扩展

  • 标准化了船舶电子设备的通信

  • 支持即插即用

  • 250kbps波特

典型应用:

  • GPS/北斗定位系统

  • 深度探测声纳

  • 船舶发动机监控

  • 舵角指示器

2.3 主流协议的对比与选型

图片

2.4 协议选择指南

图片

3

CAN的底层电气规则及CAN帧结构

3.1 CAN物理层电气特性

3.1.1 差分信号传输

CAN总线采用差分信号传输方式,使用两条导线:CAN_H(高)和CAN_L(低)。

▲ CAN显性/隐性电平定义:差分电压决定逻辑值

电平定义:

图片

关键特性:

  • 显性位(0)会覆盖隐性位(1)——这就是CAN总线仲裁的基础

  • 差分传输有效抑制共模干扰

  • 双线拧合具有良好的电磁兼容性(EMC)

3.1.2 终端电阻

CAN总线两端必须接120Ω终端电阻,用于:

  • 吸收信号反射

  • 提供稳定的直流偏置

  • 维持总线特性阻抗(120Ω)

▲ 终端电阻配置:仅总线两端各一个120Ω,总阻值60Ω

终端电阻位置:

  • 仅在总线两端的节点上加

  • 中间节点不应加终端电阻

  • 使用CANalyzer或示波器测量波形确认终端匹配

3.1.3 传输距离与速率

CAN总线的传输距离与波特率成反比:

图片

计算原则:信号上升时间应小于总线最大延迟的3-5倍。

3.2 CAN帧结构详解

3.2.1 帧的类型

CAN协议定义了5种类型的帧:

图片

3.2.2 标准数据帧(11位ID)

标准数据帧是CAN 2.0A格式,使用11位标识符:

▲ CAN数据帧结构:标准帧各字段组成

各字段详解:

图片

各字段详解:

  1. SOF(Start of Frame):帧起始,由1个显性位组成,用于同步所有节点

  2. 仲裁段(Arbitration Field):显性(0)= 数据帧;隐性(1)= 远程帧

  3. 11位标识符:报文唯一标识,值越小优先级越高

  4. RTR位:远程传输请求位

  5. 控制段(Control Field):显性(0)= 标准帧;隐性(1)= 扩展帧

  6. IDE:标识符扩展位

  7. r0:保留位,显性

  8. DLC(Data Length Code):数据长度码,4位,表示数据字节数(0-8)

  9. 数据段(Data Field):0-8字节的有效数据

  10. CRC段(CRC Field):15位CRC序列:基于多项式计算;1位CRC界定符:隐性位

  11. ACK段(ACK Field):ACK槽:接收节点发送显性位表示正确接收;ACK界定符:隐性位

  12. EOF(End of Frame):7个隐性位,帧结束

  13. IFS(Inter Frame Space):3位帧间隔

3.2.3 扩展数据帧(29位ID)

扩展帧是CAN 2.0B格式,使用29位标识符:

▲ CAN扩展帧结构:29位ID与标准帧的对比

扩展帧ID结构(29位):

图片

3.2.4 远程帧

远程帧用于请求其他节点发送数据,结构与数据帧类似:

图片

3.2.5 错误帧

当节点检测到错误时,发送错误帧:

错误帧结构:

图片

错误类型:

图片

3.2.6 位填充规则(Bit Stuffing)

为保证同步,CAN采用位填充机制:

规则:当发送端检测到数据段、仲裁段、控制段中连续出现5个相同电平位时,必须自动插入1个相反电平位。

位填充示例:

原始数据:  11111000011
填充后:    111110011001011   (在5个1后插入0,在5个0后插入1)

接收端自动去除填充位,恢复原始数据。

3.3 CAN总线仲裁机制

CAN总线采用非破坏性仲裁,当多个节点同时发送时,通过ID逐位比较决定优先级:

图片

▲ CAN仲裁流程:节点发送同时监听,非破坏性优先级仲裁

仲裁原理:

  1. 节点发送的同时监听总线

  2. 若发送显性位(0)但读到隐性位(1),说明有更高优先级,退出竞争

  3. 最终赢得总线的节点继续发送,优先级最高

ID优先级示例:

图片

结论:ID数值越小,优先级越高。ID=0x000拥有最高优先级。

4

CAN协议控制器原理

4.1 CAN控制器架构

CAN控制器是实现CAN协议的核心硬件,负责处理数据链路层的所有功能。

▲ CAN控制器架构:核心模块与数据流向

4.1.1 控制器核心模块

典型的CAN控制器内部包含以下模块:

图片

4.2 位时序与波特率配置

4.2.1 位时间结构

CAN总线的一个位时间分为4个段:

▲ CAN位时序结构:同步段、传播段、相位缓冲段

图片

4.2.2 波特率计算

波特率 = CAN时钟频率 / (BRP × (SYNC_SEG + PROP_SEG + PS1 + PS2))

其中:

  • BRP(波特率预分频器):1-64

  • Tq(时间量子) = BRP / CAN时钟

配置示例(CAN时钟=8MHz,目标波特率=500kbps):

// 最佳配置(采样点87.5%)
SYNC_SEG = 1
PROP_SEG = 1
PS1 = 7
PS2 = 2
BRP = 2

// Tq = 2 / 8MHz = 0.25μs
// 1位时间 = (1+1+7+2) × 0.25μs = 2.75μs
// 波特率 = 1 / 2.75μs = 363.6kbps ≈ 500kbps

4.2.3 采样点配置

采样点位置对通信可靠性至关重要:

图片

// 采样点计算公式
sample_point = (SYNC_SEG + PROP_SEG + PS1) / Total_Bit_Time × 100%

// 示例(87.5%采样点)
sample_point = (1 + 1 + 7) / (1+1+7+2) × 100% = 81.8%  // 接近目标

4.3 发送与接收流程

▲ CAN发送接收时序:CPU与控制器的交互过程

4.3.1 发送流程

  1. CPU写入TX缓冲区(ID + DLC + DATA)

  2. 控制器进行位填充

  3. 并行转串行,从TX引脚发出

  4. 发送完成后等待ACK响应

  5. 发送完成中断通知CPU

4.3.2 接收流程

  1. RX引脚接收串行数据

  2. 串行转并行,去除位填充

  3. CRC校验

  4. 验收滤波决定是否接收

  5. 写入RX缓冲区

  6. 接收完成中断通知CPU

4.4 验收滤波器

验收滤波器是CAN控制器的关键功能,决定哪些帧被接收:

4.4.1 单滤波器模式

单滤波器同时检查ID和数据段的第一个字节:

// 单滤波器配置示例
// 假设要接收ID=0x123的帧
Filter_Config = 0x123 << 5;  // 只关心ID的高11位
Mask_Config = 0x7FF;         // 全部11位都参与比较

4.4.2 双滤波器模式

双滤波器可以同时监控两个不同的ID范围:// 滤波器0:接收ID范围 0x100-0x10F
Filter0_Config = 0x100 << 5;
Mask0_Config = 0xFF8;  // 只关心高5位

// 滤波器1:接收ID 0x200
Filter1_Config = 0x200 << 5;
Mask1_Config = 0x7FF;  // 全部比较

4.5 错误状态与处理

CAN节点有3种错误状态:

▲ CAN错误状态机:主动错误→被动错误→总线关闭

图片

4.6 典型CAN控制器芯片

图片

4.6.1 MCP2515寄存器配置示例

// MCP2515初始化配置
void MCP2515_Init(void) {
// 配置波特率:500kbps @ 16MHz
// BRP=2, SYNC=1, PROP=1, PS1=6, PS2=1

    SPI_Write(CNF1, 0x01);  // BRP=2, SJW=1
    SPI_Write(CNF2, 0xB1);  // BLTMODE=1, SAM=1, PHSEG1=7
    SPI_Write(CNF3, 0x01);  // PHSEG2=1

    SPI_Write(CANINTE, 0x00);  // 关闭中断
    SPI_Write(CANCTRL, 0x00);  // 正常模式
}

// 发送一帧数据
voidMCP2515_TxMessage(uint16_t id, uint8_t dlc, uint8_t *data) {
    uint8_t sidh = (id >> 3) & 0xFF;
    uint8_t sidl = (id << 5) & 0xE0;

    SPI_Write(TXB0SIDH, sidh);
    SPI_Write(TXB0SIDL, sidl);
    SPI_Write(TXB0DLC, dlc & 0x0F);

for (int i = 0; i < dlc; i++) {
        SPI_Write(TXB0D0 + i, data[i]);
    }

    SPI_Write(TXB0CTRL, 0x08);  // TXREQ
}

5

实际应用中的常见问题及调试步骤

5.1 常见问题分类

▲ CAN调试流程:硬件→软件→总线问题逐级排查

5.1.1 硬件相关问题

图片

5.1.2 电气特性问题排查

终端电阻配置错误

图片

接地电位差问题

当不同节点存在接地电位差时(>2V),会导致通信错误。

解决方案:

  • 使用隔离CAN收发器

  • 统一接地电位

  • 在CAN_GND线上串联阻值平衡

5.1.3 软件配置问题

图片

5.2 调试工具与方法

5.2.1 示波器/逻辑分析仪调试

观测要点:

  1. SOF位:确认帧起始正确(1位显性)

  2. 差分电压:显性≥2V,隐性≤0.5V

  3. 波形完整性:无畸形、无毛刺

  4. ACK位:确认接收节点应答

  5. 帧间隔:确认正确间隔

5.2.2 CAN分析仪使用

推荐工具:

图片

分析流程:

  1. 连接硬件:CAN接口 → 分析仪 → PC

  2. 配置参数:波特率、采样点、终端电阻

  3. 监控总线:捕获帧、过滤ID、记录时序

  4. 分析问题:错误帧统计、丢帧率、延迟

5.2.3 软件调试技巧

图片

5.3 典型故障案例分析

案例1:汽车CAN总线偶发通信故障

故障现象:

  • 车辆行驶中偶发仪表盘显示异常

  • 故障码P0300(多缸失火)

诊断过程:

  1. 使用CANoe监控总线,发现偶发错误帧

  2. 检查波形,发现低频干扰

  3. 定位发动机舱线束与点火线圈线缆并行

解决方案:

  • 重新布线,增加CAN线与高压线间距

  • 加装共模扼流圈

  • 改进接地,使用星型接地

案例2:CAN波特率不匹配

故障现象:

  • 新节点无法加入CAN网络

  • 无ACK响应

诊断过程:

  1. 测量新节点波特率:250kbps

  2. 目标网络波特率:500kbps

  3. 晶振频率偏差导致配置错误

解决方案:

// 正确配置(8MHz晶振,500kbps)
// BRP=2, SYNC=1, PROP=1, PS1=7, PS2=2
CNF1 = 0x01;  // BRP=2
CNF2 = 0xB1;  // PHSEG1=7
CNF3 = 0x02;  // PHSEG2=2

案例3:终端电阻缺失

故障现象:

  • 节点间距超过100米时通信不稳定

  • 严重反射波

诊断过程:

  1. 测量总线阻抗≠60Ω

  2. 发现终端电阻失效

解决方案:

  • 更换120Ω终端电阻

  • 确保总线两端各有终端

5.4 调试检查清单

图片

6

附录

附录A:CAN常用波特率配置表

图片

附录B:常用CAN芯片选型

图片

附录C:参考文献

  1. ISO 11898-1:2015 - Road vehicles – Controller area network (CAN)

  2. BOSCH CAN Specification 2.0

  3. SAE J1939 Standard

  4. NXP SJA1000 datasheet

  5. Microchip MCP2515 datasheet

收藏
点赞
2000