CAN基础理论
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 UART | USB 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/s | Classical CAN 为 0~8 字节 | 使用专用低速容错物理层;不是本项目重点 |
| 高速 Classical CAN(CAN CC) | 标称位率最高 1 Mbit/s | 0~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。可把它理解为显性会覆盖隐性。这一特性让发送节点能够边发送边监听总线,并为下一课的数据帧仲裁奠定基础。
最后用四句话归纳本课:
- CAN 是多节点共享的串行差分总线,不是把两个 UART 换个名称;
- MCU 内部 CAN 控制器负责协议,外部收发器负责差分物理层;
- 高速 CAN 的隐性是逻辑 1、差分约 0 V,显性是逻辑 0、差分约 2 V;
- 位率、线长、终端、支线和收发器延迟共同决定链路是否可靠,不能只背一个距离数字。
参考资料
- 课程配套 CAN总线入门书:核对第 3.2 节总线拓扑图,以及第 7.2 节高速/低速 CAN 的速率、距离、差分电平和终端形式。
- 课程配套 STM32 开发板原理图 与实验工程 01Can_Test.ioc:核对 USB D+/D-、PA11/PA12 复用,以及当前工程的 CAN_RX/CAN_TX 引脚和 500 kbit/s 配置。
- ST 官方 STM32F103xC/xD/xE 数据手册:核对 ZET6 的 I2C、SPI、USART、USB、CAN 资源以及 CAN/USB 引脚复用。
- TI 官方 SN65HVD230 数据手册:核对课程实物收发器的显性/隐性状态、差分输出与接收判决窗口。
- CAN in Automation 官方 高速 CAN 物理层说明、Classical CAN 说明 与 CAN 术语表:核对标称电压、两端 120 Ω 终端、显性覆盖隐性、发送时总线监视以及 Classical CAN/CAN FD 载荷长度。
- Bosch 官方 CAN FD Protocol:核对 Classical CAN 的 1 Mbit/s、8 字节限制以及 CAN FD 的可变数据位率和 64 字节载荷。
- TI 官方 Controller Area Network Physical Layer Requirements:核对高速 CAN 的线形拓扑、端接以及位率与总线长度之间的权衡关系。