GD32F105RB 使用官方USB例程,运行至枚举状态机时进入死循环
将外部晶振修改为8M之后,打印主频96M,一切正常,但是USB的时钟源是未进行修改,应为我主频没变,时钟配置如下void usb_rcu_config(void){
uint32_t system_clock = rcu_clock_freq_get(CK_SYS);
printf("系统时钟为:%d\n", system_clock);
if (48000000U == system_clock) {
usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1;
timer_prescaler = 3U;
} else if (72000000U == system_clock) {
usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5;
timer_prescaler = 5U;
printf("系统时钟为:%d\n", system_clock);
} else if (96000000U == system_clock) {
usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2;
timer_prescaler = 7U;
}else {
/*reserved*/
}
rcu_usb_clock_config(usbfs_prescaler);
rcu_periph_clock_enable(RCU_USBFS);
}
但是运行至枚举状态机时就卡死在死循环不出来,这是为什么呢
进入case HOST_DEV_ENUM:之后:调用usbh_devdesc_get (uhost, 8U)) -----》》》usbh_ctl_handler (uhost);------》》》
if (URB_DONE == usbh_urb_wait (uhost, uhost->control.pipe_in_num, DATA_STAGE_TIMEOUT)) {
uhost->control.ctl_state = CTL_STATUS_OUT;
}
就卡死在这个等待
用GD32F305试试,稳定性好一些 请问楼主如何解决的,我的是305的也卡在这里 dsyq 发表于 2022-10-9 21:41
用GD32F305试试,稳定性好一些
请问楼主如何解决的,我的是305的也卡在这里 如果时钟配置不正确,USB 外设无法稳定运行,可能导致枚举过程中的死循环。 可能是时钟配置问题 检查DATA_STAGE_TIMEOUT的值是否合适。如果超时时间太短,可能导致等待不成功。 系统时钟不稳定导致的? USBH库版本与GD32F105RB的硬件和固件不兼容。 USB接口连接是否正常 用USB分析仪来捕获USB通信数据,分析枚举过程中的数据包是否正常。 GD32F105RB的USB模块需要特定的时钟配置,通常是48MHz。如果时钟没有正确设置,USB模块可能无法正常工作,导致枚举失败。 检查USB设备描述符(如设备描述符、配置描述符、接口描述符等)是否正确配置。如果描述符配置错误或不符合USB规范,可能会导致主机无法正确识别设备。 USB中断未正确配置或处理,导致无法响应主机的请求,状态机无法继续。 检查USB端点配置是否正确。每个端点都有其特定的用途和配置要求,如果端点配置错误或不符合USB规范,可能会导致通信失败。 仔细检查描述符内容和中断处理逻辑。 USB设备正确响应主机的枚举请求,包括设备描述符、配置描述符等。 尝试连接不同的USB主机,检查是否为主机兼容性问题。 USB中断的优先级设置正确。如果中断优先级设置不当,可能会导致中断处理不及时或丢失中断请求。