CAN总线快速入门
预计阅读时长: 9 分钟
最后更新于2026年6月14日
下列部分用于帮助快速入门CAN总线,可能有些地方不是特别详细,想要详细学习可以参考这个视频
这里不会学到什么:
- 如何使用队内的BSPCAN库
- 如何使用队内的CanManager
通识部分
1. 物理层特性
传输介质:通常使用双绞线(也可用屏蔽线或光纤)。
信号方式:差分信号,分为 CAN_H 和 CAN_L 两根线。
电平逻辑:显性(dominant) 为逻辑 0,隐性(recessive) 为逻辑 1;显性会覆盖隐性。

总线拓扑:线性总线,两端需各接一个 120Ω 终端电阻 以消除反射。(暂时不需要深入了解,知道就行)
2. 数据链路层帧类型
MCU上程序可发的
- 数据帧:携带用户数据,RTR=0,最常用。
- 远程帧:请求某个节点发送指定 ID 的数据帧,RTR=1。
硬件自动控制的
- 错误帧:任何节点检测到总线错误时主动发出。
- 过载帧:节点尚未准备好接收下一帧时发出,用于流量控制。
3. 帧结构详解
[帧起始] [仲裁段/ID段] [控制场] [数据场] [CRC场] [ACK场] [EOF]
- [帧起始]:帧起始,一个显性位,同步整个总线。
- [仲裁段/ID段]:包含标识符(ID)和 RTR 位,决定报文优先级。
- [控制场]:含 IDE 位(扩展标识符标志)和 DLC(数据长度码)。
- [数据场]:0~8 字节的应用数据。
- [CRC场]:15 位 CRC 校验序列 + 定界符,检测数据完整性。
- [ACK场]:应答槽 + 定界符;接收节点正确接收后在该槽发送显性位。
- [EOF]:帧结束,7 个连续的隐性位。
简单来说,CAN帧分为标准帧和扩展帧
- 标准帧:ID长度为11位,IDE=0
- 扩展帧:ID长度为29位,IDE=1
无论是哪种帧,DLC位(数据长度)不应该超过8,即一次性最大传输8字节的数据。
CAN总线的电平有位填充机制,如果存在连续 5 个相同极性 的位(无论是显性 0 还是隐性 1),就会在后续自动插入一个相反极性的位。
例如:发送 00000 → 变为 000001(插入 1) 发送 11111 → 变为 111110(插入 0)
4. (非破坏性)仲裁机制
多个节点同时发送时,利用 线与逻辑 逐位比较标识符。
显性位(0)优先级高于隐性位(1)。发送隐性位的节点如果读到显性位,则主动退出发送,转为接收。
最终 标识符数值最小的节点(即优先级最高)赢得仲裁,继续发送而无需重传。
值得注意的是,STM32的CAN控制器有可开启的自动重发功能,即在被仲裁掉等发送失败时回自动尝试重新发送。
5. 位时序中的几个段
一个位时间由以下四个段组成: [同步段] [传播段] [相位缓冲段1] [相位缓冲段2] - 同步段 (SS):用于同步各节点,边沿应发生在此段内。 - 传播段 (PTS):补偿物理传播延迟和收发器延迟。 - 相位缓冲段1 (PBS1):补偿边沿相位误差,通常可通过重新同步加长或缩短。 - 相位缓冲段2 (PBS2):提供采样点后的余量,同样可被重同步调整。
采样点通常位于 PBS2 开始处,一般情况下,采样点越靠后,传输距离越远,合理配置这四个段可保证总线在波特率下的稳定通信。
队内的特殊规定
线序——正反线
队内一般使用GH1.25 1x2P作为CAN线的连接接口
正向反向的定义为:从同样的方向看GH线的接口,如果两个端口左对左右对右,则是正向,如果左对右,右对左则是反向。
示例图如下(红色黑色互相对应无交叉)

扩展内容
STM32的CAN控制器的相关东西
使用CAN只需要调用BSPCAN内封装好的API即可应对大对数的情况,如果你想深入了解STM32的CAN的结构,你可以看看这部分内容。
总的结构如下

发送其实比较容易理解。发送分为两种,按照ID优先级发送(即仲裁优先级)以及按照添加事件发送。
对于接收:
STM32内的接收有数个滤波器,根据配置不同,实际的数量是不同的,这里不做展开,感兴趣可以查阅STM32的参考手册。
每一个滤波器能指定一个接收的目标FIFO,FIFO与滤波器是一对多的关系(一个滤波器只能向一个FIFO填充数据,一个FIFO能接收来自多个滤波器的数据)