2010-04-29 35 views
5

Estoy implementando USB en un PIC 18F2550 utilizando una interfaz HID genérica . Configuré la configuración del perfil HID para tener un solo mensaje de 64 bytes para las entradas y salidas.Protocolo HID USB pregunta

Ahora básicamente funciona. El dispositivo registra OK con Windows. Puedo encontrarlo en mi programa en la PC y puedo enviar y recibir datos. Sin embargo, el problema es este: los mensajes de la PC al PIC se truncan al tamaño del búfer de punto final EP0.

Antes de ir a depurar mucho más, quiero tratar de aclarar mi comprensión de los protocolos USB aquí y comprobar que lo hice bien.

Supongamos que el búfer de entrada EP0 es de 8 bytes. Entiendo que el extremo de la PC enviará un paquete de control de 8 bytes. Ahí está la longitud en bytes de los datos a seguir. Y luego enviará una secuencia de paquetes de datos de 8 bytes y el final del PIC tiene que reconocer cada uno.

Tengo entendido que el extremo de la PC sabe cuán grande puede ser cada paquete buscando en el campo de tamaño máximo de paquete en el descriptor del dispositivo y dividirá el mensaje según corresponda en múltiples paquetes de datos.

Antes de ir a buscar más horas al código, ¿alguien puede confirmar que esto es básicamente correcto? ¿Que si el tamaño del búfer EP0 es de 8 bytes, entonces la PC debería saber esto debido al campo de configuración que mencioné anteriormente y enviar múltiples paquetes de datos?

Si configuro mi búfer de recepción en el PIC 64 bytes, obtengo 64 bytes del mensaje que es suficiente para mis necesidades, pero no me gusta no entender por qué no funciona con buffers pequeños, y uno día probablemente los necesite de todos modos.

Cualquier consejo o información sería bienvenida.

Respuesta

4

Hay algo llamado Endpoint Descriptor, que, entre otras cosas, define el wMaxPacketSize, que es lo que usan los controladores de la interfaz del controlador para subdividir una transferencia de USB grande en paquetes más pequeños.

Esto es completamente diferente del tamaño de búfer EP0, que sin embargo, siempre se requiere que sea mayor que wMaxPacketSize. Mi suposición es (intente publicar su usb_config.h y usb_descriptors.c, si usa la pila USB de Microchip), que está tratando de usar 8-byte long EP0 con 64 bytes de longitud wMaxPacketSize, que está truncando la transferencia.

Además, tenga en cuenta que en USB 1.1 de baja velocidad, la wMaxPacketSize no puede exceder de 8, y en USB 1.1 Full Speed ​​no puede exceder de 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 
Cuestiones relacionadas