在移植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配置
6. 验证设备兼容性
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配置,这两类问题占比最高。
在移植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配置
6. 验证设备兼容性
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配置,这两类问题占比最高。
举报