一文搞懂 CAN 总线:从入门到 STM32 应用

简介: CAN总线是BOSCH开发的高可靠差分串行通信协议,具多主、抗干扰、非破坏性仲裁及完备错误处理机制,广泛应用于汽车电子与工业控制。支持高速(1Mbps/40m)与低速(125kbps/1km)模式,仅需两线(CAN_H/CAN_L),数据帧含0~8字节,ID决定优先级。

一、什么是 CAN 总线?

CAN(Controller Area Network,控制器局域网总线)由 BOSCH 公司开发,是一种简洁、高速、易扩展且可靠性极高的串行通信总线。它广泛应用于汽车电子、工业控制、嵌入式设备等领域。

CAN 总线的核心特征:

  • 两线通信:只需 CAN_H、CAN_L 两条线,布线简单。

  • 差分信号:抗干扰能力强,适合复杂的电磁环境。

  • 高速 CAN(ISO 11898):速率 125 k ~ 1 Mbps,距离 < 40 m。

  • 低速 CAN(ISO 11519):速率 10 k ~ 125 kbps,距离 < 1 km。

  • 异步通信:无需时钟线,节点间约定波特率即可。

  • 半双工多主结构:多个设备挂载在同一条总线上。

  • 报文 ID 仲裁:11 位(标准帧)或 29 位(扩展帧)ID,既区分功能,也决定总线优先级。

  • 可变数据长度:有效载荷 0 ~ 8 字节。

  • 广播 + 请求:支持主动发送数据帧,也支持通过遥控帧请求数据。

  • 内置可靠性机制:应答、CRC 校验、位填充、位同步、错误处理等。

二、CAN 与其他通信协议对比

|
协议
|
引脚
|
双工
|
时钟
|
电平
|
设备数量
|
典型场景

|
| --- | --- | --- | --- | --- | --- | --- |
|
UART
|
TX、RX
|
全双工
|
异步
|
单端
|
点对点
|
两个设备互连
|
|
I2C
|
SCL、SDA
|
半双工
|
同步
|
单端
|
多设备
|
一主多从模块
|
|
SPI
|
SCK、MOSI、MISO、SS
|
全双工
|
同步
|
单端
|
多设备
|
主控外挂高速模块
|
|
CAN
|
CAN_H、CAN_L
|
半双工
|
异步
|
差分
|
多设备
|
多个控制器互相通信
|

CAN 最大的优势在于:多主、差分抗干扰、非破坏性仲裁、内置错误检测,这正是汽车网络所需要的。

三、硬件电路与物理层

3.1 总线拓扑

每个节点由 MCU + CAN 控制器 + CAN 收发器 组成。控制器输出 TX/RX,收发器将其转换为差分信号 CAN_H / CAN_L 后挂到总线上。

  • 高速 CAN:闭环网络,总线两端必须各接 120 Ω 终端电阻,用于阻抗匹配、抑制反射。

  • 低速 CAN:开环网络,在总线一端接 2.2 kΩ 终端电阻。

  • 实际布线中,CAN_H 与 CAN_L 通常采用双绞线,进一步增强抗干扰能力。

3.2 电平标准:隐性 vs 显性

CAN 用两根线的电压差表示数据位,而不是单线对地电压。

高速 CAN

|
逻辑
|
名称
|
电平差 V(CAN_H - CAN_L)

|
| --- | --- | --- |
|
1
|
隐性(Recessive)
|
≈ 0 V
|
|
0
|
显性(Dominant)
|
≈ 2 V
|

典型电压值:隐性时 CAN_H = CAN_L = 2.5 V;显性时 CAN_H ≈ 3.5 V、CAN_L ≈ 1.5 V。

低速 CAN

|
逻辑
|
电平差

|
| --- | --- |
|
1(隐性)
|
≈ -1.5 V
|
|
0(显性)
|
≈ 3 V
|

关键特性:“线与”。只要任意一个节点发送显性(0),总线就呈现显性;只有当所有节点都发隐性(1)时,总线才为隐性。这一特性是 CAN 总线仲裁的基础。

3.3 CAN 收发器

常用高速 CAN 收发器如 TJA1050、PCA82C250、TJA1042 等。它负责:

  • 将控制器来的 TX 单端信号转成差分电平发到总线;

  • 将总线差分电平转回 RX 单端信号给控制器。

