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

枚举失败Human Interface Device Class(HID)

[复制链接]
jyl_518 提问时间:2020-3-24 08:22 /
最近项目使用了STM32F429ZGT6
由于使用了LTDC占用了USB_OTG_FS
只能选择用USB_OTG_HS的内置FS Phy,

并且在中间件USB_DEVICE中选择Human Interface Device Class(HID)(使用默认设置),
生成程序KEIL编译下载到板子,插 入USB线,
开始PC根本检测不到USB新设备(异常的USB设备也没有),后DP+ 加了上拉电阻后,可以检测到设备,但不能识别,显示unknown Device,应该是枚举失败了。经一周时间反复调整描述符仍不能正确识别成HID设备,在win10环境下,系统提示获取设备描述符失败。
我看HAL生成的程序已经对USB初始化了,初始化就这句 MX_USB_DEVICE_Init();
或者是描述报告真的不对,请大神指点一二!!!
3.png 2.png 1.png
  1. __ALIGN_BEGIN uint8_t USBD_HS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  2. {
  3.   0x12,                       /*bLength */                                                //设备描述符的长度为18字节
  4.   USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/                                //USB描述符的类型为0x01(设备描述符的编号为0x01)
  5. 0x00,                       /*bcdUSB */                                                                                //USB协议的版本,原值为0x00
  6. 0x02,                                                                                                                        //USB协议的版本为2.0,原值为0x02
  7.   0x00,                       /*bDeviceClass*/                                        //设备所使用的类代码
  8.   0x00,                       /*bDeviceSubClass*/                                //设备所使用的子类代码
  9.   0x00,                       /*bDeviceProtocol*/                                //设备所使用的协议
  10.   USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/                                //端点0的最大包长为64字节
  11.   LOBYTE(USBD_VID),           /*idVendor*/                                                //        厂商ID号
  12.   HIBYTE(USBD_VID),           /*idVendor*/                                                //        厂商ID号
  13.   LOBYTE(USBD_PID_HS),        /*idProduct*/                                                //        产品ID号
  14.   HIBYTE(USBD_PID_HS),        /*idProduct*/                                                //        产品ID号
  15.   0x00,                       /*bcdDevice rel. 2.00*/                        //设备版本号
  16.   0x02,                                                                                                                        //设备版本号
  17.   USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/        //厂商字符串的索引值,这里的值是0x01
  18.   USBD_IDX_PRODUCT_STR,       /*Index of product string*/                //产品的字符串的索引值,这里的值是0x02
  19.   USBD_IDX_SERIAL_STR,        /*Index of serial number string*/        //设备的序列号字符串索引值,这里是0x03
  20.   USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/                        //表示设备有多少种配置,这里是1种配置
  21. };
复制代码

  1. /* 自定义报告 */
  2. __ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = {
  3.   //这是一个全局条目(bType为1)
  4.   0x05,   0x01,                                /* Generic Desktop */
  5.   //这是一个局部条目(bType为2),说明接下来的应用集合用途用于鼠标
  6.   0x09,   0x02,
  7.   0xA1,   0x01,
  8.   0x09,   0x01,

  9.   0xA1,   0x00,
  10.   0x05,   0x09,
  11.   0x19,   0x01,
  12.   0x29,   0x03,

  13.   0x15,   0x00,
  14.   0x25,   0x01,
  15.   0x95,   0x03,
  16.   0x75,   0x01,

  17.   0x81,   0x02,
  18.   0x95,   0x01,
  19.   0x75,   0x05,
  20.   0x81,   0x03,

  21.   0x05,   0x01,
  22.   0x09,   0x30,
  23.   0x09,   0x31,
  24.   0x09,   0x38,

  25.   0x15,   0x81,
  26.   0x25,   0x7F,
  27.   0x75,   0x08,
  28.   0x95,   0x03,

  29.   0x81,   0x06,
  30.   0xC0,   
  31.   0xC0
  32. };
