CAN 总线协议保姆级详解|从物理层到帧格式,嵌入式 / 车载入门必备
目录
1. CAN总线历史
CAN 是博世为汽车减线束、简化 ECU 通信而发明的 ISO 标准串行总线,具备多主、高实时、强抗干扰、可靠错误处理等特性,从汽车领域扩展到工业、医疗等多个高可靠性要求的行业。
2. CAN总线结构
一、节点内部结构(核心分层)
每个 CAN 节点都由两层核心模块组成:
- 上层:MCU + CAN 控制器
- MCU:节点的 “大脑”,负责业务逻辑、数据处理与应用层交互。
- CAN 控制器:实现 CAN 协议核心逻辑(帧封装 / 解析、仲裁、错误检测等),通常集成在 MCU 内部。
- 信号接口:
CAN_TX:MCU → 收发器(发送数据)CAN_RX:收发器 → MCU(接收数据)
- 下层:CAN 收发器
- 作用:电平转换 + 差分驱动,将 CAN 控制器的 TTL 电平信号转换为 CANH/CANL 差分信号并驱动到总线,同时将总线上的差分信号还原为 TTL 电平供控制器读取。
二、总线物理层特性
| 特性 | 高速 CAN | 低速容错 CAN |
|---|---|---|
| 拓扑结构 | 线性总线型,总线两端为开放端点,无闭合回路,禁止首尾相连 | 线性总线型,总线两端为开放端点,无闭合回路,兼容分支拓扑 |
| 传输方式 |
- 差分信号传输(CANH + CANL 双绞线),抗干扰能力强 - 无专门的时钟线,属于异步通信 |
- 差分信号传输,强容错能力,兼容单线通信 - 无专门的时钟线,属于异步通信 |
| 终端电阻 | 两端各接 120Ω 终端匹配电阻,用于匹配电缆特性阻抗,消除信号反射 | 节点内置分布式终端电阻,总线两端接 2.2kΩ 偏置电阻,用于稳定隐性电平,具备阻抗匹配能力 |
| 线缆参数 | 特性阻抗 120Ω,支持高速通信(500kbps~1Mbps) | 特性阻抗 120Ω,仅支持低速通信(≤125kbps) |
| 信号完整性 | 高,适合高速、短距离高实时性场景 | 低速下稳定性强,具备总线容错能力,适合低速、长距离场景 |
| 差分电压・显性(逻辑 0) | 电压差 ≈ 2V | 典型电压差≈3V,规范下限 > 2V |
| 差分电压・隐性(逻辑 1) | 电压差 ≈ 0V | 典型电压差≈-5V,规范上限 < 0V |
三、网络核心特性与适用场景
| 维度 | 高速 CAN(ISO 11898-2) | 低速容错 CAN(ISO 11898-3) |
|---|---|---|
| 核心特性 | 多主通信,节点平等、支持广播;非破坏性位仲裁,保障高优先级数据低延迟;完善的错误检测与处理机制 | |
| 波特率范围 | 最高支持 1Mbps,速率与总线长度强负相关,常用高速区间 500kbps~1Mbps | 最高支持 125kbps,专为低速场景设计,常用区间 40kbps~125kbps |
| 传输距离 | 速率越高传输距离越短:1Mbps → 最大 40m500kbps → 最大 100m | 速率越低传输距离越长:125kbps → 最大 500m40kbps → 最大 1000m |
| 典型应用场景 | 汽车动力 / 底盘控制(发动机、变速箱、ABS);工业自动化(运动控制、机器人);对实时性、高速通信要求高的场景 | 汽车车身舒适控制(门窗、灯光、空调);低速传感器网络、长距离低速工控;对容错能力、布线灵活性要求高的场景 |
| 优势 | 通信速率高、传输实时性强、高速下信号完整性好 | 总线容错能力强、布线灵活性高、长距离低速传输稳定性好 |
| 局限性 | 对终端电阻、拓扑布线要求严格,无总线容错能力,总线故障易导致通信中断 | 不支持高速通信,无法满足高实时性控制场景的需求 |
四、CAN总线网络图

图1.高速 CAN 总线标准组网结构图

