求教,在做stm32f407 usb hid开发,根据官方例子修改而来,使用的是HS接口,FS模式,PC可以成功识别usb hid设备。现在通过Bus Hound给设备发送数据,stm32可以收到;但是通过调用USBD_CUSTOM_HID_SendReport()函数来向PC发送数据,Bus Hound始终收不到发送的数据,调试也不能进入USBD_CUSTOM_HID_DataIn()函数。 请问这是什么原因呢? 我的各种设备描述符的配置如下: (1)设备描述符 /* USB Standard Device Descriptor */ __ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = { 0x12, /*bLength */ USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ 0x00, /*bcdUSB */ 0x02, 0x00, /*bDeviceClass*/ 0x00, /*bDeviceSubClass*/ 0x00, /*bDeviceProtocol*/ USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ LOBYTE(USBD_VID), /*idVendor*/ HIBYTE(USBD_VID), /*idVendor*/ LOBYTE(USBD_PID), /*idVendor*/ HIBYTE(USBD_PID), /*idVendor*/ 0x50, /*bcdDevice rel. 2.00*/ 0x10, USBD_IDX_MFC_STR, /*Index of manufacturer string*/ USBD_IDX_PRODUCT_STR, /*Index of product string*/ USBD_IDX_SERIAL_STR, /*Index of serial number string*/ USBD_CFG_MAX_NUM /*bNumConfigurations*/ } ; /* USB_DeviceDescriptor */ (2)配置描述符 /* USB HID device Configuration Descriptor */ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuration Descriptor size */ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ USB_CUSTOM_HID_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ 0x00, 0x01, /*bNumInterfaces: 1 interface*/ 0x01, /*bConfigurationValue: Configuration value*/ 0x00, /*iConfiguration: Index of string descriptor describing the configuration*/ 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ /************** Descriptor of Custom HID interface ****************/ /* 09 */ 0x09, /*bLength: Interface Descriptor size*/ USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/ 0x00, /*bInterfaceNumber: Number of Interface*/ 0x00, /*bAlternateSetting: Alternate setting*/ 0x02, /*bNumEndpoints*/ 0x03, /*bInterfaceClass: HID*/ 0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ 0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ 0, /*iInterface: Index of string descriptor*/ /******************** Descriptor of Custom HID ********************/ /* 18 */ 0x09, /*bLength: HID Descriptor size*/ CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ 0x11, /*bcdHID: HID Class Spec release number*/ 0x01, 0x00, /*bCountryCode: Hardware target country*/ 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ 0x22, /*bDescriptorType*/ USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ 0x00, /******************** Descriptor of Custom HID endpoints ***********/ /* 27 */ 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ HID_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */ 0x03, /* bmAttributes: Interrupt endpoint */ HID_IN_PACKET, /* wMaxPacketSize: 2 Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (32 ms) */ /* 34 */ 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ /* Endpoint descriptor type */ HID_OUT_EP, /* bEndpointAddress: */ /* Endpoint Address (OUT) */ 0x03, /* bmAttributes: Interrupt endpoint */ HID_OUT_PACKET, /* wMaxPacketSize: 2 Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (20 ms) */ /* 41 */ } ; (3)报告描述符 __ALIGN_BEGIN static uint8_t CustomHID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { 0x05, 0x8c, /* USAGE_PAGE (ST page) */ 0x09, 0x01, /* USAGE (Demo Kit) */ 0xa1, 0x01, /* COLLECTION (Application) */ /* 5 */ // The Input report 0x09,0x03, // USAGE ID - Vendor defined 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8bit) 0x95,0x40, // REPORT_COUNT (64Byte) 0x81,0x02, // INPUT (Data,Var,Abs) /* 18 */ // The Output report 0x09,0x04, // USAGE ID - Vendor defined 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8bit) 0x95,0x40, // REPORT_COUNT (64Byte) 0x91,0x02, // OUTPUT (Data,Var,Abs) /* 31 */ 0xc0 /* END_COLLECTION */ }; |
我的帖子:https://www.stmcu.org.cn/module/ ... p;page=1#pid2407368
PC发给stm32的数据是在回调函数USBD_CUSTOM_HID_DataOut()直接串口输出查看的,我定义的数据长度是64字节的,用Bus Hound直接发送64字节数据,stm32收到后正常串口输出。
但是使用USBD_CUSTOM_HID_SendReport()函数进行数据发送的时候,Bus Hound无法收到数据。
谢谢,我看过你这个例子。也是对照着你的例子研究过,用法都一样。PC端确实收不到。
我还把你的那个程序里面的描述符直接复制替换到我的程序里面,还是不行。
因为权限问题,不能上传那么大的文件。就附一个网盘链接。
链接:https://pan.baidu.com/s/1paJhWaIpN60CNvgKE-Sa-Q
提取码:h6sj
程序是根据st提供的例程,在stm32f407上面同时使用两个usb接口,两个usb接口都工作于FS模式。HS OTG接口用做Slave,FS接口用做Host。Slave已经在PC上枚举成功,Host也可正常的枚举鼠标键盘,并可打印鼠标做小信息。
感谢,我试试