CAN基础理论

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 0 Likes: 0 Comments: 0

179.1.2 CAN基础理论

本课只讲通信分类、差分信号、CAN 总线组成和显性/隐性电平,没有打开、展示或修改源码,因此标题下不强行补代码。CAN 数据帧、控制器配置和收发函数属于后续课程。

一、CAN基础理论

这节先建立 CAN 的物理层直觉:数据怎样通过 CANH/CANL 两根线传播,STM32 内部 CAN 控制器与外部收发器各做什么,以及显性、隐性分别表示哪个逻辑值。课程没有一次讲完全部协议,数据帧与寄存器配置留到后续课程。

1.1 通信特点

课程把 CAN 概括为串行、无独立时钟线、半双工、差分、多节点总线通信。作为入门记忆没有问题,但每个词都需要加上边界:

特点准确含义容易误解的地方
串行通信数据位沿时间顺序在总线上传输“串行”只描述位的传送方式,不等于 UART
无独立时钟线CANH/CANL 中没有单独的 SCLK;各节点按配置好的位时间采样,并利用边沿重新同步不能理解成节点之间完全不需要同步;所有节点的标称位率和位时序必须兼容
半双工同一共享总线上不能让两个节点同时传送互不相关的数据帧发送节点仍会一边驱动 TXD、一边经 RXD监视实际总线,用于仲裁和错误检测
差分传输接收器主要根据 CANH - CANL 的电压差判断状态不是简单地把两根线当成两个独立高低电平 GPIO
多节点、多主多个节点挂在同一总线上;总线空闲时,不只固定主机可以请求发送CAN 帧的标识符描述消息含义和优先级,不是简单的目标节点地址

因此,把 CAN 称为“异步串行通信”时,重点是它没有 SPI 那样的独立时钟线;它又不同于 UART 依赖每个字符的起始位、停止位完成同步。CAN 控制器会按位时序划分一个位,并利用总线边沿持续做硬同步或重新同步。

1.2 串口

这一小节实际是在复习通信分类,不只是在讲 UART:

分类维度类型含义与例子
数据位传送方式串行位按时间先后传输,如 UART、SPI、I2C、USB、CAN
数据位传送方式并行多个数据位通过多根线同时传输,如并行存储器数据总线
时钟关系同步通常有显式时钟或严格的同步机制;SPI 有独立 SCLK
时钟关系异步没有随数据一同传输的独立时钟;UART 用起始/停止位,CAN 使用位时序与边沿同步
传输方向全双工双方可以同时发送和接收不同数据,典型全双工 UART 使用独立 TX、RX
传输方向半双工双方都能发送和接收,但共享介质同一时刻只承载一个传输方向,如常见两线 RS-485 总线
传输方向单工信息始终只向一个方向传输

这些分类彼此独立。例如 SPI 是串行、同步,普通四线 SPI 还可以全双工;UART 是串行、异步,也可以全双工;CAN 是串行、共享总线、差分传输,通常按半双工理解,但发送时仍必须监听总线。

1.3 半双工差分信号

“半双工”描述总线的使用方式,“差分”描述电气信号怎样表示状态,二者不是同一个概念。差分链路也可以设计成全双工,例如用两对差分线分别承担两个方向;CAN 则让多个节点共享同一对 CANH/CANL,所以应用层面属于半双工共享总线。

1.3.1 单端信号

单端信号由“一根信号线相对于参考地的电压”表示状态。它并不是物理上只需要一根导线:电流仍要有返回路径,通信双方通常必须共享参考地。

以 3.3 V GPIO 为例,接收器比较 Vsignal - VGND 与输入阈值,判断 0 或 1。具体阈值由芯片数据手册规定,不能把“低电平一定是 0 V、高电平一定是 3.3 V”当成所有器件的精确判定条件。

若信号线上耦合了噪声,或两块板的地电位不同,接收端看到的单端电压会发生变化;当变化越过阈值时就可能误判。因此单端信号是否可靠不仅取决于信号线,还取决于地线、回流路径、边沿速度、线长和周围干扰。

1.3.2 差分信号

差分接收器主要观察两根线的电压差。若将两根线记为 A、B,则:

[ V_{diff}=V_A-V_B ]

若外界干扰几乎同样耦合到两根线上,可写成:

