精讲CAN通信协议!从底层原理到工程实践,零基础也能看懂

第一章 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总线?

特性 CAN总线优势
可靠性 错误检测与自动重发机制,电磁兼容性好
实时性 短帧结构(最多8字节),仲裁机制保证优先级
成本 简单双线差分传输,无需复杂总线仲裁器
灵活性 多主从结构,节点可自由加入/离开
距离 高速CAN(1Mbps)传输距离40m,低速CAN(125kbps)可达500m

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

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

特性 CAN LIN FlexRay
传输速率 1Mbps max 20kbps max 20Mbps max
数据长度 8字节 8字节 64-192字节
拓扑结构 总线型 总线型 星型/总线
成本 中等 低 高
典型应用 核心控制 舒适系统 高速安全

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

第二章 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 R DP PF PS SA
位数 3位 1位 1位 8位 8位 8位
说明 优先级0-7 保留位 数据页 PDU格式 PDU特定 源地址
  • 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)

诊断服务模式:

Mode 功能 示例
Mode 01 当前诊断数据 实时氧传感器读数
Mode 02 冻结帧数据 故障发生时的快照
Mode 03 存储的故障码 读取历史故障
Mode 04 清除故障码 复位故障指示灯
Mode 05 氧传感器监控数据 催化器前/后氧传感器
Mode 07 当前故障码 检测中的故障
Mode 09 车辆信息 VIN码、车架号

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 主流协议的对比与选型

协议 物理层 ID长度 典型速率 主要应用 节点数
SAE J1939 CAN 2.0B 29位 250/500kbps 商用车 64
ISO 15765 CAN 2.0A/B 11/29位 500kbps 乘用车诊断 不限
DeviceNet CAN 2.0A 11位 125-500kbps 工业自动化 64
NMEA 2000 CAN 2.0B 29位 250kbps 船舶电子 64
CANopen CAN 2.0A 11位 125-1Mbps 工业控制 127

2.4 协议选择指南

应用场景 推荐协议 说明
商用车/卡车/客车 SAE J1939 标准化程度高,生态完善
农业机械 SAE J1939 同样适用J1939标准
工业自动化 CANopen/DeviceNet 面向工厂自动化
乘用车诊断 ISO 15765 OBD-II标准诊断
船舶电子 NMEA 2000 海洋导航设备标准

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

3.1 CAN物理层电气特性

3.1.1 差分信号传输

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

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

电平定义:

状态 CAN_H CAN_L 差分电压 逻辑值
显性(Dominant) 3.5V 1.5V ≥2.0V 0
隐性(Recessive) 2.5V 2.5V ≤0.5V 1

关键特性:

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

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

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

3.1.2 终端电阻

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

  • 吸收信号反射

  • 提供稳定的直流偏置

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

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

终端电阻位置:

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

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

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

3.1.3 传输距离与速率

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

波特率 最大总线长度 典型应用
1Mbps 40m 高速数据通信
500kbps 100m 汽车动力网络
250kbps 250m 舒适系统
125kbps 500m 长距离低速
50kbps 1000m 超长距离

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

3.2 CAN帧结构详解

3.2.1 帧的类型

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

帧类型 用途 优先级
数据帧 发送数据 高
远程帧 请求数据 中
错误帧 错误通知 最高
过载帧 接收准备未就绪 中
帧间隔 分隔帧 -

3.2.2 标准数据帧(11位ID)

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

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

各字段详解:

字段 位数 说明
SOF 1 帧起始,显性位,同步所有节点
仲裁段 12 11位ID + RTR位
控制段 6 IDE + r0 + DLC
数据段 0-64 0-8字节有效数据
CRC段 16 15位CRC + 界定符
ACK段 2 ACK槽 + 界定符
EOF 7 帧结束,隐性位
IFS 3 帧间隔

各字段详解:

  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位):

字段 位数 说明
基本ID 11 ID28-ID18,对应标准帧ID
SRR 1 替代远程请求位,固定隐性
IDE 1 扩展标识符,固定隐性
扩展ID 18 ID17-ID0
RTR 1 远程传输请求位

3.2.4 远程帧

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

区别点 数据帧 远程帧
RTR位 显性(0) 隐性(1)
数据段 有数据 无数据(DLC可为0-8)
用途 主动发送数据 请求数据

3.2.5 错误帧

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

错误帧结构:

字段 位数 说明
错误标志 6 显性/隐性(根据节点状态)
错误界定符 8 隐性

错误类型:

错误类型 检测条件
位错误 发送的位与总线监视的位不一致
填充错误 连续6个相同电平位(违反位填充规则)
CRC错误 接收的CRC与计算的CRC不匹配
格式错误 固定格式位(CRC界定符、ACK界定符、EOF)不合格
ACK错误 发送节点未检测到ACK槽的显性位

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 二进制 仲裁结果
A 0x100 001 0000 0000 赢得总线
B 0x101 001 0000 0001 仲裁失败
C 0x110 001 0001 0000 仲裁失败

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

第四章 CAN协议控制器原理

4.1 CAN控制器架构

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

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

4.1.1 控制器核心模块

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

模块 全称 功能
IML Interface Management Logic CPU命令接口、缓冲区管理、中断处理
TXB Transmit Buffer 存储待发送帧
RXB Receive Buffer 存储接收帧(RXB0/RXB1)
Filter Acceptance Filter 验收滤波,过滤不需要的帧
BTL Bit Timing Logic 位时序管理、采样点配置
CRC CRC Generator/Checker CRC校验
EML Error Management Logic 错误计数、状态转换

