Не могу понять, как отправить данные на шляпный коммутатор с stm32f103c8 на P C через USB - PullRequest
0 голосов
/ 09 февраля 2020

Я недавно перезапустился, чтобы поиграться с микроконтроллерами и, наконец, застрял. Так что я создаю собственную игровую панель. Я могу правильно смоделировать данные для кнопок, но ничего не получается, когда я ввожу шляпный переключатель. Я предполагаю, что отправляю неправильный пакет данных, но не могу определить правильную структуру. В тестовом коде я просто пытаюсь отправить какое-то «нажатие кнопки», а также пытаюсь нажать клавишу от переключателя, но похоже, что p c не может распознать мой пакет данных. Я сделал go через скрытую документацию (особенно стр. 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

Basi c тестовый код:

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);
    }
}

Структура пакета данных, которую я представил

Что я вижу в свойствах устройства, когда вы C подключен

1 Ответ

0 голосов
/ 10 февраля 2020

Проблема, с которой я боролся, была структурная переменная, которую я хотел отправить в P C. Если я отправляю массив, все работает как положено ... поэтому вывод таков, что sizeof (struct) не возвращает правильное значение, я должен прочитать выравнивание структуры данных ... обычно простая проблема, что может сводить людей с ума.

...