5

汎用HIDインターフェイスを使用してPIC18F2550にUSBを実装しています。入力と出力の両方に単一の64バイトメッセージを持つようにHIDプロファイル構成を設定しました。

今では基本的に機能しています。デバイスはウィンドウにOKを登録します。PCのプログラムで見つけることができ、データを送受信できます。ただし、問題はこれです。PCからPICへのメッセージは、EP0エンドポイントバッファのサイズに切り捨てられます。

デバッグを続ける前に、ここでUSBプロトコルについての理解を明確にし、正しく理解できたことを確認したいと思います。

EP0入力バッファが8バイトであると想定します。PC側が8バイトの制御パケットを送信することは私の理解です。後に続くデータのバイト単位の長さがあります。次に、8バイトのデータパケットのシーケンスを送信し、PIC側はそれぞれを確認する必要があります。

PC側は、デバイス記述子の最大パケットサイズフィールドを調べることで各パケットの大きさを認識し、それに応じてメッセージを複数のデータパケットに分割することを理解しています。

コードをもっと探す前に、これが基本的に正しいことを誰かが確認できますか?EP0バッファサイズが8バイトの場合、前述の構成フィールドのためにPCはこれを認識し、複数のデータパケットを送信する必要がありますか?

PICで受信バッファを64バイトにすると、ニーズに十分な64バイトのメッセージが表示されますが、小さなバッファで機能しない理由がわからないので、いつかはとにかくおそらくそれらが必要です。

アドバイスや情報は大歓迎です。

4

1 に答える 1

4

エンドポイント記述子と呼ばれるものがあり、特に wMaxPacketSize を定義します。これは、ホスト コントローラー インターフェイス ドライバーが大きな USB 転送を小さなパケットに分割するために使用するものです。

これは EP0 バッファ サイズとはまったく異なりますが、常に wMaxPacketSize よりも大きくする必要があります。私の推測では (Microchip USB スタックを使用している場合は、usb_config.h と usb_descriptors.c を投稿してみてください)、8 バイト長の EP0 を 64 バイト長の wMaxPacketSize で使用しようとしているかのどちらかであり、転送を切り捨てています。

また、USB 1.1 Low Speed では 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
于 2011-05-06T07:43:49.600 に答える