5.6 KiB
5.6 KiB
CAN/电机驱动调试指南
重构后代码说明
代码结构
应用层 (freertos.c)
↓
设备驱动层 (mf4010v2.c/h)
↓
HAL 层 (mf4010v2_hal.c/h)
↓
通用 CAN 层 (can.c/h)
↓
STM32 HAL 库
文件说明
| 文件 | 说明 |
|---|---|
Core/Inc/can.h |
CAN 驱动头文件,包含 API 声明和调试宏 |
Core/Src/can.c |
CAN 驱动实现,包含详细调试输出 |
User/Device/mf4010v2.h |
电机驱动头文件,包含命令宏和安全函数 |
User/Device/mf4010v2.c |
电机驱动实现 |
User/Device/mf4010v2_hal.h |
电机 HAL 层头文件 |
User/Device/mf4010v2_hal.c |
电机 HAL 层实现 |
Core/Src/freertos.c |
FreeRTOS 任务,包含调试输出 |
调试输出说明
1. 系统启动后会输出:
========== CAN/Motor Initialization ==========
=== CAN Debug Info ===
State: 0 (Ready), Error: 0x00000000 (No Error)
ESR (Error Status Register): 0x00000000
LEC (Last Error Code): 0 (No Error)
TEC (Tx Error Counter): 0
REC (Rx Error Counter): 0
BOFF (Bus Off): 0, EPVF (Error Passive): 0, EWGF (Error Warning): 0
TSR (Tx Status Register): 0x1C000000
TME (Tx Mailbox Empty): 0x7
CODE (Mailbox Code): 3
Free mailboxes: 3
RFR0: 0x00000000, FIFO0 fill level: 0
BTR: 0x03020005
BRP=5, BS1=2, BS2=3, SJW=3
Calculated bitrate: 1000000 bps
======================
2. 关键状态说明
CAN 状态值
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | Ready | CAN 就绪,可以发送/接收 |
| 1 | Busy | CAN 忙 |
| 2 | Busy TX | 发送忙 |
| 3 | Busy RX | 接收忙 |
| 4 | Busy TX/RX | 发送/接收都忙 |
| 5 | Reset | CAN 复位 |
| 6 | Error | CAN 错误 |
| 7 | Timeout | CAN 超时 |
LEC (最后错误代码)
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | No Error | 无错误 |
| 1 | Stuff Error | 填充错误 |
| 2 | Form Error | 帧格式错误 |
| 3 | Ack Error | 应答错误 |
| 4 | Bit1 Error | 发送 1 但检测到 0 |
| 5 | Bit0 Error | 发送 0 但检测到 1 |
| 6 | CRC Error | CRC 校验错误 |
| 7 | No Change | 无变化 |
TEC/REC (错误计数)
- TEC (发送错误计数): 发送失败时增加,>255 进入 Bus Off 状态
- REC (接收错误计数): 接收失败时增加,>127 进入 Error Passive 状态,>255 进入 Bus Off 状态
常见问题排查
问题 1: CAN State 不是 Ready (0)
症状: CAN State: 2 (Busy) 或其他非 0 值
可能原因:
- CAN 总线被占用或有持续的主导电平
- 上一次发送未完成,邮箱被占用
- CAN 控制器处于错误状态
解决方法:
- 检查 CAN_H/CAN_L 接线是否正确
- 检查电机是否上电
- 检查终端电阻是否正确连接
- 重启系统让 CAN 重新初始化
问题 2: LEC 显示错误代码
症状: LEC: X (XXX Error)
不同错误的含义:
LEC=2 (Form Error)
- 原因: 帧格式错误,通常是波特率不匹配
- 排查:
- 确认电机 CAN 波特率是否为 1Mbps
- 检查 CAN 接线
- 检查终端电阻
LEC=3 (Ack Error)
- 原因: 没有收到应答
- 排查:
- 电机未上电
- CAN_H/CAN_L 接反
- 缺少终端电阻
LEC=5 (Bit0 Error)
- 原因: 发送 dominant (0) 但检测到 recessive (1)
- 排查:
- CAN 总线开路
- 电机未连接
问题 3: TEC/REC 值很高
症状: TEC=XXX 或 REC=XXX (大于 0)
可能原因:
- 通信持续失败
- 总线噪声干扰
- 接线问题
解决方法:
- 检查 CAN 接线
- 检查地线连接
- 添加/检查终端电阻
问题 4: Motor command failed
症状: Error: Motor command failed with status -1
状态码说明:
| 值 | 含义 |
|---|---|
| -1 | 超时 (MF4010_ERR_TIMEOUT) |
| -2 | 无效 CAN ID (MF4010_ERR_INVALID_ID) |
| -3 | 无响应 (MF4010_ERR_NO_RESPONSE) |
| -4 | 无效参数 (MF4010_ERR_INVALID_PARAM) |
| -5 | CAN 总线关闭 (MF4010_ERR_BUS_OFF) |
| -6 | CRC 错误 (MF4010_ERR_CRC) |
| -7 | 硬件错误 (MF4010_ERR_HARDWARE) |
硬件检查清单
接线检查
STM32F407 MF4010V2 电机
─────────────────────────────────
PB13 (CAN2_TX) ──── CAN_H (黄/绿)
PB12 (CAN2_RX) ──── CAN_L (白)
GND ──── GND
终端电阻
- 在 CAN_H 和 CAN_L 之间并联 120Ω 电阻
- 如果电机内部已有终端电阻,可以不加
电压测量 (上电状态)
| 测量点 | 正常值 |
|---|---|
| CAN_H 对地 | 2.5-3.5V |
| CAN_L 对地 | 1.5-2.5V |
| CAN_H - CAN_L | 0V (隐性) |
电阻测量 (断电状态)
| 测量点 | 正常值 |
|---|---|
| CAN_H - CAN_L | 60-120Ω |
调试流程
第一步:检查 CAN 初始化输出
- 确认
State: 0 (Ready) - 确认
Error: 0x00000000 (No Error) - 确认
Calculated bitrate: 1000000 bps
第二步:检查发送过程
- 观察
Sending CAN frame: ID=0x141, Data=80 00 00 00 00 00 00 00 - 如果长时间超时,检查硬件
第三步:分析错误
- 查看 LEC 值判断错误类型
- 查看 TEC/REC 判断错误严重程度
- 根据错误类型进行针对性排查
启用详细调试
启用 CAN 详细调试
在 Core/Inc/can.h 中:
#define CAN_DEBUG 1 // 启用调试输出
#define CAN_DEBUG_VERBOSE 1 // 启用最详细的调试信息
启用 HAL 层调试
在 User/Device/mf4010v2_hal.h 中:
#define MF4010V2_HAL_DEBUG 1 // 启用 HAL 层调试输出
联系支持
如果问题仍然无法解决,请提供:
- 完整的串口输出
- CAN_PrintDebugInfo 的输出
- 硬件接线照片
- 万用表测量结果