2010-04-29 4 views
5

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

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

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

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

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

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

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

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

ответ

4

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

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

Кроме того, следует помнить, что в USB 1.1 низкой скорости 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