Вопрос по протоколу USB HID - PullRequest
       16

Вопрос по протоколу USB HID

5 голосов
/ 29 апреля 2010

Я использую USB на PIC 18F2550, используя общий интерфейс HID . Я настроил конфигурацию HID-профиля так, чтобы иметь одно 64-байтовое сообщение для входов и выходов.

Теперь это в основном работает. Устройство регистрируется нормально с окнами. Я могу найти его в своей программе на ПК и могу отправлять и получать данные на него. Однако проблема заключается в том, что сообщения от ПК на PIC усекаются до размера буфера конечной точки EP0.

Прежде чем продолжить отладку, я хочу попытаться уточнить мое понимание протоколов USB и проверить, правильно ли я понял.

Предположим, что входной буфер EP0 составляет 8 байтов. Насколько я понимаю, конец ПК отправит контрольный пакет размером 8 байт. Здесь есть длина в байтах данных для подражания. Затем он отправит последовательность из 8-байтовых пакетов данных, и конец PIC должен подтвердить каждый из них.

Насколько я понимаю, сторона ПК знает, насколько большим может быть каждый пакет, просматривая поле максимального размера пакета в дескрипторе устройства, и поделит сообщение соответствующим образом на несколько пакетов данных.

Прежде чем я продолжу искать код в течение нескольких часов, кто-нибудь может подтвердить, что это в основном правильно? Что если размер буфера EP0 составляет 8 байтов, то ПК должен знать это из-за поля конфигурации, о котором я упоминал выше, и отправлять несколько пакетов данных?

Если я создаю свой приемный буфер на 64 байтах PIC, тогда я получаю 64 байта сообщения, что достаточно для моих нужд, но мне не нравится не понимать, почему оно не работает с небольшими буферами, и однажды Наверное, они мне все равно понадобятся.

Любой совет или информация будут приветствоваться.

1 Ответ

4 голосов
/ 06 мая 2011

Существует нечто, называемое дескриптором конечной точки, которое, помимо прочего, определяет wMaxPacketSize - именно это драйверы интерфейса хост-контроллера используют для разделения большой передачи USB на более мелкие пакеты.

Это полностью отличается от размера буфера EP0, который, однако, всегда должен быть больше, чем wMaxPacketSize. Я предполагаю (попробуйте опубликовать ваши usb_config.h и usb_descriptors.c, если вы используете USB-стек Microchip), что вы либо пытаетесь использовать 8-байтовый EP0 с 64-байтовым wMaxPacketSize, который усекает передачу.

Также имейте в виду, что в USB 1.1 Low Speed ​​wMaxPacketSize не может превышать 8, а в USB 1.1 Full Speed ​​не может превышать 64.

0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
HID_EP | _EP_IN,            //EndpointAddress
_INTERRUPT,                       //Attributes
DESC_CONFIG_WORD(9),        //size
0x01,                        //Interval

/* Endpoint Descriptor */
0x07,/*sizeof(USB_EP_DSC)*/
USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
HID_EP | _EP_OUT,            //EndpointAddress
_INTERRUPT,                       //Attributes
DESC_CONFIG_WORD(9),        //size
0x01                        //Interval
...