2010-04-29 56 views
5

我實現USB上的PIC 18F2550使用通用HID界面。我建立了HID配置文件配置,爲輸入和輸出提供單個64字節的消息。USB HID協議問題

現在它基本上工作。該設備用Windows註冊OK。我可以在PC上的程序中找到它,並可以發送和接收數據。但問題在於 - 從PC到PIC的消息被截斷爲EP0端點緩衝區的大小。

我去調試太多進一步我想嘗試在這裏澄清我的USB協議的理解和檢查我得到了它的權利之前。

假設EP0輸入緩衝區是8個字節。我的理解是,PC端會發送一個8字節的控制包。其中有數據的字節長度。然後它會發送一個8字節的數據包序列,PIC端必須確認每個數據包。

這是我的理解是,PC知道到底有多大的每個報文可以在設備描述符中尋找最大數據包大小字段,將相應瓜分消息分成多個數據包。

在我尋找更多的代碼時,在任何人都可以確認這是基本正確的嗎?如果EP0緩衝區大小爲8個字節,那麼PC應該知道這一點,因爲上面提到的配置字段併發送多個數據包?

我若接收緩衝區的PIC 64字節然後我得到64個字節,這足以滿足我的需求的消息,但我不喜歡不理解爲什麼它不與小緩衝區工作,一個無論如何,我可能需要他們。

任何建議或信息將受到歡迎。

回答

4

有一種叫做端點描述,其中,除其他事項外,定義了wMaxPacketSize - 這就是主機控制器接口驅動程序使用細分大型USB傳輸到較小的數據包。

這是從EP0緩衝區大小完全不同的 - 這然而,總是需要爲比wMaxPacketSize大。我的猜測是(嘗試發佈您的usb_config.h和usb_descriptors.c,如果您使用Microchip USB堆棧),您要麼使用8字節長的EP0和64字節長的wMaxPacketSize,這會截斷傳輸。

此外,要知道,在USB 1.1低速時,wMaxPacketSize不能超過8個,而在USB 1.1全速不能超過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