# 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. 万用表测量结果