图2.低速容错 CAN 总线标准组网结构图
3. CAN总线特点
| 特点 | 详细关键内容 |
| 实时性 | 数据传输延迟低、响应快,通过仲裁机制和帧 ID 优先级保证关键数据优先传输,满足汽车、工业自动化等高实时性需求。 |
| 多主机结构 | 总线上所有节点地位平等,没有主从之分,任意节点都可主动发起通信;同一时刻仅允许一个节点占用总线发送数据。 |
| 差分信号传输 | 采用 CANH、CANL 双绞线进行差分信号传输,依靠两根线的电压差表示数据,抗电磁干扰能力强,适合恶劣电气环境。 |
| 非破坏性仲裁 | 多节点同时发送数据时,根据帧 ID 的优先级竞争总线使用权,高优先级节点正常发送,低优先级节点主动退让,不破坏数据、不产生冲突。 |
| 广播通信模式 | 节点发送的数据会被总线上所有节点接收,便于全网数据共享与同步,简化系统通信结构。 |
| 硬件成本低 | CAN 控制器集成度高,协议逻辑由硬件实现,无需额外 CPU 参与调度,整体电路简单、成本低,适合大批量部署。 |
| 配置灵活 | 支持多种通信波特率,可根据传输距离、实时性要求灵活调整,能适配从低速传感器到高速车载控制的多种场景。 |
| 完善的错误处理 | 内置 CRC 校验、帧格式检查、应答检测等多重错误识别机制,能自动检测、标注并处理传输错误,提升通信稳定性。 |
| 以帧为单位传输 | 数据以 “帧” 为基本单位,节点没有物理地址,通过不同类型的帧(数据帧、遥控帧等)完成数据交互和控制。 |
| 线与逻辑特性 | 总线电平遵循 “线与” 规则:显性电平(逻辑 0)可以覆盖隐性电平(逻辑 1),这是仲裁机制能够实现的物理基础。 |
| 帧 ID 的作用 | 每个帧有唯一标识符 ID,ID 不代表节点地址,而是表示数据类型,并在总线竞争时决定优先级,ID 越小优先级越高。 |
| 硬件滤波功能 | 每个节点可通过硬件过滤不需要的帧 ID,只接收和处理自身关心的数据,减轻 CPU 负担,提高关键信息响应速度。 |
| 半双工通信 | 同一节点不能同时发送和接收数据;多节点竞争发送时,获胜节点继续发送,失败节点立即切换为接收状态。 |
| 异步无时钟线 | 属于异步通信,没有专门的时钟同步线,所有节点必须使用相同的波特率,依靠位时序和再同步机制保证时序对齐。 |
4. CAN位时序和波特率
一、整体结构:标称位时间(Nominal Bit Time, NBT)
- 定义:传输 1 位数据所需的总时间,是计算 CAN 波特率的核心依据。
- 构成:由 3 个固定段组成,所有段的长度都以 tq(时间片,Time Quantum) 为最小单位。
- 公式:NBT=(1+m+n)×tq其中:
1:同步段固定为 1 个 tqm:位段 1(BS1)的 tq 数量n:位段 2(BS2)的 tq 数量
二、三段位时序详细解析
| 段名 | 长度 | 核心作用 |
|---|---|---|
| SYNC_SEG(同步段) | 固定 1 × tq | 用于检测总线电平跳变沿,实现节点与总线的初始同步;只有在该段内检测到跳变,才认为时序对齐。 |
| 位段 1(BS1) | 可配置 m × tq(m=1~16) | 定义采样点位置:在 BS1 结束时刻对总线电平进行采样,采样结果即为该位的逻辑值(0/1);再同步时可自动延长,补偿正相位漂移。 |
| 位段 2(BS2) | 可配置 n × tq(n=1~8) | 定义发送点位置:在 BS2 结束时刻完成该位的发送;再同步时可自动缩短,补偿负相位漂移。 |