复制代码

  1. /*设置描述符r */
  2. __ALIGN_BEGIN static uint8_t USBD_HID_CfgHSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = {
  3.   0x09,                //描述符长度为9字节                                                  /* bLength: Configuration Descriptor size */
  4.   //描述符类型为配置描述符(0x02)         
  5.   USB_DESC_TYPE_CONFIGURATION,                        /* bDescriptorType: Configuration */
  6.   //配置描述符集合的总长度34字节        
  7.   USB_HID_CONFIG_DESC_SIZ,
  8.   //配置描述符集合的总长度34字节                                          /* wTotalLength: Bytes returned */
  9.   0x00,
  10.   0x01,                //配置所支持的接口数量1个                                  /* bNumInterfaces: 1 interface */
  11.   0x01,                //该配置的值为0x01                                                  /* bConfigurationValue: Configuration value */
  12.   0x00,                //该配置的字符索引值,这里没有,为0                  /* iConfiguration: Index of string descriptor describing the configuration */
  13.   0xC0,                //该设备属性,0xc0表示自供电,不支持远程唤醒/* bmAttributes: bus powered and Support Remote Wake-up */
  14.   0x32,                //该设备需要的最大电流100mA                                  /* MaxPower 100 mA: this current is used for detecting Vbus */

  15.   /************** Descriptor of Joystick Mouse interface ****************/  
  16.   /*                         接口描述符                                 */
  17.   /* 09 */
  18.   0x09,                //接口描述符长度为9字节                                      /* bLength: Interface Descriptor size */
  19.   //描述符类型为接口描述符(0x04)
  20.   USB_DESC_TYPE_INTERFACE,                            /* bDescriptorType: Interface descriptor type */
  21.   0x00,                //该接口的编号,第一个接口编号为0x00          /* bInterfaceNumber: Number of Interface */
  22.   0x00,                //该接口的备用编号为0x00                                   /* bAlternateSetting: Alternate setting */
  23.   //非0端点数目,由于需要一个中断输入点,因此该值为0x01   
  24.   0x01,                                               /* bNumEndpoints */
  25. //该接口所使用的类,USB鼠标摇杆是HID类,HID的编码为0x03   
  26.   0x03,                                               /* bInterfaceClass: HID */
  27.   //该接口所使用的子类,
  28.   0x00,                //原值0x01                                                                  /* bInterfaceSubClass : 1=BOOT, 0=no boot */
  29.   //如果子类为支持引导启动的子类,则协议可选择鼠标或键盘,此为选0
  30.   0x00,                //原0x02                                                                  /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
  31.   0,                //该接口的字符串索引,这里没有,为0                  /* iInterface: Index of string descriptor */
  32.   
  33.   /******************** Descriptor of Joystick Mouse HID ********************/
  34.   /*                            HID描述符                                   */
  35.   /* 18 */
  36.   //本HID描述下只有一个下级描述符,所以长度为9字节
  37.   0x09,                                               /* bLength: HID Descriptor size */
  38.   //描述符类型为HID描述符(0x21)
  39.   HID_DESCRIPTOR_TYPE,                                /* bDescriptorType: HID */
  40.   0x11,                //本协议使用HIDx.x协议,原值0x11                  /* bcdHID: HID Class Spec release number */
  41.   0x01,                //本协议使用HIDx.x协议,原值0x01                                          
  42.   0x33,                //设备适用的国家代码,原0x00,0x21美国          /* bCountryCode: Hardware target country */
  43.   0x01,                //下级描述符的数目,我们只有一个报告描述符 /* bNumDescriptors: Number of HID class descriptors to follow */
  44.   0x22,                //下级描述符的类型,编号为0x22                          /* bDescriptorType */
  45.   HID_MOUSE_REPORT_DESC_SIZE,        //下级描述符的长度74  /* wItemLength: Total length of Report descriptor */
  46.   0x00,                                                        //下级描述符的长度74  
  47.   /******************** Descriptor of Mouse endpoint ********************/
  48.   /* 27 */
  49.   0x07,                                               /* bLength: Endpoint Descriptor size */
  50.   //描述符类型为端点描述符(0x05)         
  51.   USB_DESC_TYPE_ENDPOINT,                             /* bDescriptorType: */
  52. //端点的地址,我们用输入端点1(D7位表示数据方向,输入端点D7为1,所以输入端点1的地址为0x81)
  53.   HID_EPIN_ADDR,                                      /* bEndpointAddress: Endpoint Address (IN) */
  54.   //D1~D0为端点类型选择,该端点为中断端点,中断端点的编号为0x03,其它位保留为0
  55.   0x03,                                               /* bmAttributes: Interrupt endpoint */
  56.   HID_EPIN_SIZE,                //该端点1的最大包长为4字节    /* wMaxPacketSize: 4 Byte max */
  57.   0x00,                                        //该端点1的最大包长为4字节
  58.   HID_HS_BINTERVAL,                //端点查询的时间7ms                  /* bInterval: Polling Interval */
  59.   /* 34 */
  60. };
复制代码



收藏 1 评论33 发布时间:2020-3-24 08:22

举报