[ V'_{diff}=(V_A+V_n)-(V_B+V_n)=V_A-V_B ]

共同叠加的 Vn 被称为共模干扰;理想相减后它不会改变差分电压,这就是差分传输抗干扰能力较强的主要原因。不过真实线缆、布线和接收器并不完全对称,接收器也有允许的共模电压范围,所以不能理解为“任何强度的干扰都能完全抵消”。

课程链接中的绿色、黄色曲线只是通用差分示意。脱离具体接口标准,不能仅凭“哪条线在上面”断言逻辑 0 或 1;必须先知道两条线的名称、差分极性和接收阈值。对于本课的高速 CAN,才有后文所述的 CANH - CANL 判定规则。

1.3.3 单端与差分信号比较
对比项单端信号差分信号
判定依据信号线相对参考地的电压两根信号线之间的电压差
导线至少需要信号与回流参考使用成对信号线,工程上通常还需要地参考或隔离方案
抗共模干扰较依赖地电位与单线噪声两线受到近似相同干扰时,可由差分接收器抑制
布线重点连续回流路径、地弹噪声、边沿完整性成对走线、阻抗、端接、支线长度和两线对称性
常见例子GPIO、TTL UARTUSB D+/D-、HDMI TMDS、以太网线对、RS-485、CANH/CANL

USB、HDMI、以太网、RS-485 和 CAN 都采用差分思想,但其电压、编码、速率、阻抗和协议完全不同,不能直接互连。

双绞线让两根导线在空间中不断交换相对位置,使外界磁场更容易近似等量地耦合到两根线上,同时缩小环路面积,降低辐射与受扰。课程桌面实验线很短,即使不绞合也可能工作;手工把 CANH/CANL 均匀绞在一起,是在练习正确的工程习惯,而不是保证通信成功的唯一条件。

配套 STM32F103ZET6 开发板原理图能看到两组 USB 差分线:下载 USB 的 USB_D+ / USB_D- 接到 CH340C,另一组经保护器件和 22 Ω 串联电阻接到 MCU 的 PA12/USB_DP、PA11/USB_DM。D+/D- 是 USB 差分对,CH340C 另一侧的 USART TX/RX 才是单端串口信号,两者不能混为一谈。

还要注意 PA11、PA12 是复用引脚:本工程把它们作为 CAN_RX、CAN_TX 时,不能同时把同一组引脚当作 USB 设备数据接口使用。该开发板的“供电 USB”数据线实际连接到 PA11/PA12;做 CAN 实验若只借它供电,应避免同时启用 USB 数据功能,并留意连接电脑后 D+/D- 网络可能对 CAN 引脚造成额外负载。

1.4 CAN网络固件更新应用场景

这一段视频实际讲的是 CAN 的多节点总线,并没有展开固件更新流程。逐字稿中的“iPhone C”应为 I2C:二者都允许在共享线路上连接多个器件,但物理层、寻址、仲裁和协议并不相同,不能因为拓扑相似就互换。

高速 CAN 的典型网络结构是线形主干加短支线:

120 Ω ── CANH/CANL 主干 ──●────●────●── 120 Ω
                           │    │    │
                         节点1 节点2 节点3
  • 总线物理两端各放一个与线缆特性阻抗匹配的终端电阻,经典高速 CAN 通常为 120 Ω;
  • 中间节点通过尽量短的支线接入,不能把每个节点都拉成长支路组成任意星形;
  • 一帧报文会传播到总线上的所有节点,各节点再按过滤规则决定是否交给软件;
  • 标识符表示消息类型和仲裁优先级,不直接等价于 I2C 从机地址;
  • 发送节点也会读回总线实际状态,所以它并非“只发送、不接收”。

在本专题后面的固件更新项目中,CAN 只负责运送帧;固件通常远大于单个 CAN 数据帧,还需要 ISO-TP 一类上层分段协议以及镜像长度、校验等机制。本节只建立多节点物理网络概念,不提前补入更新代码。

1.5 基础理论

原笔记把速率、距离和负载字节数写成了几个固定值,容易产生误解。应把物理层类型与数据链路协议分开看:

类型典型/上限速率单帧数据字段本课应掌握的结论
低速容错 CAN最高约 125 kbit/sClassical CAN 为 0~8 字节使用专用低速容错物理层;不是本项目重点
高速 Classical CAN(CAN CC)标称位率最高 1 Mbit/s0~8 字节本项目使用的类型;线形双绞线,两端端接
CAN FD仲裁阶段使用标称位率,数据阶段可选择更高位率0~64 字节FD 是 Flexible Data-rate;8 Mbit/s 是常见支持值/课程概览值,不是所有网络都必然达到的固定速率

单位应写成 kbit/s、Mbit/s,表示每秒传输的比特数;KB/s、MB/s 表示字节数,不能混用。帧中还有标识符、控制、CRC、ACK、位填充等开销,所以业务有效载荷吞吐量会低于总线位率。

传输距离同样不能脱离速率写成“低速固定 1000 m、高速固定小于 40 m”。课程入门书给出的代表性配对是高速 CAN 在 1 Mbit/s 时约 40 m、低速示例在 40 kbit/s 时约 1 km;位率降低后可允许更长的传播延迟。实际距离还受收发器环路延迟、线缆传播速度、采样点、节点数量、隔离器、连接器、支线和电磁环境影响,因此最终必须按所用器件和布线计算并实测。

STM32F103ZE 的 bxCAN 是 CAN 2.0B Active 控制器,支持 Classical CAN,不支持 CAN FD。课程介绍 CAN FD 是帮助建立技术谱系,不能只改一个位率参数就让 F103ZE 发出 CAN FD 帧。

1.6 总线组成

STM32F103ZET6 官方资料给出的通信资源包括最多 2 路 I2C、3 路 SPI、5 路 USART、USB 和 1 路 CAN。视频说“很多芯片都有两个 CAN”只能理解为举例,不能泛化;具体数量必须查所选 MCU 数据手册。

当前课程工程使用默认 CAN 引脚:

STM32F103ZE                         CAN 收发器
PA12 / CAN_TX  ─────────────────→  TXD / CTX
PA11 / CAN_RX  ←─────────────────  RXD / CRX
                                     │
                                  CANH/CANL
                                     │
                                   总线

这里看起来是“TX 接 TX、RX 接 RX”,是因为模块的 TXD/RXD 名称以收发器与 MCU 之间的功能方向命名:

  • MCU 的 CAN_TX 输出位流,必须送到收发器的驱动输入 TXD;
  • 收发器从总线检测到状态后,由接收输出 RXD 送回 MCU 的 CAN_RX;
  • UART 两个对等设备直连时才常说 TX → RX、RX ← TX 交叉。

购买的模块可能写 CTX/CRX、TXD/RXD,也可能丝印含糊,最终应按模块原理图和收发器数据手册确认方向,不能只按字母机械连线。

PA11/PA12 是本工程选择的默认映射,不是 STM32F103ZE 唯一可能的 CAN 引脚;芯片还支持通过 AFIO 重映射到其他引脚。复现课程时必须让 CubeMX/寄存器映射与实物接线一致。

1.7 总线拓扑图

一个完整 CAN 节点可分成三层:

层次所在位置主要职责
CPU/应用程序MCU 内部产生或消费温湿度、车速等业务数据
CAN 控制器(bxCAN)MCU 内部外设组帧、仲裁、位时序、CRC、ACK、过滤和错误管理
CAN 收发器MCU 外部芯片/模块在 TXD/RXD 逻辑电平与 CANH/CANL 差分电平之间转换
传输介质双绞线、连接器、终端电阻把差分信号传到所有节点,并控制反射和传播延迟

发送方向是:

应用数据 → CAN 控制器形成位流 → TXD → 收发器驱动 CANH/CANL

接收方向是:

CANH/CANL 的差分状态 → 收发器判决 → RXD → CAN 控制器解析帧 → 应用数据

入门书用“CAN 控制器根据两根线的电位差判断总线电平”帮助理解整体作用;从实际硬件分工看,直接连接 CANH/CANL 并完成模拟电压比较的是收发器,控制器从 RXD 读取已经判决后的逻辑状态。MCU 内部即使带 bxCAN,也不能省略外部收发器后直接连接 CANH/CANL。

书中拓扑图还展示了两个相互独立、速率不同的 CAN 网络。不同位率的网络不能把 CANH/CANL 直接并在一起;它们需要由包含两套 CAN 接口的网关在更高层转发消息。

1.8 差分信号

高速 CAN 使用两种总线状态。定义:

[ V_{diff}=V_{CANH}-V_{CANL} ]

总线状态逻辑值CANH 典型值CANL 典型值差分电压典型值
隐性(recessive)1约 2.5 V约 2.5 V约 0 V
显性(dominant)0约 3.5 V约 1.5 V约 2 V

这张表是课程和 ISO 11898 高速 CAN 图使用的标称示意值,用于理解状态最合适;接收器不是要求每次都精确测到 2.500 V、3.500 V 和 1.500 V。以课程实物上的 SN65HVD230 为例,TI 资料给出的接收判决窗口是:差分电压小于 0.5 V 应判为隐性,大于 0.9 V 应判为显性;器件和负载也会使两根线的实际共模电压偏离上述标称值。

因此示波器调试时应同时观察 CANH、CANL 和数学差分波形,不能因为单根线没有正好达到 3.5 V 就直接判定故障。还要确认探头地夹的参考点和允许共模范围,避免错误测量或短路总线。

“显性=逻辑 0,隐性=逻辑 1”可以用课程的“显 0”帮助记忆,但不要进一步写成“显性就是低电平、隐性就是高电平”:在总线侧,显性状态实际表现为 CANH 上升、CANL 下降,判定依据是两线压差,而不是某一根线单独为高或低。

名称中的“显性/隐性”来自总线叠加规则:若一个节点发送隐性 1,另一个节点同时发送显性 0,实际总线呈现显性 0。可把它理解为显性会覆盖隐性。这一特性让发送节点能够边发送边监听总线,并为下一课的数据帧仲裁奠定基础。

最后用四句话归纳本课:

  1. CAN 是多节点共享的串行差分总线,不是把两个 UART 换个名称;
  2. MCU 内部 CAN 控制器负责协议,外部收发器负责差分物理层;
  3. 高速 CAN 的隐性是逻辑 1、差分约 0 V,显性是逻辑 0、差分约 2 V;
  4. 位率、线长、终端、支线和收发器延迟共同决定链路是否可靠,不能只背一个距离数字。

参考资料