图3. CAN位时序图
5. CAN总线协议
CAN 协议(经典 CAN 2.0A/B)仅实现了 OSI 七层模型的最底两层,上层能力均由配套的行业协议 / 应用逻辑补充:
- 物理层(OSI 第 1 层):定义 CAN 总线的电气规范,包括线缆特性、差分电平规则、收发器要求、位时序配置等核心硬件相关标准。
- 数据链路层(OSI 第 2 层):CAN 协议的核心逻辑层,分为 MAC(媒体访问控制)和 LLC(逻辑链路控制)两个子层,实现帧结构封装 / 解析、非破坏性总线仲裁、多重错误检测与自动重传、硬件帧 ID 滤波等核心协议功能。
- CAN 原生协议完全不涉及 OSI 模型的传输层、会话层、表示层、应用层,这些上层能力,均由具体场景的配套协议补充实现(比如汽车领域的 UDS 诊断协议、ISO TP 传输协议,工业领域的 CANopen、DeviceNet 协议等)。
- 数据链路层(LLC + MAC 子层)核心功能
| 子层 | 核心定位 | 具体事项 |
|---|---|---|
| LLC(逻辑链路控制子层) | 上层接口与消息管理,为应用层提供数据服务 |
- 接收消息硬件过滤(通过帧 ID 筛选,仅处理节点需要的消息) - 过载帧管理与过载通知(告知总线 / 发送节点,接收端未准备好) - 为上层应用提供数据收发的统一接口 |
| MAC(介质访问控制子层) | CAN 协议核心执行层,协议逻辑全硬件实现 |
- 消息帧封装与解析:完成数据帧、遥控帧、错误帧、过载帧的组帧与解帧 - 总线访问控制:基于 CSMA/CA 机制,实现非破坏性位仲裁,通过帧 ID 优先级竞争总线使用权 - 位时序控制与同步:实现硬同步、再同步,保证全总线节点的时序对齐 - 错误管理:实现 CRC 校验、位填充校验、ACK 应答校验、格式错误检测,完成故障界定与故障节点主动离线控制 - 自动重传机制:检测到传输错误后,自动触发未被正确接收的消息重传 - 应答机制:处理 ACK 时隙的应答与校验,确认消息是否被总线节点正确接收 |
- 物理层核心功能
| 项目 | 核心内容 |
|---|---|
| 位编码规则 | 采用 NRZ(不归零)编码,配套5 位强制位填充机制:连续出现 5 个相同逻辑电平(显性 0 / 隐性 1)时,强制插入 1 个相反电平的填充位,避免总线长时间无跳变导致节点同步丢失 |
| 位时序定义 | 标称位时间由 3 段组成(工程通用简化划分):同步段(SYNC_SEG,固定 1tq)+ 位段 1(BS1,可配置)+ 位段 2(BS2,可配置),精准定义总线电平采样点、位数据发送点 |
| 同步机制 | 两级同步保障全总线节点时序对齐:1. 硬同步:仅在数据帧 / 遥控帧的帧起始(SOF)下降沿触发,完成节点初始时钟同步2. 再同步:总线电平跳变时,通过同步跳转宽度(SJW)调整 BS1/BS2 长度,补偿节点时钟相位漂移 |
| 标准定义与用户可配置项 | 1. 标准强制定义项:差分信号电平规范、收发器核心电气特性、位填充规则、位时序基础架构、同步机制等,必须符合 ISO 11898 标准要求2. 用户可配置项:通信波特率(标准支持范围内)、采样点位置(行业推荐区间内)、BS1/BS2/SJW 的 tq 数量、线缆选型、连接器形态等,可根据系统场景灵活设计 |
6. CAN各类型帧详解
一、帧类型与帧用途
| 帧类型 | 帧用途 |
|---|---|
| 数据帧 | 承载节点产生的有效业务数据,以广播方式发送,所有节点可通过 ID 过滤接收,是 CAN 总线中传输用户数据的核心载体。 |
| 遥控帧 | 由节点向总线发送,用于请求对应 ID 的数据帧,实现 “请求 - 响应” 式数据交互,无数据段。 |
| 错误帧 | 当节点检测到总线通信错误时发送,用于向全网通知错误状态,并触发错误恢复与重传机制,保障通信可靠性。 |
| 过载帧 | 当接收节点处理能力不足、无法及时接收新数据时发送,用于通知发送节点暂缓发送,避免数据丢失或处理混乱。 |
| 帧间空间 | 位于连续帧之间的间隔段,用于分隔不同帧,为节点提供处理、采样与再同步的缓冲时间,防止帧间干扰,保证总线时序稳定。 |
二、数据帧

