Files
motor-controller/docs/debug_guide.md

241 lines
5.6 KiB
Markdown

# 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 值
**可能原因**:
1. CAN 总线被占用或有持续的主导电平
2. 上一次发送未完成,邮箱被占用
3. CAN 控制器处于错误状态
**解决方法**:
1. 检查 CAN_H/CAN_L 接线是否正确
2. 检查电机是否上电
3. 检查终端电阻是否正确连接
4. 重启系统让 CAN 重新初始化
---
### 问题 2: LEC 显示错误代码
**症状**: `LEC: X (XXX Error)`
**不同错误的含义**:
#### LEC=2 (Form Error)
- **原因**: 帧格式错误,通常是波特率不匹配
- **排查**:
1. 确认电机 CAN 波特率是否为 1Mbps
2. 检查 CAN 接线
3. 检查终端电阻
#### LEC=3 (Ack Error)
- **原因**: 没有收到应答
- **排查**:
1. 电机未上电
2. CAN_H/CAN_L 接反
3. 缺少终端电阻
#### LEC=5 (Bit0 Error)
- **原因**: 发送 dominant (0) 但检测到 recessive (1)
- **排查**:
1. CAN 总线开路
2. 电机未连接
---
### 问题 3: TEC/REC 值很高
**症状**: `TEC=XXX``REC=XXX` (大于 0)
**可能原因**:
1. 通信持续失败
2. 总线噪声干扰
3. 接线问题
**解决方法**:
1. 检查 CAN 接线
2. 检查地线连接
3. 添加/检查终端电阻
---
### 问题 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 初始化输出
1. 确认 `State: 0 (Ready)`
2. 确认 `Error: 0x00000000 (No Error)`
3. 确认 `Calculated bitrate: 1000000 bps`
### 第二步:检查发送过程
1. 观察 `Sending CAN frame: ID=0x141, Data=80 00 00 00 00 00 00 00`
2. 如果长时间超时,检查硬件
### 第三步:分析错误
1. 查看 LEC 值判断错误类型
2. 查看 TEC/REC 判断错误严重程度
3. 根据错误类型进行针对性排查
---
## 启用详细调试
### 启用 CAN 详细调试
`Core/Inc/can.h` 中:
```c
#define CAN_DEBUG 1 // 启用调试输出
#define CAN_DEBUG_VERBOSE 1 // 启用最详细的调试信息
```
### 启用 HAL 层调试
`User/Device/mf4010v2_hal.h` 中:
```c
#define MF4010V2_HAL_DEBUG 1 // 启用 HAL 层调试输出
```
---
## 联系支持
如果问题仍然无法解决,请提供:
1. 完整的串口输出
2. CAN_PrintDebugInfo 的输出
3. 硬件接线照片
4. 万用表测量结果