STM32 标准USB库(V2.2.1)的一坑
[复制链接]
最近调试STM32F205USB通信,使用了F205的两个USB,一个HS一个FS,不过都是用的HS,都是做USB主机,外接其他USB外设,USB在分别调试好FS和HS后,合在一起出问题了,拔插后总是识别有干扰,HS拔掉后,检测不了,而且导致FS也出问题。
首先使用CUBEMX生产代码,测试HS和FS同时使用,并没有问题,插拔后识别正常,故排除HS和FS不能同时使用的担心。检查初始化代码,各种修改都没有结果,折腾了一天,头脑懵逼。
第二天,继续调试看寄存器,偶然发现拔掉HS外设的时候,FS有寄存器内容被清除了,而HS寄存器该清除的数据却没有清除,看到这里想到了和自己预料的HS和FS处理过程中有地方搞混了,接下来就是单步调试,最后找到问题点如下:
case HOST_DEV_DISCONNECTED :
/* Manage User disconnect operations*/
phost->usr_cb->DeviceDisconnected();
/* Re-Initialize Host for new Enumeration */
USBH_DeInit(pdev, phost);
phost->usr_cb->DeInit();
phost->class_cb->DeInit(pdev, &phost->device_prop);
USBH_DeAllocate_AllChannel(pdev);
phost->gState = HOST_IDLE;
/* Re-Initialize Host for new Enumeration */
HCD_Init(pdev,
#ifdef USE_USB_OTG_FS
USB_OTG_FS_CORE_ID
#else
USB_OTG_HS_CORE_ID
#endif
);
这里拔掉USB外设后,重新初始化的时候用了宏定义,而我是同时使用F205的HS和FS,以致不管我拔掉HS外设还是FS外设,
都是把FS的重新初始化了。
最后修改此段代码,增加判断即可:
if( pdev == &USB_OTG_Core )
{
HCD_Init(pdev, USB_OTG_HS_CORE_ID);
}
else if( pdev == &USB_OTG_FS_Core )
{
HCD_Init(pdev, USB_OTG_FS_CORE_ID);
}
使用的USB库为:V2.2.1,例程DualCore,这个例程我也测试过,同时使用HS和FS是有问题的,望大家遇到此处时不要在被坑。
|