图4. 数据帧的构成
| 段名称 | 标准帧内容(含电平) | 扩展帧内容(含电平) | 功能说明 |
|---|---|---|---|
| 帧起始 SOF | 1 位 显性电平 | 1 位 显性电平 | 标志帧开始,产生电平跳变,让所有节点同步。 |
| 仲裁段 | 11 位 ID RTR(显性)IDE(显性) | 11 位基本 ID SRR(隐性)IDE(隐性)18 位扩展 ID RTR(显性) | 用于总线仲裁,ID 越小优先级越高;RTR = 显性表示数据帧;IDE 区分标准 / 扩展帧。 |
| 控制段 | r0(显性)4 位 DLC | r1、r0(显性)4 位 DLC | DLC 表示数据长度 0~8 字节;保留位固定为显性。 |
| 数据段 | 0~64 位(0~8 字节) | 0~64 位(0~8 字节) | 存放要传输的实际数据。 |
| CRC 段 | 15 位 CRC 序列CRC 界定符(隐性) | 15 位 CRC 序列CRC 界定符(隐性) | 校验传输错误;界定符固定隐性。 |
| ACK 段 | ACK 槽(发送端发隐性,接收端覆盖为显性)ACK 界定符(隐性) | ACK 槽(发送端发隐性,接收端覆盖为显性)ACK 界定符(隐性) | 发送端发隐性,只要有节点正确接收,会把 ACK 槽拉成显性,表示应答成功。 |
| 帧结束 EOF | 7 位 隐性电平 | 7 位 隐性电平 | 标志帧结束,固定 7 位隐性。 |
三、遥控帧

图5. 遥控帧的构成
| 段名称 | 标准遥控帧内容(含电平) | 扩展遥控帧内容(含电平) | 功能说明 |
|---|---|---|---|
| 帧起始 SOF | 1 位 显性电平 | 1 位 显性电平 | 标志帧开始,通过电平跳变实现节点同步,启动一帧传输。 |
| 仲裁段 | 11 位 ID RTR(隐性)IDE(显性) | 11 位基本 ID SRR(隐性)IDE(隐性)18 位扩展 ID RTR(隐性) | 用于总线仲裁,ID 越小优先级越高;RTR = 隐性表示这是遥控帧;IDE 用于区分标准帧与扩展帧。 |
| 控制段 | r0(显性)4 位 DLC | r1、r0(显性)4 位 DLC | DLC 表示期望对方返回的数据长度(0~8 字节);保留位固定为显性。 |
| 数据段 | 无数据段 | 无数据段 | 遥控帧只用于请求数据,不携带任何数据。 |
| CRC 段 | 15 位 CRC 序列CRC 界定符(隐性) | 15 位 CRC 序列CRC 界定符(隐性) | 对帧内容进行错误校验;界定符固定为隐性。 |
| ACK 段 | ACK 槽(发送端隐性,接收端覆盖为显性)ACK 界定符(隐性) | ACK 槽(发送端隐性,接收端覆盖为显性)ACK 界定符(隐性) | 接收节点正确收到后,将 ACK 槽拉为显性,表示应答成功。 |
| 帧结束 EOF | 7 位 隐性电平 | 7 位 隐性电平 | 标志一帧传输结束,固定 7 位隐性电平。 |
四、错误帧

图6. 错误帧的构成
| 段名称 | 错误帧内容 | 功能说明 |
|---|---|---|
| 错误标志 | 6 位显性电平(错误主动)6 位隐性电平(错误被动) | 节点检测到错误后发送,强制破坏总线电平,通知全网出现传输错误。 |
| 错误界定符 | 8 位隐性电平 | 标志错误帧结束,让总线恢复稳定,为后续正常通信做准备。 |
五、过载帧

