19. CAN 通信协议¶
19.1 学习目标¶
识别底盘 CAN 上下行帧 ID、字节序和速度单位,在电机失能状态下验证接线与报文,再进行低速控制。
19.2 适用范围¶
教育机器人和大型科研底盘常用 1 Mbit/s,S 系列常见 500 kbit/s。波特率、终端电阻和帧 ID 都必须与当前固件一致。
19.3 操作前检查¶
CAN 调试先关闭电机使能
错误的下行帧可能触发运动。先关闭使能或架空轮子,只观察 OLED 模式和总线报文。
- CAN_H 对 CAN_H,CAN_L 对 CAN_L,共地符合接口设计。
- 使用带 CAN 收发器的适配器,MCU 引脚不能直接接总线。
- 确认总线两端终端电阻和波特率。
19.4 工作原理¶
CAN是一条可供多个设备共享的双线通信总线。每条报文带有ID,接收设备据此判断消息用途;它并不替应用程序检查速度单位、字节序或车型是否匹配。
表中的DLC表示一帧包含多少个数据字节。ID 表示报文用途,同一个总线上的设备可根据 ID 选择接收哪些报文。
串口的 24 字节上行状态被拆成三帧标准 CAN 数据帧:
| ID | DLC | 主要内容 |
|---|---|---|
0x101 |
8 | 标志、X/Y/Z 速度 |
0x102 |
8 | X/Y/Z 加速度、X 角速度 |
0x103 |
8 | Y/Z 角速度、电池电压、校验/尾标记 |
控制下行使用标准帧 0x181,DLC 为 8:X、Y、Z 目标速度各占 2 字节,最后 2 字节预留。线速度为 mm/s,Z 角速度按资料约定放大 1000。
CAN 控制器本身有帧级错误检测,但应用层仍需核对 ID、DLC、字节序和范围。资料把串口 BCC 字段保留在第三组上行数据中;是否使用它由接收程序决定。
19.5 操作步骤¶
- 关闭底盘电机使能,只连接 CAN 分析器。
- 设置资料匹配的波特率,监听标准数据帧。
- 确认
0x101、0x102、0x103持续出现,DLC 均为 8。 - 静止时解析
0x101速度;轻推底盘或在安全条件下短时遥控,观察字段变化。 - 发送
0x181全零帧,确认底盘进入 CAN 控制模式但不运动。 - 发送小的正 X 目标并立即回零。阿克曼和非全向底盘保持 Y 为 0。
- 记录报文周期和丢帧情况。修改发送频率前查 STM32 任务调度和接收超时逻辑。
Linux 的 SocketCAN 把 CAN 适配器表示成类似网络接口的设备,例如 can0。下列命令仅在适配器已经配置为 can0 后使用:
ip -details link show can0
candump can0
不要在未核对字节内容时直接复制 cansend 运动示例。
19.6 验收标准¶
- 波特率和物理接线正确,总线无持续 error-passive/bus-off。
- 三个上行 ID 与资料字段变化一致。
- 全零
0x181不引起运动。 - 低速正 X 命令方向正确,随后零帧可靠停止。
- CAN 与串口解析得到的速度、电压趋势一致。
19.7 故障排查¶
| 现象 | 检查 |
|---|---|
| 无报文 | 波特率、H/L 线序、共地、收发器和使能 |
| 大量错误帧 | 终端电阻、线缆、波特率或支线过长 |
| 只有部分 ID | 接收过滤、固件发送任务或总线负载 |
| 速度符号错误 | 字节序、坐标转换或固件版本 |
发 0x181 无反应 |
ID 类型、DLC、控制模式、使能或超时 |