四、CAN 帧格式

4.1 五种帧类型

|
帧类型
|
用途

|
| --- | --- |
|
数据帧
|
节点主动发送数据(广播式)
|
|
遥控帧
|
节点主动请求数据(请求式)
|
|
错误帧
|
检测到错误时,通知其他节点并终止当前发送
|
|
过载帧
|
接收方来不及处理,要求发送方暂缓
|
|
帧间隔
|
分隔数据帧/遥控帧与后续帧
|

4.2 数据帧结构(标准帧 11 位 ID)

|
字段
|
长度
|
说明

|
| --- | --- | --- |
|
SOF
|
1 bit
|
帧起始,显性位,标志数据开始
|
|
ID
|
11 bit
|
标识符,区分消息功能,ID 越小优先级越高
|
|
RTR
|
1 bit
|
远程请求位;数据帧为 0,遥控帧为 1
|
|
IDE
|
1 bit
|
扩展标志;0 = 标准帧,1 = 扩展帧
|
|
r0
|
1 bit
|
保留位
|
|
DLC
|
4 bit
|
数据长度码,0 ~ 8
|
|
Data
|
0 ~ 8 B
|
实际传输的数据
|
|
CRC
|
15 bit
|
循环冗余校验
|
|
CRC 界
|
1 bit
|
CRC 结束标志
|
|
ACK
|
1 bit
|
应答位,接收方正确接收后拉低
|
|
ACK 界
|
1 bit
|
ACK 结束标志
|
|
EOF
|
7 bit
|
帧结束,7 个隐性位
|

扩展帧:CAN 2.0B 中将 ID 扩展到 29 位,增加了 SRR 位(替代 RTR,固定为 1),并在标准帧的 r1 位置引入了 IDE 位。当标准帧 11 位 ID 与扩展帧的高 11 位 ID 相同时,标准帧优先级更高,这是通过 SRR = 1(隐性)来保证的。

4.3 遥控帧

遥控帧与数据帧结构几乎相同,但:

  • RTR = 1(隐性);

  • 没有数据段;

  • 用于请求总线上其他节点发送对应 ID 的数据。

4.4 位填充(Bit Stuffing)

发送方每发送 5 个相同电平后,会自动插入一个相反电平的填充位;接收方检测到填充位后自动移除。

作用:

  1. 提供额外的跳变沿,帮助接收方执行再同步;

  2. 防止长序列无跳变导致采样失准;

  3. 把正常数据流与错误帧、过载帧区分开;

  4. 保持总线在发送正常数据时的活跃状态。

五、位时序、采样与波特率

CAN 没有时钟线,所有节点靠约定波特率工作。每个节点都按自己的时钟对总线采样。

5.1 位时序分段

一个数据位被细分为若干最小时间单位 Tq(Time Quantum),并进一步划分为:

|
段
|
长度
|
作用

|
| --- | --- | --- |
|
SS(同步段)
|
1 Tq
|
期望出现跳变沿,用于同步
|
|
PTS(传播段)
|
1 ~ 8 Tq
|
补偿信号在总线上的传播延迟
|
|
PBS1(相位缓冲段 1)
|
1 ~ 8 Tq
|
必要时延长以再同步
|
|
PBS2(相位缓冲段 2)
|
2 ~ 8 Tq
|
必要时缩短以再同步
|

采样点通常位于 PBS1 末尾 / PBS2 起始处,即一位的中心附近。

5.2 同步机制

  • 硬同步:在每一帧的 SOF 下降沿,所有接收方将自己的位时序拨到 SS 段位置。硬同步只在 SOF 处有效一次。

  • 再同步:如果后续数据位跳变沿偏离了 SS 段,接收方通过 SJW(再同步补偿宽度,1 ~ 4 Tq)延长 PBS1 或 缩短 PBS2,把采样点重新拉回中心。

5.3 波特率计算

波特率 = 1 / 一个数据位的时长
      = 1 / (T_SS + T_PTS + T_PBS1 + T_PBS2)

例如:SS = 1 Tq,PTS = 3 Tq,PBS1 = 3 Tq,PBS2 = 3 Tq,Tq = 0.5 μs,则:

一个位 = (1+3+3+3) × 0.5 μs = 4 μs
波特率 = 1 / 4 μs = 200 kbps

在 STM32 中,位时序用 BS1、BS2 表示:

