我需要使用 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 部分时也会发生同样的情况。