241 lines
5.6 KiB
Markdown
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. 万用表测量结果
|