波特率 = APB1 / (BRP + 1) / (1 + (TS1 + 1) + (TS2 + 1))

其中 SS = 1 Tq 固定,BS1 = TS1 + 1,BS2 = TS2 + 1。

六、总线仲裁

6.1 规则一:先占先得

如果当前已有设备在发送数据帧/遥控帧,其他设备不能同时发送数据帧/遥控帧(但可以发送错误帧/过载帧破坏当前帧)。只有当总线出现连续 11 个隐性位时,才认为总线空闲,设备才能开始发送。

6.2 规则二:非破坏性仲裁

若多个设备同时开始发送,CAN 根据 ID 逐位比较进行仲裁。ID 越小,优先级越高。

实现仲裁依赖两个机制:

  1. 线与特性:任何节点发显性(0),总线就为 0;只有全发隐性(1)时总线才为 1。

  2. 回读机制:每个节点发完一位后都会读回总线电平。如果发的是 1,读回却是 0,说明优先级更高的节点发了 0,该节点自动退出竞争,转为接收。

因为仲裁不会破坏已经发出的数据,所以称为非破坏性仲裁。

6.3 优先级补充规则

  • 同 ID 时:数据帧优先级高于遥控帧(RTR = 0 vs 1)。

  • 标准帧 vs 扩展帧:当标准帧 11 位 ID 与扩展帧高 11 位 ID 相同时,标准帧优先级更高(由 SRR = 1 保证)。

七、错误处理

7.1 五种错误类型

|
错误类型
|
说明

|
| --- | --- |
|
位错误
|
发送方读回的总线电平与发送的不一致(仲裁期间除外)
|
|
填充错误
|
违反位填充规则(连续 6 个相同位)
|
|
CRC 错误
|
接收方 CRC 计算结果与发送方不一致
|
|
格式错误
|
固定格式位(如帧间隔、ACK 界等)不符合规定
|
|
ACK 错误
|
发送方在 ACK 位未收到显性应答
|

7.2 三种错误状态

每个节点通过两个计数器 TEC(Transmit Error Counter)和 REC(Receive Error Counter)管理自身状态:

|
状态
|
条件
|
行为

|
| --- | --- | --- |
|
主动错误
|
TEC < 128 且 REC < 128
|
正常通信,检测到错误时发送主动错误帧(6 个显性位)
|
|
被动错误
|
TEC ≥ 128 或 REC ≥ 128
|
仍可通信,但只能发送被动错误帧(6 个隐性位)
|
|
总线关闭
|
TEC > 255
|
退出总线通信,需恢复过程
|

7.3 离线恢复

STM32 中 ABOM 位控制离线恢复:

  • ABOM = 1:进入总线关闭后自动进入恢复过程;

  • ABOM = 0:软件需先请求进入再退出初始化模式,才会开始恢复。

八、STM32 bxCAN 外设应用

8.1 资源概览

STM32 内置 bxCAN 控制器,支持 CAN 2.0A/B,最高 1 Mbps。典型资源(以 STM32F103C8T6 为例):

  • 3 个发送邮箱(带可配置优先级);

  • 2 个接收 FIFO,每个 3 级深度;

  • 14 个过滤器组(互联型为 28 个);

  • 支持时间触发通信、自动离线恢复、自动唤醒、禁止自动重传、双 CAN 模式等。

8.2 发送与接收流程

发送流程:选择一个空邮箱 → 写入报文 → 请求发送。

接收流程:接收到报文 → 经过过滤器匹配 → 进入 FIFO 0 或 FIFO 1 → CPU 读取。

8.3 关键配置位

|
位
|
置 1
|
置 0

|
| --- | --- | --- |
|
NART
|
禁止自动重传,只发一次
|
发送失败自动重传直到成功
|
|
TXFP
|
发送优先级按请求顺序
|
发送优先级按 ID 大小
|
|
RFLM
|
FIFO 溢出时丢弃新报文
|
FIFO 溢出时覆盖最后一条
|

8.4 标识符过滤器

每个过滤器由两个 32 位寄存器 R1[31:0]、R2[31:0] 组成,可配置为:

  • FSCx(位宽):0 = 16 位,1 = 32 位;

  • FBMx(模式):0 = 屏蔽模式(Mask),1 = 列表模式(List);

  • FFAx(关联):0 = 关联 FIFO 0,1 = 关联 FIFO 1;

  • FACTx(激活):0 = 禁用,1 = 启用。