图7. 过载帧的构成
| 段名称 | 过载帧内容 | 功能说明 |
|---|---|---|
| 过载标志 | 6 位显性电平 | 接收节点来不及处理数据时发送,通知发送节点暂停发送,避免数据丢失。 |
| 过载界定符 | 8 位隐性电平 | 标志过载帧结束,使总线回到空闲状态,等待恢复正常传输。 |
六、帧间隔

图8. 帧间隔的构成
| 段名称 | 内容(电平) | 功能说明 |
|---|---|---|
| 帧间空间 | 3 位 隐性电平 | 用于分隔连续的数据帧 / 遥控帧,保证总线时序不重叠,给节点留出处理缓冲时间。 |
| 延迟传送 | 8 位 隐性电平 | 仅被动错误节点在发送完一帧后额外增加的延迟段,发送暂时停止,避免频繁占用总线。 |
| 总线空闲 | 隐性电平,长度不限(可为 0) | 总线无任何传输,处于空闲状态;任何需要发送的节点,都可在此阶段开始发送数据。 |
7. CAN总线优先级及同步
(1)优先级的决定
一、核心定义
CAN 总线仲裁机制:用于解决多个节点同时发送数据的冲突,通过仲裁段电平对比,确定优先级,分配总线发送权,核心原则 ——显性电平优先级 > 隐性电平。
二、仲裁核心规则(分点清晰,必记)
- 总线空闲态:总线为隐性电平,最先开始发送消息的节点,直接获得发送权。
- 多节点同时发送:
- 从仲裁段第一位开始,逐位对比各节点发送的电平;
- 前几位电平均相同时,继续对比下一位;
- 第一次出现电平互异时,发送显性电平的节点获得发送权,发送隐性电平的节点立即转为接收状态。
- 数据帧与遥控帧(同 ID、同格式):
- 数据帧 RTR 位 = 显性电平,遥控帧 RTR 位 = 隐性电平;
- 优先级:数据帧 > 遥控帧。
- 标准帧与扩展帧(11 位基础 ID 相同):
- 标准帧 IDE 位 = 显性电平,扩展帧 IDE 位 = 隐性电平;
- 优先级:标准帧 > 扩展帧。
(2)错误的种类
| 错误种类 | 错误内容 | 错误检测的帧 / 段范围 | 检测单元 |
|---|---|---|---|
| 位错误 |
发送节点对比自身输出电平与总线电平,不一致时判定位错误; 例外场景:・仲裁段发隐性读到显性 → 视为仲裁丢失,非位错误 ・ACK 槽发隐性读到显性 → 视为正常应答,非位错误 |
数据帧、遥控帧(SOF ~ EOF) | 发送单元 |
| 填充错误 | 需执行位填充的段内,出现连续 6 位相同电平,违反 “连续 5 位同电平必须插入反向填充位” 规则 | 数据帧、遥控帧(SOF ~ CRC 序列) | 发送单元、接收单元 |
| CRC 错误 | 接收节点重新计算的 CRC 结果,与帧中携带的 CRC 序列不匹配 | 数据帧、遥控帧(CRC 序列段) | 接收单元 |
| 格式错误 |
固定格式段(CRC 界定符、ACK 界定符、EOF)电平不符合协议规范; 例外:DLC = 9~15 不视为格式错误 |
数据帧、遥控帧(CRC 界定符、ACK 界定符、EOF) | 接收单元 |
| ACK 错误 | 发送节点在 ACK 槽内未检测到任何接收节点发出的显性应答电平,判定无节点正常接收该帧 | 数据帧、遥控帧(ACK 槽段) | 发送单元 |
(3)错误帧的输出
- 位 / 填充 / 格式 / ACK 错误:检测到后立即在下一位启动错误标志输出。
- CRC 错误:需等待到ACK 段结束后才输出错误标志,避免干扰正常接收应答流程。
(4)位时序
| 段名称 | 核心作用 | Tq 长度范围 |
|---|---|---|
| 同步段(SS) | 实现多节点时序同步,要求电平跳变发生在此段内,是通信同步的起点。 | 1 Tq |
| 传播时间段(PROP_SEG) | 补偿总线信号传播延迟与节点内部收发延迟,保证总线电平能稳定到达各节点。 | 1~8 Tq |
| 相位缓冲段 1(PBS1) | 当信号边沿未落在 SS 段时,用于补偿同步偏差,是再同步的前半段。 | 1~8 Tq |
| 相位缓冲段 2(PBS2) | 吸收节点时钟偏差,与 PBS1 共同完成同步误差补偿;可调整范围受 SJW 限制。 | 2~8 Tq |
| 再同步补偿宽度(SJW) | 定义再同步时可对 PBS 段加减的最大 Tq 数;SJW 越大,可容忍的时钟偏差越大。 | 1~4 Tq |
(5)取得同步的方法
CAN 协议采用 NRZ(不归零)编码 进行通信,不附加专门的同步信号或时钟脉冲:
- 发送端:按自身位时序连续发送数据;
- 接收端:通过总线上的电平跳变边沿实现同步接收。
由于收发单元间存在时钟频率误差,且传输路径(电缆、驱动器等)会引入相位延迟,导致同步偏差;因此接收端会通过 硬件同步(硬同步) 与 再同步 机制动态调整位时序,以此抵消误差、保障数据可靠接收。
(6)硬件同步
- 触发场景:总线上检测到 隐性→显性 的电平边沿(通常是帧起始 SOF)。
- 核心动作:接收单元将该边沿强制对齐到 同步段(SS) 的起点,重置自身位时序计数器,实现与发送端的硬同步。
- 本质:这是 CAN 节点的首次同步机制,用于在帧开始时让所有节点对齐到同一个时序起点,保证后续传输的稳定。

