Skip to content

CAN总线快速入门

预计阅读时长: 9 分钟

最后更新于2026年6月14日

下列部分用于帮助快速入门CAN总线,可能有些地方不是特别详细,想要详细学习可以参考这个视频

这里不会学到什么

  • 如何使用队内的BSPCAN库
  • 如何使用队内的CanManager

通识部分

1. 物理层特性

传输介质:通常使用双绞线(也可用屏蔽线或光纤)。

信号方式:差分信号,分为 CAN_H 和 CAN_L 两根线。

电平逻辑显性(dominant) 为逻辑 0,隐性(recessive) 为逻辑 1;显性会覆盖隐性。

CAN总线电平

总线拓扑:线性总线,两端需各接一个 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的结构,你可以看看这部分内容。

总的结构如下

STM32_CAN

附件:上图的visio工程

发送其实比较容易理解。发送分为两种,按照ID优先级发送(即仲裁优先级)以及按照添加事件发送

对于接收:

STM32内的接收有数个滤波器,根据配置不同,实际的数量是不同的,这里不做展开,感兴趣可以查阅STM32的参考手册。

每一个滤波器能指定一个接收的目标FIFO,FIFO与滤波器是一对多的关系(一个滤波器只能向一个FIFO填充数据,一个FIFO能接收来自多个滤波器的数据)