[英]Cannot figure out how to send data to hat switch from stm32f103c8 to PC via USB
我最近重新开始玩微控制器,最后有点卡住了。 所以我正在构建的是一个自定义游戏手柄。 我可以正确模拟按钮的数据,但是当我带上帽子开关时没有任何效果。 我假设我发送了错误的数据包,但无法找出正确的结构。 在测试代码中,我只是试图发送一些“按钮按下”并试图按下帽子开关的一个键,但看起来那台电脑无法识别我的数据包。 我确实浏览 了隐藏文档(尤其是第 64、65 页),但仍然不知道为什么这不起作用。
我的 HID 描述符:
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x05, // USAGE (Game Pad)
0xa1, 0x01, // COLLECTION (Application)
0xa1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x0e, // USAGE_MAXIMUM (Button 14)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x0e, // REPORT_COUNT (14)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x02, // REPORT_SIZE (2)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x39, // USAGE (Hat switch)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x03, // LOGICAL_MAXIMUM (3)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0x0e, 0x01, // PHYSICAL_MAXIMUM (270)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x04, // REPORT_SIZE (4)
0x81, 0x42, // INPUT (Data,Var,Abs,Null)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x04, // REPORT_SIZE (4)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
基本测试代码:
struct gamepad_report_t
{
uint16_t buttons;
uint8_t hs0 : 1;
uint8_t hs1 : 1;
uint8_t hs2 : 1;
uint8_t hs3 : 1;
};
struct gamepad_report_t gamepad_report;
gamepad_report.buttons = 0x0001;
gamepad_report.hs0 = 1;
gamepad_report.hs1 = 0;
gamepad_report.hs2 = 0;
gamepad_report.hs3 = 0;
int main()
{
while (1)
{
gamepad_report.buttons = 0x0010;
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, &gamepad_report, sizeof(struct gamepad_report_t));
HAL_Delay(500);
}
}
我在这里遇到的问题是我想发送到 PC 的结构变量。 如果我发送一个数组,一切都按预期工作......所以结论是 sizeof(struct) 没有返回正确的值,我应该通读数据结构对齐......通常是简单的问题,什么会让人们发疯。
我看到的第一件事是你试图像按钮一样使用帽子开关。 帽子开关对每个方向都有一个值。 例如 Up-Left 有它自己的值,它不是 Up 和 Left 被按下的组合。 您将必须阅读您的按钮,然后将它们编码为一个值。 第一次设置可能有点挑剔。
这是每个按钮的值,应该可以消除任何混淆。 (不适用于每个报告描述符!)
#define HATSWITCH_UP 0x00
#define HATSWITCH_UPRIGHT 0x01
#define HATSWITCH_RIGHT 0x02
#define HATSWITCH_DOWNRIGHT 0x03
#define HATSWITCH_DOWN 0x04
#define HATSWITCH_DOWNLEFT 0x05
#define HATSWITCH_LEFT 0x06
#define HATSWITCH_UPLEFT 0x07
#define HATSWITCH_NONE 0x0F
这是描述符的一部分,它将与这些值一起使用。 只需在报告描述符中为帽子开关定义一个 uint8_t 就可以了。
0x05, 0x01, //Usage Page : Generic Desktop
0x09, 0x39, //Usage : Hat Switch,
0x15, 0x00, //Logical Min : 0
0x25, 0x07, //Logical Max : 7
0x46, 0x3B, 0x01, //Physical Maximum : 315 degrees (Optional)
0x75, 0x08, //Report Size : 8
0x95, 0x01, //Report Count : 1
0x65, 0x14, //Unit : English Rotation/Angular Position 1 degree (Optional)
0x81, 0x42, //Input : Data, Var, Abs, Null State
我知道这是一个老话题,你很可能已经弄清楚了,但它会在未来帮助人们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.