图9. 硬件同步
(7)再同步
场景 1:边沿滞后(出现在 PTS/PBS1 之间)
- 现象:隐性→显性的电平边沿滞后于 SS 段,落在 PTS 或 PBS1 段内(图中延迟 2Tq,SJW=2)。
- 调整动作:在 PBS1 后插入 SJW 长度(2Tq),增加 PBS1 的总长度。
- 目的:延长位时间,“等待” 滞后的信号边沿,将采样点拉回正确位置,避免采样过早。
场景 2:边沿超前(出现在 PBS2 中)
- 现象:隐性→显性的电平边沿超前于 SS 段,落在 PBS2 段内(图中提前 2Tq,SJW=2)。
- 调整动作:在 PBS2 中减去 SJW 长度(2Tq),缩短 PBS2 的总长度。
- 目的:压缩位时间,“提前” 对齐信号边沿,避免采样过晚导致误读。

图10. 再同步
(8)调整同步的规则
| 规则类别 | 具体规则 | 详细解释 |
|---|---|---|
| 基础通用规则 | 1. 每个位时间内仅进行一次同步调整2. 仅当「上次采样点总线值」与「边沿后总线值」不同时,该边沿才可用于同步调整 | 1. 防止同一时间段内多次调整时序,避免通信时序混乱2. 只有真实的电平跳变(有效边沿)才触发同步,过滤无效电平波动 |
| 硬件同步规则 | 总线空闲且检测到隐性→显性的边沿时,必须执行硬件同步 | 总线空闲时,隐性→显性边沿代表帧起始(SOF),所有节点必须强制对齐时序,保证帧起始同步一致 |
| 再同步规则(总线非空闲时) | 1. 检测到隐性→显性的有效边沿(满足基础规则)时,执行再同步2. 发送单元观测到自身输出的显性电平延迟时,不执行再同步3. 帧起始至仲裁段期间,多节点同时发送导致的延迟边沿,不执行再同步 | 1. 正常通信中,通过再同步补偿时钟 / 传输误差2. 发送端自身延迟不属于同步偏差,不触发再同步,避免误补偿3. 仲裁段延迟边沿属于仲裁失利,而非同步误差,不触发再同步 |
CAN 总线的高阶应用可看 SAE J1939 协议详解:SAE J1939 协议实战详解|PGN 计算 / ID 拆解 / 多包传输 / 报文解析全攻略 _j1939协议自动分配名-CSDN博客
更多推荐

所有评论(0)