Files
motor-controller/docs/debug_guide.md

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 值

可能原因:

  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=XXXREC=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 中:

#define CAN_DEBUG           1   // 启用调试输出
#define CAN_DEBUG_VERBOSE   1   // 启用最详细的调试信息

启用 HAL 层调试

User/Device/mf4010v2_hal.h 中:

#define MF4010V2_HAL_DEBUG  1   // 启用 HAL 层调试输出

联系支持

如果问题仍然无法解决,请提供:

  1. 完整的串口输出
  2. CAN_PrintDebugInfo 的输出
  3. 硬件接线照片
  4. 万用表测量结果