列表模式:精确匹配若干 ID。 屏蔽模式:用 ID + Mask 匹配一段 ID 范围。

注意:ID 写入寄存器时通常需要左移(标准 ID 左移 21,扩展 ID 左移 3 等),具体规则需参考 STM32 参考手册。

8.5 测试模式

|
模式
|
作用

|
| --- | --- |
|
静默模式
|
监听总线,不影响总线,用于分析
|
|
环回模式
|
自测试,发送的报文可从 TX 引脚检测到
|
|
环回静默模式
|
热自测试,不影响总线
|

8.6 工作模式

  • 初始化模式:配置 CAN 外设,禁止收发;

  • 正常模式:配置完成后进入,正常收发;

  • 睡眠模式:低功耗,AWUM = 1 时检测到总线活动自动唤醒,AWUM = 0 需软件唤醒。

8.7 中断

bxCAN 占用 4 个中断向量:

  1. 发送中断:发送邮箱空;

  2. FIFO 0 中断:收到报文 / FIFO 满 / FIFO 溢出;

  3. FIFO 1 中断:收到报文 / FIFO 满 / FIFO 溢出;

  4. 状态/错误/唤醒/睡眠中断。

8.8 时间触发通信(TTCM)

使能 TTCM 后,bxCAN 内置一个 16 位计数器,每个 CAN 位时间自增一次。发送帧 SOF 时捕获计数值到发送邮箱的 TIME 寄存器;接收帧 SOF 时捕获到接收 FIFO 的 TIME 寄存器。若使能 TGT 且 DLC = 8,时间戳还会被写入数据段最后两个字节。

九、小结

|
知识点
|
一句话总结

|
| --- | --- |
|
物理层
|
两线差分,显性 0 / 隐性 1,终端电阻匹配
|
|
帧格式
|
标准 11 位 ID / 扩展 29 位 ID,数据帧含 0~8 B 数据
|
|
位时序
|
SS + PTS + PBS1 + PBS2,采样点对齐中心
|
|
仲裁
|
ID 越小优先级越高,显性覆盖隐性,非破坏性
|
|
错误处理
|
5 种错误、3 种状态、TEC/REC 计数器
|
|
STM32
|
bxCAN 自动收发、过滤器、FIFO、中断、时间戳
|

CAN 总线之所以能成为汽车电子的事实标准,核心在于它在物理层、数据链路层、错误处理层都做了完整而简洁的设计。理解了“差分电平、非破坏性仲裁、位时序、错误状态机”这几个关键点,再看任何车载网络或 STM32 CAN 代码都会事半功倍。

十、补充AutoSAR架构下的CAN通信


相关文章
|
17天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8483 24
|
16天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
2826 14
|
15天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2021 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
14天前
|
人工智能 编解码 并行计算
MiniMax-H3 一键整合包技术文档:8G 显存运行 AI 漫剧制作 —— 角色替换 / 动作迁移 / 文图生视频部署与调参指南
MiniMax H3 是 MiniMax 开源的全模态视频生成模型,支持文/图/音/视多条件输入,输出最高2K、15秒带双声道音频视频。本文档详述其Int8量化版在8GB显存下的本地一键部署、三段式工作流(EDIT/REPLACE/CONTINUE)、参数调优及常见问题排查。(239字)
|
10天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
4天前
|
人工智能 JSON Linux
【全网最详细】ComfyUI使用教程:下载+本地部署+配置+工作流搭建一篇搞定(2026最新版)
ComfyUI是一款免费开源的本地AI绘图工具,采用节点式工作流设计,支持文生图、图生图、局部重绘、放大、换脸等多种功能。可离线运行,依赖显卡加速,无需联网。支持自定义流程保存与分享,插件生态丰富,适合进阶用户。(239字)
|
10天前
|
人工智能 JSON 编解码
【2026最新版】ComfyUI本地部署教程,新手也能看懂!
ComfyUI是本地运行的AI绘画工具,采用节点式工作流设计:通过拖拽连接“加载模型”“提示词编码”“采样”“解码”等模块,实现高度可控的文生图。新手推荐使用秋叶整合包,一键启动、内置模型管理与插件安装器,轻松上手。(239字)

热门文章

最新文章