CAN总线是什么——为什么汽车里到处都是它
CAN的发展历史与两个重要标准版本
物理层:电平标准、总线拓扑与终端电阻
媒体访问机制:CSMA/CA与逐位仲裁
标准帧与扩展帧:两种帧格式详解
远程帧、错误帧、过载帧:四种帧的区别与用途
位填充机制:CAN可靠性的核心设计
错误检测五重保护与三种错误状态
位时序与波特率配置
车内CAN网络实例与工程设计原则
总结:理解CAN必须掌握的11个关键点
一、CAN总线是什么——为什么汽车里到处都是它
CAN,全称 Controller Area Network,中文译作"控制器局域网络"。它是一种专为汽车和工业控制设计的串行通信总线,由德国博世公司于1986年正式提出。
一辆传统汽车里有几十个电子控制单元(ECU):发动机管理、车身稳定系统、仪表盘、车窗升降、空调控制……每个都需要互相通信。
如果用传统一对一连线,光线束就能绑满整个车身。
CAN总线解决的就是这个问题:所有ECU挂在同一对双绞线上,谁想发数据就往总线里扔,总线上的所有节点都能收到。

CAN的核心价值:用最少的线实现最可靠的通信。这不是技术上的妥协,而是工程上的最优解。三十多年来,没有任何其他总线协议能在汽车领域撼动它的地位。这就是CAN在汽车里到处存在的原因:布线少、可靠性高、抗干扰能力强、成本可控。自1986年博世提出以来,CAN已经成为汽车网络的事实标准,没有之一。
二、CAN的发展历史与两个重要标准版本
CAN协议目前有两个主要版本,统称CAN 2.0:
| 版本 | 标识符长度 | 标准 | 应用场景 |
|---|
| CAN 2.0A | | | |
| CAN 2.0B | | | |
两者在物理层完全兼容,可以共存于同一网络。CAN 2.0B节点能接收标准帧,CAN 2.0A节点也能忽略扩展帧的额外部分。
2.1 CAN FD:应对数据量爆发的新标准
随着汽车电子电气架构复杂化,传统CAN的最大8字节数据长度和1Mbps波特率成为瓶颈。CAN FD(CAN with Flexible Data-rate)应运而生:
目前CAN FD在新一代新能源汽车的域控制器通信中快速普及。

三、物理层:电平标准、总线拓扑与终端电阻
3.1 差分信号传输
CAN使用差分信号(CAN_H和CAN_L两根线)表示数据。当两根线电压差约为2.0V时为显性电平(逻辑0);当差值约为0V时为隐性电平(逻辑1)。
| 总线状态 | CAN_H | CAN_L | 差分电压 |
|---|
| 显性(Dominant) | | | |
| 隐性(Recessive) | | | |
关键特性:显性覆盖隐性。当总线上同时有节点发送显性和隐性电平时,总线呈现显性电平。这个特性是CAN总线仲裁机制的基础。3.2 高速CAN与低速CAN
终端电阻绝对不能忘。每条CAN总线两端必须各接120Ω终端电阻。它的作用是消除信号在总线末端的反射。如果终端电阻缺失或阻值错误,CAN波形会出现明显振铃,导致通信不稳定。实测总线两端阻值应在60Ω左右。3.3 总线拓扑与长度约束
CAN总线通常采用总线型拓扑,所有节点通过短分支线接入主干线。速率越高,对总线长度和分支长度的要求越严格:

四、媒体访问机制:CSMA/CA与逐位仲裁
CAN总线没有主节点,所有节点地位平等。当多个节点同时想发数据时,谁说了算?
4.1 载波侦听(Carrier Sense)
每个节点在发送数据前,必须先监听总线是否空闲。只有当检测到连续11个隐性位(总线空闲标志),才能开始发送。这个机制有效减少了碰撞的发生。
4.2 非破坏性逐位仲裁(Non-destructive Bitwise Arbitration)
这是CAN最精妙的设计。当两个节点同时发数据时,通过逐位比较ID来确定优先级,优先级低的节点主动退出,不影响正在传输的数据。
节点A发送 ID = 10111000001 (二进制) 节点B发送 ID = 10110000001 (二进制) 逐位比较过程: Bit10~Bit6: 全部相同,两边继续发送 Bit5: A=1(隐性) B=0(显性) → 总线呈现显性 A读取总线=0,但自身发送=1 → A立即停止发送,切换为接收 结果:节点B赢得总线,继续发送完整帧;节点A等待总线空闲后重试ID越小,优先级越高。二进制中较小的ID在高位先出现0(显性),所以0x100的消息优先级高于0x7FF。这是设计CAN网络时需要认真考虑的问题——高实时性要求的报文(如安全气囊触发信号)必须用短ID。五、标准帧与扩展帧:两种帧格式详解
CAN数据帧是通信的主体。一条完整的数据帧结构如下(以标准帧为例):
5.1 标准CAN 2.0A 数据帧(11位标识符)
| 字段名 | 英文全称 | 长度 | 说明 |
|---|
| SOF | | | |
| ID[10:0] | | | |
| RTR | Remote Transmission Request | | |
| IDE | | | |
| r0 | | | |
| DLC[3:0] | | | |
| Data Field | | | |
| CRC | | | |
| CRC Delimiter | | | |
| ACK Slot | | | |
| ACK Delimiter | | | |
| EOF | | | |
| IFS | | | |
一个完整标准帧不含帧间隔最大108位,含帧间隔最大128位。

