你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
f56878 提问时间:2015-11-2 18:53 /

用 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 报告:无法识别,在设备管理器里删除,重新枚举,也不行,不是一上电就上拉的问题。

请大侠们指点!


a.png
收藏 1 评论15 发布时间:2015-11-2 18:53

举报

15个回答
f56878 回答时间:2015-11-2 19:51:17
在例程的编译设置里加了 USE_USB_FS 预编译宏,用全速的模式,断点调试没有见到访问usb的各描述符,Windows较早就停止了枚举过程
creep 回答时间:2015-11-2 20:29:18
是使用的HS-OTG作为全速设备使用的吗,如果是的话,配置下面的编译选项试试!
QQ拼音截图未命名.png
f56878 回答时间:2015-11-2 20:43:17
试过加 USE_USB_OTG_FS,USE_EMBEDDED_PHY,还是不能识别。

枚举时能看得到进 OTG_FS_IRQHandler 中断一次
f56878 回答时间:2015-11-2 20:52:39
creep 发表于 2015-11-2 20:29
是使用的HS-OTG作为全速设备使用的吗,如果是的话,配置下面的编译选项试试!

...

d:\b.png

我的连接方法
b.png
creep 回答时间:2015-11-2 21:05:11

你这是明显用的HS-OTG核的FS模式啊,配置编译选项用我上面说的试试。
f56878 回答时间:2015-11-2 21:17:13
creep 发表于 2015-11-2 21:05
你这是明显用的HS-OTG核的FS模式啊,配置编译选项用我上面说的试试。

试过加 USE_USB_OTG_FS,USE_EMBEDDED_PHY啊,不过是 USE_USB_OTG_FS,不是 USE_USB_OTG_HS。

全部编译宏如下:

USE_HAL_DRIVER,STM32F407xx,USE_STM324xG_EVAL,USE_USB_FS,USE_USB_OTG_FS,USE_EMBEDDED_PHY

我要怎样改?
creep 回答时间:2015-11-2 21:36:28
f56878 发表于 2015-11-2 21:17
试过加 USE_USB_OTG_FS,USE_EMBEDDED_PHY啊,不过是 USE_USB_OTG_FS,不是 USE_USB_OTG_HS。

全部编译宏 ...

我看你用的HAL下的USB库,我用的是标准库,有多大区别我不太清楚,你先修改成下面的试试。
USE_HAL_DRIVER,STM32F407xx,USE_STM324xG_EVAL,USE_USB_OTG_HS,USE_EMBEDDED_PHY
再确认下,你是不是用的HS-USB引脚通信的,如果是要修改为USE_USB_OTG_HS!
f56878 回答时间:2015-11-2 22:02:32
creep 发表于 2015-11-2 21:36
我看你用的HAL下的USB库,我用的是标准库,有多大区别我不太清楚,你先修改成下面的试试。
USE_HAL_DRIVE ...

你好,没有外接 PHY啊,不能用 HS 模式吧,我用的是 PA11,PA12(USBDM/USBDP)两个管脚,CubeMx图形化工具生成 FS 模式的 USB 也是自动选择这两个脚的,用这两个脚会有问题吗?
creep 回答时间:2015-11-2 22:16:34
f56878 发表于 2015-11-2 22:02
你好,没有外接 PHY啊,不能用 HS 模式吧,我用的是 PA11,PA12(USBDM/USBDP)两个管脚,CubeMx图形化工 ...

USE_EMBEDDED_PHY是内嵌的,407应该有2组USB吧,一组全速一组高速的,都可以作为全速从设备使用,所以你就要明确你用的是哪个,然后初始化对应的USB外设。
f56878 回答时间:2015-11-2 22:31:15
creep 发表于 2015-11-2 22:16
USE_EMBEDDED_PHY是内嵌的,407应该有2组USB吧,一组全速一组高速的,都可以作为全速从设备使用,所以你 ...

嗯,查了,PA11,PA12是 FS 口, HS 的要外接 PHY
c.png
f56878 回答时间:2015-11-2 22:35:11
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  
  if(hpcd->Instance == USB_OTG_FS)
  {
    /* Configure USB FS GPIOs */
    __HAL_RCC_GPIOA_CLK_ENABLE();
   
    /* Configure DM DP Pins */
    GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
        /* Configure VBUS Pin */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /* Configure ID pin */
    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /* Enable USB FS Clocks */
    __HAL_RCC_USB_OTG_FS_CLK_ENABLE();

     /* Set USBFS Interrupt to the lowest priority */
    HAL_NVIC_SetPriority(OTG_FS_IRQn, 7, 0);
   
    /* Enable USBFS Interrupt */
    HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
  }
  
  else if(hpcd->Instance == USB_OTG_HS)
  {
    /* Configure USB FS GPIOs */
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOH_CLK_ENABLE();
    __HAL_RCC_GPIOI_CLK_ENABLE();
   
    /* CLK */
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /* D0 */
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   
    /* D1 D2 D3 D4 D5 D6 D7 */
    GPIO_InitStruct.Pin = GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_5 |\
                          GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
   
    /* STP */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
   
    /* NXT */
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
   
    /* DIR */
    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
    HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
   
    /* Enable USB HS Clocks */
    __HAL_RCC_USB_OTG_HS_CLK_ENABLE();
    __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE();
   
    /* Set USBHS Interrupt to the lowest priority */
    HAL_NVIC_SetPriority(OTG_HS_IRQn, 7, 0);
   
    /* Enable USBHS Interrupt */
    HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
  }   
}
f56878 回答时间:2015-11-4 12:06:13
原因找到,问题解决,原因如下:

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盘就安装成功了。堆栈小了枚举一定会失败,而且没有哪儿会报错。

f56878 回答时间:2015-11-4 12:08:08
结贴,以后的人注意这两个问题,尤其后一个很隐蔽,调试了很久才找到
qgmfly-175255 回答时间:2016-11-21 15:18:35
您好,我用的是STM32f103ZE的单片机,使用CDC时遇到电脑识别不了USB设备(未知USB设备---设备描述符请求失败)
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版