0

我知道 USB HID 设备的最大速度为 64 kbps,但在示波器上,我每 1 毫秒得到一次事务,其中仅包含一个字节。下面列出了我的 HID 报告描述符。我必须改变什么才能达到 64Kbps?目前我的 bInterval = 0x01(1 毫秒轮询中断端点),但实际速度是 65 字节/秒,因为它会将 reportID 字节添加到我的 64 字节数据中。我认为,USB 不应该将单个 64+1 数据包分成 65 个单字节数据包。对于实验,我使用 reportID=1(从 STM32 到 PC)。在 PC 端,我使用 hidapi.dll 进行交互。

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
    USAGE_PAGE(USAGE_PAGE_UNDEFINED)
    USAGE(USAGE_UNDEFINED)
    COLLECTION(APPLICATION)         
        REPORT_ID(1)
            USAGE(1)
            LOGICAL_MIN(0)          
            LOGICAL_MAX(255)        
            REPORT_SIZE(8)          
            REPORT_COUNT(64)        
            INPUT(DATA | VARIABLE | ABSOLUTE)
        REPORT_ID(2)
            USAGE(2)
            LOGICAL_MIN(0)          
            LOGICAL_MAX(255)        
            REPORT_SIZE(8)          
            REPORT_COUNT(64)        
            OUTPUT(DATA | VARIABLE | ABSOLUTE)
        REPORT_ID(3)
            USAGE(3)
            LOGICAL_MIN(0)
            LOGICAL_MAX(255)
            REPORT_SIZE(8)
            REPORT_COUNT(64)
            OUTPUT(DATA | VARIABLE | ABSOLUTE)
        REPORT_ID(4)
            USAGE(4)
            LOGICAL_MIN(0)
            LOGICAL_MAX(255)
            REPORT_SIZE(8)
            REPORT_COUNT(64)
            OUTPUT(DATA | VARIABLE | ABSOLUTE)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION              */
};
4

1 回答 1

0

HID 使用中断 IN/OUT 来传送报告。在 USB 中,主机每 1 ms 轮询一次中断传输。每次轮询端点时,它可能会产生一个 64 字节的报告(对于低速/全速)。这可能就是您获得 64kB/s 数据的地方。实际上,限制是 1k 报告/秒。另请注意,这些限制对于高速和超高速设备是不同的。

报告描述符是一回事。您实际发送的中断输入是另一回事。它应该匹配,但这不是由任何东西强制执行的。您可能应该查看构建中断 IN 传输有效负载的代码。

旁注:您似乎感兴趣的只是发送任意数据块,然后 HID 可能不是相关的配置文件。使用批量端点看起来更合适(并且您不会受到中断端点轮询速率的限制)。

于 2020-07-12T10:11:18.973 回答