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

枚举失败Human Interface Device Class(HID)

[复制链接]
jyl518-283289 提问时间: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个回答
likang1202 回答时间:2020-3-24 09:38:44
有检测引脚没有
jyl518-283289 回答时间:2020-3-24 09:56:10

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

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

PC可以发现USB设备了,是我上拉接成下拉了,非常感谢!
jyl518-283289 回答时间: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

查看全部评分

jyl518-283289 回答时间:2020-3-30 15:51:43
自己顶下,
还是不能识别为HID设备,win10系统下,提示获取设备描述符失败,可我反复检查了设备描述符肯定是OK的
流水源 回答时间:2020-3-30 16:20:35
jyl518-283289 发表于 2020-3-30 15:51
自己顶下,
还是不能识别为HID设备,win10系统下,提示获取设备描述符失败,可我反复检查了设备描述符肯定 ...

用USB监控看看发送和接收的数据和命令。

评分

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

查看全部评分

1234下一页

所属标签

相似问题

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