33个回答
jyl_518 回答时间:2020-4-2 08:29:29
天臆弄人 发表于 2020-4-1 17:44
一个星期还没搞定吗,刚为了回复你了,特意帮你查了下手册,VBUS脚要使能,检测到电压,会自动上拉DP+ ...
作为Device HID使用:
1、不使能USB_OTG_HS_VBUS,使能USB_OTG_HS_VBUS全都试过了:
1)不使能USB_OTG_HS_VBUS时,外接1.5K电阻DP上拉,主机找不到STM32F429的USB,unkonw device都不能发现。
2)   使能USB_OTG_HS_VBUS时,在确保VBUS引脚已有5V电压情况下,主机仍找不到STM32F429的USB,连unkonw device都不能发现。
2、现在基本可以确定是HAL生成的程序,未能触发USB运行了。我记得18年时用stm32f103也是用的HAL库,是能识别的,但是使用新版HAL后在原来的103硬件上,居然也不能识别USB。很明显就是HAL(或固件库)的问题。

再搞二天还是不行就暂时放弃HAL开发USB通信了
jyl_518 回答时间:2020-3-31 08:15:49
流水源 发表于 2020-3-30 21:56
怎么会没数据呢?是不是设置不对?你把监控截图看看。

Bus Hound的设置应该是对的,因为插入其它USB设备查捕捉到数据
截图如下:
能否提供下例程,网上始终找不到例程,拜托了!!!
STM32CubeMX Version 5.6.0,固件包STM32Cube FW_F4 V1.25.0,
STM32F429ZGT6,Keil版本:5.29.0.0
1.png 2.png 3.png



jyl_518 回答时间:2020-3-31 15:40:12
流水源 发表于 2020-3-31 14:17
都没看到获取描述符的命令

我抓了一下HID扫描枪的数据,和我的对比了下,
发现电脑不发送获取描述的命令,
电脑应该要发送80 06开头的8字节命令。如:80 06 00 03 00 00  ff 00
我的电脑接了一个USB HUB,HUB上插我的板子。
以下是我板子抓到的数据,麻烦看下啥问题。
55666.png




李康1202 回答时间:2020-3-24 09:38:44
有检测引脚没有
jyl_518 回答时间:2020-3-24 09:56:10

只用USB_OTG_HS_DP和USB_OTG_HS_DM,
还有一个地脚
radio2radio 回答时间:2020-3-24 10:05:42
FS需要D+外部拉高,有没有。
jyl_518 回答时间:2020-3-24 11:22:09
radio2radio 发表于 2020-3-24 10:05
FS需要D+外部拉高,有没有。

接上拉也还是不行
jyl_518 回答时间:2020-3-24 13:37:04
radio2radio 发表于 2020-3-24 10:05
FS需要D+外部拉高,有没有。

PC可以发现USB设备了,是我上拉接成下拉了,非常感谢!
jyl_518 回答时间:2020-3-27 09:04:49
radio2radio 发表于 2020-3-24 10:05
FS需要D+外部拉高,有没有。

现在虽然可以检测到USB设备了,但枚举不成功,HAL使用的都是默认配置,能否再指点一下。搞了好久没找到原因。
radio2radio 回答时间:2020-3-27 10:19:19
jyl518-283289 发表于 2020-3-27 09:04
现在虽然可以检测到USB设备了,但枚举不成功,HAL使用的都是默认配置,能否再指点一下。搞了好久没找到原 ...

STM32的USB库,配置比较麻烦,一个小地方选错,就会枚举不了。只能一点一点试。

建议楼主网络上面找一个类似的,现成的,可以正常工作的项目参考一下,再研究自己的为什么不行。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

jyl_518 回答时间:2020-3-30 15:51:43
自己顶下,
还是不能识别为HID设备,win10系统下,提示获取设备描述符失败,可我反复检查了设备描述符肯定是OK的
STMWoodData 回答时间:2020-3-30 16:20:35
提示: 作者被禁止或删除 内容自动屏蔽
jyl_518 回答时间:2020-3-30 16:21:45
流水源 发表于 2020-3-30 16:20
用USB监控看看发送和接收的数据和命令。

Bus Hound查看,一个数据也没有
STMWoodData 回答时间:2020-3-30 21:56:59
提示: 作者被禁止或删除 内容自动屏蔽
STMWoodData 回答时间:2020-3-31 09:03:36
提示: 作者被禁止或删除 内容自动屏蔽
jyl_518 回答时间:2020-3-31 09:46:05
流水源 发表于 2020-3-31 09:03
没看到勾选上设备啊。

还是没数据,硬件反复排查没问题,没应该是HAL库问题了
123下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版