4.2 位时序与波特率配置

4.2.1 位时间结构

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

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

段名 作用 时间量子(Tq)
SYNC_SEG 同步段,所有节点在此同步 1 Tq
PROP_SEG 补偿物理延迟( transceiver + 总线) 1-8 Tq
PS1 吸收相位误差 1-8 Tq
PS2 选择采样点位置 1-8 Tq

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 采样点配置

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

应用场景 推荐采样点
汽车标准 87.5%
DeviceNet 62.5% / 87.5%
CANopen 87.5%
J1939 87.5%

// 采样点计算公式

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错误状态机:主动错误→被动错误→总线关闭

状态 TEC/REC 行为
主动错误 < 128 正常通信,可发送主动错误标志
被动错误 128-255 延迟重发,只能发送被动错误标志
总线关闭 > 255 节点脱离总线,需重启恢复

4.6 典型CAN控制器芯片

芯片型号 厂商 接口 特性
MCP2515 Microchip SPI 独立CAN控制器
SJA1000 NXP Parallel/8-bit 汽车级控制器
TJA1050 NXP - 高速CAN收发器
SN65HVD230 TI - 3.3V CAN收发器
STM32F4xx ST 内置 ARM Cortex-M4集成控制器

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, datai);

}

SPI_Write(TXB0CTRL, 0x08); // TXREQ

}

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

5.1 常见问题分类

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

5.1.1 硬件相关问题

问题现象 可能原因 解决方案
总线无通信 终端电阻缺失/过多 检查总线两端120Ω终端电阻
波形畸变 阻抗不匹配 调整线缆,使用屏蔽双绞线
通信距离短 信号衰减/干扰 降低波特率,加装滤波器
偶发错误 电磁干扰/接地不良 加强屏蔽,改进接地

5.1.2 电气特性问题排查

终端电阻配置错误

配置 终端阻值 总线阻抗 结果
正确 两端各120Ω 60Ω 波形良好
错误 仅一端120Ω 120Ω 反射增加
错误 两端各60Ω 30Ω 波形严重畸变

接地电位差问题

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

解决方案:

  • 使用隔离CAN收发器

  • 统一接地电位

  • 在CAN_GND线上串联阻值平衡

5.1.3 软件配置问题

问题现象 可能原因 解决方案
无法发送 波特率配置错误 重新计算并配置位时序
无法接收 验收滤波器太严格 放宽滤波器设置
丢帧 中断处理不及时 优化中断服务程序
乱码 ID格式错误(标准/扩展混淆) 检查IDE位设置

5.2 调试工具与方法

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

观测要点:

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

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

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

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

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

5.2.2 CAN分析仪使用

推荐工具:

工具 厂商 特点
CANalyzer/CANoe Vector 专业汽车总线分析
PCAN-View PEAK-System PCAN硬件配套
CANopen Magic - CANopen协议分析
cantact Linklayer Labs 开源CAN分析仪

分析流程:

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

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

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

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

5.2.3 软件调试技巧

Python-CAN库使用示例

import can

创建总线

bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)

发送消息

msg = can.Message(

arbitration_id=0x123, 11位标准ID

data=0x01, 0x02, 0x03, 0x04, 4字节数据

is_extended_id=False

)

bus.send(msg)

接收消息(10秒超时)

msg = bus.recv(timeout=10)

print(f"ID: 0x{msg.arbitration_id:X}, Data: {msg.data.hex()}")

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 调试检查清单

检查项 内容 方法
终端电阻 两端各120Ω,总阻值60Ω 万用表测量
线缆规格 屏蔽双绞线,120Ω阻抗 目视检查
波特率 所有节点一致 CAN分析仪验证
采样点 87.5%(汽车标准) 配置检查
接地 所有节点共地 电位测量
波形 无反射、无毛刺 示波器观察

附录

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

目标波特率 晶振8MHz 晶振16MHz 晶振12MHz
1Mbps BRP=4, BT=8 BRP=2, BT=8 BRP=3, BT=4
500kbps BRP=8, BT=8 BRP=4, BT=8 BRP=6, BT=4
250kbps BRP=8, BT=16 BRP=8, BT=8 BRP=6, BT=8
125kbps BRP=16,BT=16 BRP=8, BT=16 BRP=12, BT=8

附录B:常用CAN芯片选型

应用场景 推荐芯片 说明
汽车ECU SJA1000 + TJA1050 汽车级认证
工业控制 MCP2515 + SN65HVD230 性价比高
STM32内置 STM32F4xx/F7xx 集成度高
高速采样 FPGA + CAN IP核 灵活定制
相关推荐
QYR-分析5 小时前
汽车可开启全景天窗:座舱舒适核心配置,智能化升级打开产品溢价空间
大数据·人工智能·汽车
2601_9611462019 小时前
实验室用等离子表面处理设备处理新能源汽车塑料件的一点记录
笔记·汽车·设备
QYR-分析1 天前
CAGR 高达 38.2%:汽车钠离子电池,动力电池赛道的备选方案
汽车
早八晚十啊1 天前
基于ARM Cortex-A53与LVGL 9.0的智能车载系统设计与实现
arm开发·车载系统
电子元件小说家1 天前
2026年秋季电感市场观察:AI算力与汽车电子双轮驱动下的选型与验证指南
人工智能·汽车
云勤通1 天前
智慧后勤系统哪家售后响应快
车载系统
云勤通1 天前
智慧后勤系统哪个品牌靠谱
车载系统
workflower2 天前
超算中心聚焦高性能计算场景(HPC)
大数据·网络·人工智能·机器人·云计算·汽车