Embedded STM32 USB中间件:HID输出报告事务错误
我在配置STM32设备以接收HID中断输出事务时遇到问题,其中PC是主机设备 我使用标准的STM32 CubeMX提供的USB中间件,通过编辑允许两个端点,一个输出,一个输入。以及自定义的HID报告描述符:Embedded STM32 USB中间件:HID输出报告事务错误,embedded,usb,stm32,Embedded,Usb,Stm32,我在配置STM32设备以接收HID中断输出事务时遇到问题,其中PC是主机设备 我使用标准的STM32 CubeMX提供的USB中间件,通过编辑允许两个端点,一个输出,一个输入。以及自定义的HID报告描述符: __ALIGN_BEGIN static uint8_t HID_ReportDesc[HID_REPORT_DESC_SIZE] __ALIGN_END = { 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00
__ALIGN_BEGIN static uint8_t HID_ReportDesc[HID_REPORT_DESC_SIZE] __ALIGN_END =
{
0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00)
0x09, 0x01, // Usage (0x01)
0xA1, 0x01, // Collection (Application)
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x75, 0x08, // Report Size (8)
0x95, 0x40, // Report Count (64)
0x09, 0x02, // Usage (0x02)
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x95, 0x40, // Report Count (64)
0x09, 0x02, // Usage (0x02)
0x91, 0x00, // Output (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
0xC0, // End Collection
};
通过使用USBD HID提供的输入报告事务功能USBD\u HID\u SendReport
,我可以观察设备的行为
在PC端,使用USBLyzer软件,我可以确认设备已被Windows识别,并进行了相应的配置,报告描述符时没有错误。然后,我使用HIDAPI打开设备,并读取报告的值。此实现按预期工作,使我能够将数据从设备传输到主机
但是,没有提供HID输出报告功能,这让我自己来实现:
uint8_t USBD_HID_ReceiveReport (USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len){
USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef*)pdev->pClassData;
if(pdev->dev_state == USBD_STATE_CONFIGURED){
if(hhid->state == HID_IDLE){
hhid->state = HID_BUSY;
USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, report, len);
}
}
return USBD_OK;
}
此函数使用与提供的USBD\u HID\u SendReport
函数相同的结构,而不是使用USBD\u LL\u PrepareReceive
函数准备EPOUT地址以接收事务,然后通过PCD处理传输
在设备初始化之后,我在一个无休止的循环中使用实现的USBD\u HID\u ReceiveReport
函数,并被反复调用。我在HIDAPI中使用hid\u write
将数据传输到设备一次。调试时,设备迭代循环,并在每次调用时进入PCD端点传输hid_write
似乎不会像预期的那样在设备上更新我的缓冲区,并且USBlyzer在OUT报告中报告“事务错误”
有人知道我的实现中的错误吗