前言
CAN(Controller Area Network,控制器局域网络)作为一种高可靠性的现场总线,由德国 BOSCH 公司开发并逐步成为国际标准(ISO11519、ISO11898)。其凭借抗干扰强、错误检测能力突出等优势,广泛应用于汽车电子、工业控制等恶劣环境。本文将从 CAN 协议基础、STM32 CAN 控制器特性、CubeMX 配置到实战测试,全方位讲解 CAN 通信的原理与实现,附带完整代码示例,适合嵌入式开发者快速上手。
一、CAN 协议核心概念
1.1 CAN 协议简介
CAN 总线是一种多主方式的串行通信总线,无需主机协调即可实现多节点间的数据交互。它不仅是汽车电子控制系统的标准总线,衍生出的 J1939 协议更是专为大型货车和重工机械设计。相较于 I2C、SPI 等总线,CAN 总线在长距离传输、抗电磁干扰方面表现更优,且节点扩展无需修改原有系统,灵活性极强。
1.2 CAN 物理层
CAN 采用异步通信方式,仅通过 CAN_High 和 CAN_Low 两条差分信号线传输数据,物理层的核心特性如下:
1.2.1 两种总线网络拓扑
| 网络类型 |
遵循标准 |
最大传输距离 |
最高速率 |
总线要求 |
适用场景 |
| 闭环总线 |
ISO11898 |
40m |
1Mbps |
两端各接 120Ω 终端电阻 |
高速近距离场景(如汽车内部模块) |
| 开环总线 |
ISO11519 - 2 |
1km |
125kbps |
两根总线各串联 2.2kΩ 电阻 |
低速远距离场景(如工业传感器组网) |
1.2.2 通讯节点结构
CAN 通讯节点由CAN 控制器和CAN 收发器组成,典型硬件连接如下:
- 控制器(如 STM32 内置 bxCAN)通过 CAN_Tx/CAN_Rx 与收发器连接,传输 TTL 电平信号;
- 收发器(如 TJA1050)将 TTL 电平转换为差分信号,通过 CAN_H/CAN_L 接入总线;
- 示例:STM32 的 CAN 外设作为控制器,外接 TJA1050 收发器构成完整节点,类似串口与 MAX3232 的电平转换逻辑。
1.2.3 差分信号优势
差分信号通过两根信号线的电压差值表示逻辑状态,相比单端信号有三大核心优势:
- 抗干扰能力强:外界噪声同步耦合到两根信号线,接收端仅关注差值,可抵消共模噪声;
- 低电磁辐射:两根信号线相位相反,辐射的电磁场相互抵消,降低对周边设备的干扰;
- 时序精准:以两信号交点作为开关变化点,受温度、工艺影响小,适合低幅度信号传输。
1.2.4 CAN 差分信号定义
高速 CAN 的电平规范如下:
| 逻辑状态 |
CAN_H 电压 |
CAN_L 电压 |
电压差(VH - VL) |
| 隐性电平(逻辑 1) |
2.5V |
2.5V |
0V |
| 显性电平(逻辑 0) |
3.5V |
1.5V |
2V |
总线特性:显性电平优先级高于隐性电平。若多个节点同时发送信号,显性电平会覆盖隐性电平,这是 CAN 总线仲裁机制的核心基础。
1.3 CAN 协议层
1.3.1 位同步与波特率
CAN 无时钟信号,节点通过波特率约定和位同步保障通信同步:
- 位时序分解:每个数据位分为 4 段,总长度为 8 - 25 个最小时间单位 Tq
- 同步段(SS):1Tq,检测总线跳变沿实现同步;
- 传播段(PTS):1 - 8Tq,补偿网络物理延时;
- 相位缓冲段 1(PBS1):1 - 8Tq,补偿边沿误差,可加长;
- 相位缓冲段 2(PBS2):2 - 8Tq,补偿边沿误差,可缩短。
- 波特率计算:波特率 = 1 / 单个数据位时间,单个数据位时间 = (SS + PTS + PBS1 + PBS2) × Tq
- 同步方式
- 硬同步:帧起始时通过跳变沿校准时序;
- 重新同步:通过数据位跳变沿动态调整 PBS1/PBS2 长度,补偿时序偏移。

1288

被折叠的 条评论
为什么被折叠?



