在配置STM32设备以使其能够接收HID中断OUT事务(以PC为主机设备)时,我一直遇到问题。
我使用标准的STM32 CubeMX提供的USB中间件,并进行了编辑,以允许2个端点,1个OUT和1个IN。连同自定义的HID报告描述符:
__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_HID_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_HID_SendReport
函数相同的结构,而不是使用USBD_LL_PrepareReceive
函数准备EPOUT地址以接收事务,然后通过PCD处理传输。
设备初始化后,我在无限循环中使用已实现的USBD_HID_ReceiveReport
函数,反复调用它。我在HIDAPI中使用hid_write
将数据传输到设备一次。在调试时,设备将遍历循环,并在每次调用时进入PCD端点传输。 hid_write
似乎并没有导致设备上的缓冲区更新,USBlyzer在OUT报告中报告了“交易错误”。
有人知道我的实现中的错误吗?