首页 > 解决方案 > 编写 USB 自定义 HID 报告描述符

问题描述

我需要使用 stm32 制作一个小型 USB 设备。我认为这很容易,但事实并非如此。

我从网上实现了一些示例,包括鼠标(使用两个电位计操纵杆)、键盘(不是只有 LED 的按键)和来自 github 的一些其他片段。但我完全误解了报告描述符是如何形成的。

我需要在 pc 和设备之间进行通信,其中 pc 向设备发送 1 位,设备发回 8 或 32 位数字(来自 ADC 的值)和一位变量。

现在我有这个代码:

/** Usb HID report descriptor. */
/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
        0x06, 0x00, 0xFF,      // Usage Page (Vendor Defined Page 1)
        0x09, 0x01,                    // USAGE  (Vendor Usage 1)
        0xa1, 0x01,                    // COLLECTION (Application)
        0x19, 0x01,             // Usage Minimum
        0x29, 0x40,             // Usage Maximum
        0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
        0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
        0x75, 0x01,                    //   REPORT_SIZE (1)
        0x95, 0x08,                    //   REPORT_COUNT (8)
        0x81, 0x02,                    //   INPUT (Data,Var,Abs)
        0x95, 0x01,                    //   REPORT_COUNT (1)
        0x75, 0x08,                    //   REPORT_SIZE (8)
        0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)
        0x95, 0x05,                    //   REPORT_COUNT (5)
        0x75, 0x01,                    //   REPORT_SIZE (1)
        0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)
        0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)
        0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
        0x95, 0x01,                    //   REPORT_COUNT (1)
        0x75, 0x03,                    //   REPORT_SIZE (3)
        0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION              */
};

此代码允许我闪烁板上的 LED。但是当我尝试更改 USAGE_MINIMUM、USAGE_MAXIMUM、REPORT_SIZE 或 REPORT_COUNT 中的任何数字时,电脑无法识别设备,它会写入 Code:10。当我尝试删除一个 OUTPUT 部分时也会发生同样的情况。

标签: usbstm32microcontrollerusb-hid

解决方案


推荐阅读