5.2 扩展CAN 2.0B 数据帧(29位标识符)
扩展帧与标准帧的核心区别在仲裁段。扩展帧在标准11位ID之后增加了18位扩展ID,同时用SRR位替代RTR位、用IDE位表示扩展帧:
| 字段 | 长度 | 说明 |
|---|
| | |
| | SRR=1(隐性),IDE=1(隐性,表示扩展帧) |
| | |
| | |
| | |
| | |
| | |
扩展帧的实际应用:如果两个帧的基础11位ID相同,标准帧会优先赢得仲裁(RTR位比较优先于SRR位)。因此扩展帧通常用于基础ID不冲突的场景,用于扩展可用的ID空间,而非绕过优先级。5.3 DLC数据长度编码规则
| DLC[3:0] | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 |
|---|
| 数据长度(字节) | | | | | | | | | |
|---|
CAN 2.0规定数据段长度只能是0~8字节。DLC值9~15在CAN 2.0中保留(部分实现定义为8字节)。CAN FD则将DLC编码扩展至64字节。
六、远程帧、错误帧、过载帧:四种帧的区别与用途
6.1 数据帧(Data Frame)
携带实际数据的帧,是CAN通信中最常用的一种。结构见第五节。
6.2 远程帧(Remote Frame)
由一个节点主动请求另一个节点发送数据。结构与数据帧几乎相同,唯一区别是RTR位为隐性(1):
数据帧: RTR = 0(显性) → "这是我的数据,请接收" 远程帧: RTR = 1(隐性) → "请发送ID=xxx的数据给我"远程帧在实践中很少使用。原因:远程帧没有数据字段,无法携带请求参数;多主从网络中容易被其他节点错误响应;大多数CAN网络选择周期发送模式替代远程请求。设计新系统时,优先考虑周期发送而非远程请求。6.3 错误帧(Error Frame)
当节点检测到总线错误时,主动发送错误帧通知其他节点。错误帧由错误标志(6位显性)和错误界定符(8位隐性)组成。处于主动错误状态的节点发送主动错误标志(6位显性),处于被动错误状态的节点发送被动错误标志(6位隐性)。
6.4 过载帧(Overload Frame)
用于在两个数据帧之间插入额外延迟,由过载标志(6位显性)和过载界定符(8位隐性)组成。触发条件:接收节点尚未准备好接收下一帧,或在帧间隔期间检测到非预期的显性位。
七、位填充机制:CAN可靠性的核心设计
位填充(Bit Stuffing)是CAN区别于普通UART的最重要特性。
7.1 规则
在SOF、仲裁段、控制段、数据段和CRC段中,如果出现连续5个相同电平的位,必须在其后立即插入一个相反电平的位。接收节点自动删除这5+1个位中的填充位。
7.2 为什么需要位填充?
核心目的:确保数据流中有足够的电平转换(edges),让接收节点的位同步能够持续进行。CAN没有独立时钟线,每个节点靠检测总线上的电平跳变来同步自己的位时序。如果一长串相同数据没有填充,接收节点的时钟漂移会导致位错位。
原始数据: 00000000 11110000 10011011 位填充后: 0000000 111110000 111110011 1011 ↑插入相反位 ↑同理 ↑位填充也是错误检测手段。如果接收节点在应填充的位置检测到连续5个相同电平,就会触发"填充错误"并发送错误帧。这是CAN五重错误检测机制之一。八、错误检测五重保护与三种错误状态
CAN协议内置了5种错误检测机制,任何一种被触发都会导致错误帧发送:
| 错误类型 | 检测位置 | 原理 |
|---|
| 位错误 | | 发送节点同时监听总线,发现自身发送的电平和总线实际电平不符 |
| 填充错误 | | |
| CRC错误 | | |
| 格式错误 | | 固定格式字段(CRC界定符、ACK、EOF)出现非法电平 |
| ACK错误 | | 发送节点在ACK槽读到隐性位(没有任何接收节点响应) |
8.1 三种错误状态
每个CAN节点内部维护两个计数器:TEC(发送错误计数器)和REC(接收错误计数器)。根据计数器值,节点处于三种不同的错误状态:
| 错误状态 | TEC阈值 | REC阈值 | 节点行为 |
|---|
| 主动错误状态 | | | |
| 被动错误状态 | | | 发送被动错误标志(6位隐性),不会破坏其他节点通信 |
| 总线关闭状态 | | | |
总线关闭不是故障,而是保护机制。当TEC超过255时,节点进入总线关闭状态。这通常意味着网络中存在严重的硬件问题(短路、断路或持续干扰)。在汽车诊断中,监控各节点的TEC/REC状态是发现硬件故障的重要手段。九、位时序与波特率配置
9.1 位的四段时间划分
一个CAN位被划分为4个时间段,这是理解CAN位时序的基础:
| 段名 | 全称 | 作用 | 可重同步调整 |
|---|
| SYNC_SEG | | | |
| PROP_SEG | | | |
| PHASE_SEG1 | | | |
| PHASE_SEG2 | | | |
采样点是CAN接收节点读取总线电平的时刻,通常设置在87.5%~90%的位置。
Bit Time = SYNC_SEG + PROP_SEG + PHASE_SEG1 + PHASE_SEG2 = 1 + PROP + PS1 + PS2 (单位: Tq, Time Quantum) 采样点 = (SYNC_SEG + PROP_SEG + PHASE_SEG1) / 总Tq数 × 100% 典型配置(采样点87.5%): (1 + 7 + 2) / 16 Tq9.2 波特率计算
CAN波特率由振荡器频率和Tq数量共同决定:
波特率 = 振荡器频率 / (BRP × (1 + PROP + PS1 + PS2)) 其中: BRP (Baudrate Prescaler) = 预分频系数 实例: APB1时钟=36MHz,目标500kbps 设 BRP=9,Tq总数=8(1+1+2+4) 实际波特率 = 36,000,000 / (9 × 8) = 500,000 bps ✓同步跳转宽度(SJW):当接收节点检测到位边沿与预期位置有偏差时,通过延长PS1或缩短PS2来调整,调整范围就是SJW。SJW通常设为1~4个Tq,值越大允许的晶振偏差越大,但会降低波特率精度。十、车内CAN网络实例与工程设计原则
10.1 典型的车内CAN网络分层
一辆乘用车的CAN网络通常由多条独立的CAN总线组成,按速率和功能分层:
10.2 实际CAN报文解析示例
CAN ID: 0x123 → 11位标准ID = 0001 0010 0011 Data: 08 5A 10 00 3C 00 00 00 解析(假设DBC定义): Byte0 = 0x08 → 数据长度 = 8字节 Byte1 = 0x5A → 转速高字节 Byte2 = 0x10 → 转速低字节 → (0x105A - 0x1000) / 6.4 × 16 ≈ 1500 RPM Byte3 = 0x00 → 水温信号(需结合偏移量和比例因子计算)DBC文件是CAN通信的"字典"。DBC(Database CAN)文件描述了每个报文的ID、长度、发送周期,以及每个字节的物理含义、偏移量、比例因子。没有DBC,裸CAN数据就是十六进制数;有了DBC,才能变成"水温87°C"、"车速65km/h"这样的物理量。10.3 工程设计基本原则
ID分配要合理:高实时性要求(安全相关)的报文用短ID;周期长的报文用长ID
总线负载率控制在70%以下:留足余量应对突发通信和错误重发
终端电阻必须匹配:两端各120Ω,实测总阻值约60Ω
做好故障隔离:单节点硬件故障不应导致整条总线瘫痪
做好测试验证:使用CANoe/CANalyzer等工具验证负载、错误处理和时序
十一、总结:理解CAN必须掌握的11个关键点
| 维度 | 关键知识点 |
|---|
| 协议定位 | 汽车网络事实标准,Autosar/嵌入式开发必备基础 |
| 物理层 | |
| 媒体访问 | CSMA/CA + 非破坏性逐位仲裁,ID越小优先级越高 |
| 帧格式 | 标准帧(11位ID,8字节)和扩展帧(29位ID,8字节) |
| 位填充 | |
| 错误检测 | 5种错误检测机制(位错误/填充错误/CRC错误/格式错误/ACK错误) |
| 错误状态 | 主动错误/被动错误/总线关闭,TEC≥256时关闭通信 |
| 位时序 | SYNC+PROP+PS1+PS2四段,采样点87.5%~90% |
| 波特率 | |
| DBC文件 | |
| 设计原则 | |
CAN协议看似规则简单,但每一个设计细节背后都有深厚的工程考量:位填充解决了时钟同步问题,非破坏性仲裁实现了真正的多主访问,五重错误检测保证了极高的通信可靠性。理解这些"为什么",才能真正掌握CAN。