最近项目使用了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();
或者是描述报告真的不对,请大神指点一二!!!
- __ALIGN_BEGIN uint8_t USBD_HS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
- {
- 0x12, /*bLength */ //设备描述符的长度为18字节
- USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ //USB描述符的类型为0x01(设备描述符的编号为0x01)
- 0x00, /*bcdUSB */ //USB协议的版本,原值为0x00
- 0x02, //USB协议的版本为2.0,原值为0x02
- 0x00, /*bDeviceClass*/ //设备所使用的类代码
- 0x00, /*bDeviceSubClass*/ //设备所使用的子类代码
- 0x00, /*bDeviceProtocol*/ //设备所使用的协议
- USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ //端点0的最大包长为64字节
- LOBYTE(USBD_VID), /*idVendor*/ // 厂商ID号
- HIBYTE(USBD_VID), /*idVendor*/ // 厂商ID号
- LOBYTE(USBD_PID_HS), /*idProduct*/ // 产品ID号
- HIBYTE(USBD_PID_HS), /*idProduct*/ // 产品ID号
- 0x00, /*bcdDevice rel. 2.00*/ //设备版本号
- 0x02, //设备版本号
- USBD_IDX_MFC_STR, /*Index of manufacturer string*/ //厂商字符串的索引值,这里的值是0x01
- USBD_IDX_PRODUCT_STR, /*Index of product string*/ //产品的字符串的索引值,这里的值是0x02
- USBD_IDX_SERIAL_STR, /*Index of serial number string*/ //设备的序列号字符串索引值,这里是0x03
- USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ //表示设备有多少种配置,这里是1种配置
- };
复制代码
- /* 自定义报告 */
- __ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = {
- //这是一个全局条目(bType为1)
- 0x05, 0x01, /* Generic Desktop */
- //这是一个局部条目(bType为2),说明接下来的应用集合用途用于鼠标
- 0x09, 0x02,
- 0xA1, 0x01,
- 0x09, 0x01,
- 0xA1, 0x00,
- 0x05, 0x09,
- 0x19, 0x01,
- 0x29, 0x03,
- 0x15, 0x00,
- 0x25, 0x01,
- 0x95, 0x03,
- 0x75, 0x01,
- 0x81, 0x02,
- 0x95, 0x01,
- 0x75, 0x05,
- 0x81, 0x03,
- 0x05, 0x01,
- 0x09, 0x30,
- 0x09, 0x31,
- 0x09, 0x38,
- 0x15, 0x81,
- 0x25, 0x7F,
- 0x75, 0x08,
- 0x95, 0x03,
- 0x81, 0x06,
- 0xC0,
- 0xC0
- };
复制代码
- /*设置描述符r */
- __ALIGN_BEGIN static uint8_t USBD_HID_CfgHSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = {
- 0x09, //描述符长度为9字节 /* bLength: Configuration Descriptor size */
- //描述符类型为配置描述符(0x02)
- USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
- //配置描述符集合的总长度34字节
- USB_HID_CONFIG_DESC_SIZ,
- //配置描述符集合的总长度34字节 /* wTotalLength: Bytes returned */
- 0x00,
- 0x01, //配置所支持的接口数量1个 /* bNumInterfaces: 1 interface */
- 0x01, //该配置的值为0x01 /* bConfigurationValue: Configuration value */
- 0x00, //该配置的字符索引值,这里没有,为0 /* iConfiguration: Index of string descriptor describing the configuration */
- 0xC0, //该设备属性,0xc0表示自供电,不支持远程唤醒/* bmAttributes: bus powered and Support Remote Wake-up */
- 0x32, //该设备需要的最大电流100mA /* MaxPower 100 mA: this current is used for detecting Vbus */
- /************** Descriptor of Joystick Mouse interface ****************/
- /* 接口描述符 */
- /* 09 */
- 0x09, //接口描述符长度为9字节 /* bLength: Interface Descriptor size */
- //描述符类型为接口描述符(0x04)
- USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */
- 0x00, //该接口的编号,第一个接口编号为0x00 /* bInterfaceNumber: Number of Interface */
- 0x00, //该接口的备用编号为0x00 /* bAlternateSetting: Alternate setting */
- //非0端点数目,由于需要一个中断输入点,因此该值为0x01
- 0x01, /* bNumEndpoints */
- //该接口所使用的类,USB鼠标摇杆是HID类,HID的编码为0x03
- 0x03, /* bInterfaceClass: HID */
- //该接口所使用的子类,
- 0x00, //原值0x01 /* bInterfaceSubClass : 1=BOOT, 0=no boot */
- //如果子类为支持引导启动的子类,则协议可选择鼠标或键盘,此为选0
- 0x00, //原0x02 /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
- 0, //该接口的字符串索引,这里没有,为0 /* iInterface: Index of string descriptor */
-
- /******************** Descriptor of Joystick Mouse HID ********************/
- /* HID描述符 */
- /* 18 */
- //本HID描述下只有一个下级描述符,所以长度为9字节
- 0x09, /* bLength: HID Descriptor size */
- //描述符类型为HID描述符(0x21)
- HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
- 0x11, //本协议使用HIDx.x协议,原值0x11 /* bcdHID: HID Class Spec release number */
- 0x01, //本协议使用HIDx.x协议,原值0x01
- 0x33, //设备适用的国家代码,原0x00,0x21美国 /* bCountryCode: Hardware target country */
- 0x01, //下级描述符的数目,我们只有一个报告描述符 /* bNumDescriptors: Number of HID class descriptors to follow */
- 0x22, //下级描述符的类型,编号为0x22 /* bDescriptorType */
- HID_MOUSE_REPORT_DESC_SIZE, //下级描述符的长度74 /* wItemLength: Total length of Report descriptor */
- 0x00, //下级描述符的长度74
- /******************** Descriptor of Mouse endpoint ********************/
- /* 27 */
- 0x07, /* bLength: Endpoint Descriptor size */
- //描述符类型为端点描述符(0x05)
- USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */
- //端点的地址,我们用输入端点1(D7位表示数据方向,输入端点D7为1,所以输入端点1的地址为0x81)
- HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */
- //D1~D0为端点类型选择,该端点为中断端点,中断端点的编号为0x03,其它位保留为0
- 0x03, /* bmAttributes: Interrupt endpoint */
- HID_EPIN_SIZE, //该端点1的最大包长为4字节 /* wMaxPacketSize: 4 Byte max */
- 0x00, //该端点1的最大包长为4字节
- HID_HS_BINTERVAL, //端点查询的时间7ms /* bInterval: Polling Interval */
- /* 34 */
- };
复制代码
|
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通信了
Bus Hound的设置应该是对的,因为插入其它USB设备查捕捉到数据
截图如下:能否提供下例程,网上始终找不到例程,拜托了!!!
STM32CubeMX Version 5.6.0,固件包STM32Cube FW_F4 V1.25.0,STM32F429ZGT6,Keil版本:5.29.0.0
我抓了一下HID扫描枪的数据,和我的对比了下,
发现电脑不发送获取描述的命令,
电脑应该要发送80 06开头的8字节命令。如:80 06 00 03 00 00 ff 00
我的电脑接了一个USB HUB,HUB上插我的板子。
以下是我板子抓到的数据,麻烦看下啥问题。
只用USB_OTG_HS_DP和USB_OTG_HS_DM,
还有一个地脚
接上拉也还是不行
PC可以发现USB设备了,是我上拉接成下拉了,非常感谢!
现在虽然可以检测到USB设备了,但枚举不成功,HAL使用的都是默认配置,能否再指点一下。搞了好久没找到原因。
STM32的USB库,配置比较麻烦,一个小地方选错,就会枚举不了。只能一点一点试。
建议楼主网络上面找一个类似的,现成的,可以正常工作的项目参考一下,再研究自己的为什么不行。
评分
查看全部评分
还是不能识别为HID设备,win10系统下,提示获取设备描述符失败,可我反复检查了设备描述符肯定是OK的
Bus Hound查看,一个数据也没有
还是没数据,硬件反复排查没问题,没应该是HAL库问题了