STM32 USB Custom HID только 1 байт на транзакцию

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

person Тимур Хасаншин    schedule 12.07.2020    source источник
comment
Мои осциллографы: imgur.com/wBiskUy imgur.com/U3MOS4F   -  person Тимур Хасаншин    schedule 12.07.2020


Ответы (1)


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

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

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

person Nipo    schedule 12.07.2020
comment
Спасибо, а можно ли в один отчет поставить 64 байта? - person Тимур Хасаншин; 12.07.2020
comment
Не только вы можете, но и с дескриптором, который вы цитировали выше, вы должны. IIRC, идентификатор отчета составляет 1 байт из 64. Не меняя дескриптор, попробуйте отправить 4, 8, 16, 32, 63, 64 байта. - person Nipo; 12.07.2020
comment
Спасибо, ошибка заключалась в том, что CubeMX сгенерировал код с размером конечной точки = 2 и wMaxPacketSize = 64, поэтому я не смотрел размер конечной точки. Я отредактировал это значение и получил 64 кбит / с. - person Тимур Хасаншин; 12.07.2020