2010-04-29 11 views
5

Implementazione USB su un PIC 18F2550 utilizzando un'interfaccia HID generica . Ho configurato la configurazione del profilo HID per avere un singolo messaggio a 64 byte per ingressi e uscite.Domanda protocollo HID USB

Ora è fondamentalmente di lavoro. Il dispositivo registra OK con Windows. Posso trovarlo nel mio programma sul PC e posso inviare e ricevere dati ad esso. Il problema è tuttavia: i messaggi dal PC al PIC vengono troncati alla dimensione del buffer degli endpoint EP0.

Prima di eseguire il debug troppo oltre, voglio provare a chiarire la mia comprensione dei protocolli USB qui e controllare che ho capito bene.

supponga che il buffer di ingresso EP0 è di 8 byte. Mi risulta che il PC alla fine invierà un pacchetto di controllo che è 8 byte. In c'è la lunghezza in byte dei dati da seguire. E poi invierà una sequenza di pacchetti di dati da 8 byte e la fine del PIC dovrà riconoscerli ciascuno.

È a mia conoscenza che la fine del PC sappia quanto grande possa essere ciascun pacchetto guardando nel campo della dimensione massima del pacchetto nel descrittore del dispositivo e dividerà il messaggio di conseguenza in più pacchetti di dati.

Prima di andare a cercare più ore al codice, qualcuno può confermare che questo è sostanzialmente corretto? Che se la dimensione del buffer EP0 è di 8 byte, il PC dovrebbe saperlo a causa del campo di configurazione che ho menzionato sopra e inviare più pacchetti di dati?

Se faccio il mio buffer di ricezione sui byte PIC 64, ottengo 64 byte del messaggio che è sufficiente per le mie esigenze, ma non mi piace non capire perché non funziona con buffer piccoli e uno giorno probabilmente avrò bisogno di loro comunque.

consigli o informazioni sarebbe il benvenuto.

risposta

4

C'è qualcosa chiamato Endpoint Descriptor, che, tra le altre cose, definisce wMaxPacketSize - che è quello che i driver dell'interfaccia Host Controller usano per suddividere un trasferimento USB di grandi dimensioni in pacchetti più piccoli.

Questo è completamente diverso dalla dimensione del buffer EP0, che tuttavia deve sempre essere maggiore di wMaxPacketSize. La mia ipotesi è (provate pubblicare la tua usb_config.h e usb_descriptors.c, se si utilizzano stack USB Microchip), che sei o cercando di utilizzare 8 byte lungo EP0 con wMaxPacketSize lungo di 64 byte, che è troncando il trasferimento.

Inoltre, essere consapevoli che in USB 1.1 a bassa velocità, il wMaxPacketSize non può superare gli 8 e USB 1.1 Full Speed ​​non può superare i 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