RT-Thread论坛
直播中

英雄孤寂

13年用户 1280经验值
私信 关注
[问答]

移植Cherryusb host,连接usb时显示Failed to get device descriptor,errorcode:-12怎么处理?




回帖(1)

李鸿洋

2025-10-21 17:56:55

在移植CherryUSB Host时遇到Failed to get device descriptor, errorcode: -12错误,通常表示USB传输超时。错误码-12在CherryUSB中一般对应USB_ERR_TIMEOUT(具体定义需查看源码中的usb_errno.h)。以下是系统化的解决方案:




1. 检查硬件连接和供电



  • 线缆质量:更换高质量的USB线缆(带屏蔽层),确保连接可靠。

  • 电源稳定性:用万用表测量VBUS电压(标准为5V±5%),若设备功耗大,尝试外接供电。

  • 信号干扰:避免高频干扰源,检查USB数据线是否靠近电源线或电机。




2. 确认USB主机控制器初始化



  • 时钟配置:确保USB控制器时钟使能且频率正确(例如STM32需48MHz)。

  • 引脚映射:检查USB DP/DM 引脚是否正确配置(复用功能、上拉/下拉)。

  • 主机模式使能:确认代码中已调用usbh_init()并启用主机模式(非OTG模式误配)。




3. 调试底层传输(关键步骤)



  • 端点0配置:确保控制端点0已正确初始化,最大包长度设为64(全速设备)或8(低速设备)。

  • 超时时间调整:在发送控制传输的函数中增加超时时间(如修改usbh_control_transfer()中的timeout参数至500ms)。

  • 日志打印:在以下位置添加调试日志:
     // 在 usbh_core.c 的传输函数中打印错误详情
    void usbh_control_transfer(...) {
         // ...
         ret = usbh_controller_transfer(transfer);
         if (ret < 0) {
             USB_LOG_ERR("Control transfer failed, stage: %d, err: %dn", stage, ret); // 添加阶段信息
         }
    }




4. 分析协议时序(抓包分析)



  • 逻辑分析仪:用Saleae/PulseView捕获DP/DM信号,检查:

    • 主机是否发送了GET_DESCRIPTOR请求(标准请求数据包)。

    • 设备是否回复ACK或NAK。


  • 典型问题定位

    • 设备无响应:检查设备固件或硬件问题。

    • 设备回复NAK:设备忙(需重试机制)。

    • 数据校验错误:信号质量问题。





5. 检查CherryUSB配置



  • 内存池大小:增大USB堆内存(修改usbh_config.h):
     #define CONFIG_USBHOST_REQUEST_BUFFER_LEN  4096 // 默认值可能过小

  • 枚举重试机制:确保启用枚举重试(部分版本需手动配置重试次数)。




6. 验证设备兼容性



  • 更换设备:尝试连接不同的USB设备(如U盘、HID鼠标),排除设备固件问题。

  • 速度匹配:强制指定设备速度(临时修改代码):
     // 在 usbh_core.c 的发现设备流程中
    usbh_dev->speed = USB_SPEED_FULL; // 强制全速模式




7. 排查驱动冲突



  • 中断优先级:USB中断优先级需高于其他中断(如SDIO、UART),避免处理延迟。

  • DMA配置:如果使用DMA,检查描述符对齐和内存缓存一致性(启用SCB_CleanDCache_by_Addr)。




8. 源码级调试(终极手段)


搜索CherryUSB源码中返回-12的位置,反向定位调用栈:


   // 在工程中全局搜索 "return -12" 或 "return USB_ERR_TIMEOUT"
   // 示例:usbh_controller_xxx.c
   if (timeout_expired) {
       USB_LOG_ERR("Transfer timeout");
       return -12; // 此处向上层返回错误
   }



总结排查路线


graph TD
  A[错误:-12 超时] --> B{硬件检查}
  B --> C[线缆/供电]
  B --> D[信号质量]
  A --> E{软件配置}
  E --> F[端点0参数]
  E --> G[超时时间]
  A --> H[协议分析] --> I[逻辑分析仪抓包]
  A --> J[CherryUSB设置] --> K[内存池/重试机制]
  H --> L[设备无响应/NAK]

通过逐步排除硬件问题→调整驱动参数→协议层分析,大部分超时问题可解决。重点优先检查硬件连接质量端点0配置,这两类问题占比最高。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分