跳转至

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 操作步骤

  1. 关闭底盘电机使能,只连接 CAN 分析器。
  2. 设置资料匹配的波特率,监听标准数据帧。
  3. 确认 0x101、0x102、0x103 持续出现,DLC 均为 8。
  4. 静止时解析 0x101 速度;轻推底盘或在安全条件下短时遥控,观察字段变化。
  5. 发送 0x181 全零帧,确认底盘进入 CAN 控制模式但不运动。
  6. 发送小的正 X 目标并立即回零。阿克曼和非全向底盘保持 Y 为 0。
  7. 记录报文周期和丢帧情况。修改发送频率前查 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、控制模式、使能或超时

章节导航

上一章:串口通信协议 · 返回本篇 · 下一章:里程计、编码器、IMU 与 PID