📖 第 30 章:CAN通讯实验(CAN)

🔧 正点原子《DMF407 开发指南》V1.0 · Chapter 30
🗨️ 「汽车级总线:CAN 让你的车会说话。」
这一章在干嘛? CAN 实验:CAN 协议帧格式、bxCAN 控制器、SN65HVD230 收发器、标识符过滤、远程帧。学会后 ECU 通信、Modbus 替代方案都能上手。
30.1 CAN 总线简介30.2 硬件设计30.3 程序设计30.4 下载验证

30.1 CAN 总线简介

30.1.1 CAN 简介

CAN(Controller Area Network):1986 年 Bosch 为汽车开发的串行总线。

原书图 30.1.1.1:CAN 总线拓扑
原书图 30.1.1.1:CAN 总线拓扑

电平:

状态CANHCANL差分
显性(0)3.5 V1.5 V2 V
隐性(1)2.5 V2.5 V0 V

注意 CAN 是「显性=0」,与 TTL 反逻辑。

30.1.2 CAN 帧格式

CAN 有 5 种帧:数据帧、远程帧、错误帧、过载帧、帧间隔。最常用数据帧

字段长度说明
SOF1 bit起始位(显性)
ID11 bit标识符(标准帧)
RTR1 bit远程发送请求
IDE1 bit扩展帧标志
r01 bit保留
DLC4 bit数据字节数(0~8)
Data0~64 bit数据
CRC15 bit校验
ACK2 bit应答
EOF7 bit帧结束

原书图 30.1.2.1:CAN 数据帧结构
原书图 30.1.2.1:CAN 数据帧结构

30.1.3 bxCAN 控制器

F407 内置 bxCAN:

原书图 30.1.3.1:bxCAN 框图
原书图 30.1.3.1:bxCAN 框图

30.2 硬件设计

CAN1 引脚:PA11/PA12 → SN65HVD230 → CANH/CANL。

原书图 30.2.1:SN65HVD230 接线图
原书图 30.2.1:SN65HVD230 接线图

30.3 程序设计

30.3.1 CubeMX 配置

30.3.2 关键代码

CAN_TxHeaderTypeDef txh = {0};
txh.StdId = 0x123;
txh.IDE = CAN_ID_STD;
txh.RTR = CAN_RTR_DATA;
txh.DLC = 8;
uint8_t tx_data[8] = {1,2,3,4,5,6,7,8};
uint32_t mailbox;
HAL_CAN_AddTxMessage(&hcan1, &txh, tx_data, &mailbox);

// 接收
CAN_RxHeaderTypeDef rxh;
uint8_t rx_data[8];
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &rxh, rx_data);

30.4 下载验证

两块开发板对连,A 发送 → B 接收并打印到串口;用 CAN 分析仪观察波形。

终端电阻 120 Ω 必加在总线两端各一个,否则高速时信号反射导致错误。

🧠 小测验
CAN 总线用几根差分线?
2 根(CANH、CANL)。
CAN 是多主还是单主?
多主。
bxCAN 有几个接收 FIFO?
2 个,每个深度 3。
← 上一篇🏠 顶层目录下一篇 →