STM32 USB Custom HID только 1 байт на транзакцию - PullRequest
0 голосов
/ 12 июля 2020

Я знаю, что максимальная скорость USB HID-устройства составляет 64 кбит / с, но на осциллографе я получаю транзакции каждые 1 мс, которые содержат только ОДИН байт. Дескриптор моего отчета HID, указанный ниже. Что мне нужно изменить, чтобы достичь 64 Кбит / с? В настоящее время мой bInterval = 0x01 (1 мс опрос для конечной точки прерывания), но фактическая скорость составляет 65 байт / с, потому что он добавляет байт reportID к моим 64-байтовым данным. Я думаю, USB не должен делить один пакет 64 + 1 на 65 однобайтовых пакетов. Для эксперимента я использую reportID = 1 (от STM32 до P C). Со стороны P C я использую 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              */
};

1 Ответ

0 голосов
/ 12 июля 2020

HID использует прерывание IN / OUT для передачи отчетов. В USB передача прерываний опрашивается хостом каждые 1 мс. Каждый раз, когда конечная точка опрашивается, она может выдавать 64-байтовый отчет (для низкой / полной скорости). Вероятно, отсюда вы берете цифру 64 КБ / с. Фактически лимит составляет 1к отчетов в секунду. Также обратите внимание, что эти ограничения различаются для высокоскоростных и сверхскоростных устройств.

Дескриптор отчета - это одно. То, что вы на самом деле отправляете как прерывание, - это совсем другое. Он должен совпадать, но это ни к чему не приводит. Вероятно, вам следует изучить код, который создает полезную нагрузку передачи прерывания IN.

Примечание: все, что вам кажется интересным, это отправлять произвольные фрагменты данных, тогда HID, вероятно, не является релевантным профилем. Использование массовых конечных точек выглядит более подходящим (и вы не будете ограничены частотой опроса конечных точек прерываний).

...