2010-04-29 14 views
5

Ich implementiere USB auf einem PIC 18F2550 mit einer generischen HID-Schnittstelle. Ich habe die HID-Profilkonfiguration so eingerichtet, dass sie eine einzige 64-Byte-Nachricht für Ein- und Ausgänge enthält.USB HID-Protokoll Frage

Jetzt funktioniert es im Grunde. Das Gerät registriert OK bei Windows. Ich kann es in meinem Programm auf dem PC finden und kann Daten senden und empfangen. Das Problem ist jedoch, dass Nachrichten vom PC zum PIC auf die Größe des EP0 Endpunktpuffers gekürzt werden.

Bevor ich zu viel Debugging gehe, möchte ich versuchen, mein Verständnis der USB-Protokolle hier zu klären und zu überprüfen, ob ich es richtig verstanden habe.

Angenommen, der EP0-Eingangspuffer ist 8 Bytes. Es ist mein Verständnis, dass das PC-Ende ein Steuerpaket senden wird, das 8 Bytes ist. Darin ist die Länge der zu folgenden Daten in Bytes. Und dann wird es eine Sequenz von 8 Byte Datenpaketen senden und das PIC-Ende muss jedes bestätigen.

Es ist mein Verständnis, dass der PC weiß, wie groß jedes Paket sein kann, indem er in das Feld maximale Paketgröße im Gerätedeskriptor schaut und die Nachricht entsprechend in mehrere Datenpakete aufteilt.

Bevor ich nach mehr Stunden auf den Code suche, kann jemand bestätigen, dass das im Grunde richtig ist? Wenn die EP0-Puffergröße 8 Bytes ist, sollte der PC dies aufgrund des oben erwähnten Konfigurationsfeldes wissen und mehrere Datenpakete senden?

Wenn ich meinen Empfangspuffer auf dem PIC 64 Bytes mache, dann bekomme ich 64 Bytes der Nachricht, die für meine Bedürfnisse ausreicht, aber ich mag nicht verstehen nicht, warum es nicht mit kleinen Puffern funktioniert, und eins Den Tag werde ich wahrscheinlich sowieso brauchen.

Jede Beratung oder Information wäre willkommen.

Antwort

4

Es gibt etwas, das als Endpoint Descriptor bezeichnet wird und unter anderem die wMaxPacketSize definiert. Dies ist die Aufgabe der Host Controller Interface-Treiber, eine große USB-Übertragung in kleinere Pakete zu unterteilen.

Dies ist völlig anders als die EP0-Puffergröße - die jedoch immer größer als die wMaxPacketSize sein muss. Meine Vermutung ist (versuchen Sie Ihre usb_config.h und usb_descriptors.c, wenn Sie Microchip USB-Stack verwenden), dass Sie entweder versuchen, 8-Byte lange EP0 mit 64-Byte langen wMaxPacketSize zu verwenden, die die Übertragung abschneidet.

Beachten Sie außerdem, dass in USB 1.1 Low Speed, die wMaxPacketSize nicht 8 überschreiten kann, und in USB 1.1 Full Speed ​​kann es nicht mehr als 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