做了个USB从机设备,Windows无法识别

2019-07-14 16:06发布

STM32F407 做了个USB 从机设备,Windows 无法识别,换成STM例程 HID_Standalone,MSC_Standalone 也无法识别

确认情况如下:

1.USB线接的是对的,用万用表测过顺序是正确的,依次为 VBUS,D-,D+,ID,GND。D-接PA11 USBDM,D+接PA12 USBDP

2.ID线悬空,D+用1.5K电阻上拉,VBUS 不接,程序里修改为 hpcd.Init.vbus_sensing_enable = 0

3.晶振是 25MHZ,分频 RCC_OscInitStruct.PLL.PLLM = 25;   USB时钟应该是 48MHZ的,其实例程里的晶振就是25MHZ,不用改

4.使用 Device Monitoring Studio 抓包,可以抓到48个上下行成对的包,都是成功的,大都是 URB_FUNCtiON_CLEAR_FEATURE_TO_ENDPOINT | URB_FUNCTION_VENDOR_OTHER | URB_FUNCTION_SELECT_CONFIGURATION


然后 Windows 报告:无法识别,在设备管理器里删除,重新枚举,也不行,不是一上电就上拉的问题。

请大侠们指点!



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
gan5482
2019-07-15 18:16
原因找到,问题解决,原因如下:

1.我买的是16MHZ晶振,调试时偶然调用了HAL_RCC_GetSysClockFreq(); ,返回 262500000!我一倒着推算,晶振是25MHZ的,商家真是! 随改成25MHZ,无果,今天又改回16MHZ试,Widows竟然认了USB!HAL_RCC_GetSysClockFreq()函数不知干什么用的,不靠谱!

记得中间曾在16MHZ与25MHZ间来回改,为什么不行原因不知道,但现在确定晶振是16MHZ的没错。

2.中间也曾出现过24对Urb上下行包收发成功的记录,为什么没能识别,另外一个原因是 startup_stm32f407xx.s 函数堆栈太小!

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000200

ST东西丰富,五花八门,将0x00000400改成0x00000800,0x00000200改成0x00003000就可以了,U盘就安装成功了。堆栈小了枚举一定会失败,而且没有哪儿会报错。

一周热门 更多>