4

を使用した USB プロジェクトで問題が発生していますLIB-USB。USB デバイスは PIC18F4550 に基づいており、単一の制御エンドポイントを備えています。PC フロントエンドは MSVC で書かれており、Lib-Usb 1.12 を使用しています。

PC 側では、プログラムはまず構成を設定し、インターフェイスを要求し、制御メッセージ (ベンダー固有) を送信 (および受信) します。すべて正常に完了します。ランダムなバイト数 (100 から 2000 の間) が転送された後、usb_control_msg 呼び出しからエラー rc=-5が返されて転送が停止します。

PC 側では、呼び出しは次のようになります。

ret = usb_set_configuration(udev, 1);  
ret = usb_claim_interface(udev, 0);    
ret = usb_control_msg(udev, USB_TYPE_VENDOR|USB_RECIP_DEVICE, CMD_RESET, 0, 0, buffer, 0, 100);  
ret = usb_control_msg(udev, 0xC0, GET_FIFO_DATA, 0, 0, buffer, 8, 100); 

実際に USB デバイスからデータを取得する最後の呼び出しは、何度も連続して実行されますが、この方法でランダムな数のバイト (合計で 100 から 2000) が転送された後、常に終了します。パイプを EP1 に変更すると、同じエラーが最終的に表示されます。

USB デバイス (PIC) 側では、記述子は非常に単純で、EP0 パイプのみを持ち、次のようになります。

Device
db 0x12, DEVICE ; bLength, bDescriptorType  
db 0x10, 0x01   ; bcdUSB (low byte), bcdUSB (high byte)  
db 0x00, 0x00   ; bDeviceClass, bDeviceSubClass  
db 0x00, MAX_PACKET_SIZE    ; bDeviceProtocol, bMaxPacketSize  
db 0xD8, 0x04   ; idVendor (low byte), idVendor (high byte)    
db 0x01, 0x00   ; idProduct (low byte), idProduct (high byte)  
db 0x00, 0x00   ; bcdDevice (low byte), bcdDevice (high byte)  
db 0x01, 0x02   ; iManufacturer, iProduct  
db 0x00, NUM_CONFIGURATIONS ; iSerialNumber (none), bNumConfigurations  
Configuration1  
db 0x09, CONFIGURATION  ; bLength, bDescriptorType  
db 0x12, 0x00   ; wTotalLength (low byte), wTotalLength (high byte)    
db NUM_INTERFACES, 0x01 ; bNumInterfaces, bConfigurationValue    
db 0x00, 0xA0   ; iConfiguration (none), bmAttributes    
db 0x32, 0x09   ; bMaxPower (100 mA), bLength (Interface1 descriptor starts here)  
db INTERFACE, 0x00      ; bDescriptorType, bInterfaceNumber  
db 0x00, 0x00   ; bAlternateSetting, bNumEndpoints (excluding EP0)  
db 0xFF, 0x00   ; bInterfaceClass (vendor specific class code), bInterfaceSubClass  
db 0xFF, 0x00   ; bInterfaceProtocol (vendor specific protocol used), iInterface (none)  

実際のフレームワークは、Bradley Minch のアセンブリ言語のものです。

誰かがこの種の問題に遭遇したことがある場合は、別のパイプ (EP1、同じ結果) を使用して解決するためにあらゆることを試みたので、PIC の UOWN ビットを確認する前に、それについて聞いてみたいと思います。パイプへの書き込み、PC ホストとのハンドシェーク (データが書き込まれる前に PC が最初にベンダー固有のコマンドを送信する必要がある) が、役に立たない。

4

3 に答える 3

2

それは今動作します!

もちろん、今では「ハンマーの袋のように賢い」と感じています。セクション18をよく読んでいれば、Vusbとアースの間に220nFのコンデンサを追加することについての行に気づいたでしょう。pin18とグラウンドの間に470nFのキャップを追加しました。これで、信頼性の高い転送が可能になりました。

のちょうど別のケース"I forgot to read the fine print"

于 2008-10-31T02:48:44.773 に答える
1

ハイエンドで少し高価なUSB バス アナライザLecroyEllisysを使用することをお勧めします。Total Phaseはローエンドの例です。
バス アナライザーを使用すると、余裕があれば、ファームウェアと PC 側のソフトウェアの両方を作成するのに大いに役立ちます。アナライザーを使用すると、PC 側の問題 (読み取ったデータはバス上にありますが、ソフトウェアでは表示されない) か、ファームウェアの実装の問題 (バス上でデータが表示されない) かを判断できます。 .

あなたの説明からは何が問題なのか理解するのが難しく、エラー -5 の意味がわかりません。これの定義名を投稿できれば、もっと役立つかもしれません。
一般に、最大パケット サイズの倍数でデバイスとの間でデータを転送することをお勧めします。また、関連するセクション 5.5.3 (コントロール転送の場合) およびUSB 仕様のバルク転送の場合は 5.8.3 を注意深く読むことをお勧めします。

提供された 2 番目のログに基づく追加のコメント:

USB スタックによって返される実際のエラーはログにあり、次のとおりです。
vendor_class_request(): request failed: status: 0xc0000001, urb-status: 0xc000000c

Windows ドライバー キットの usb.h で次のように定義されている URB (usb 要求ブロック) の状態:
usb.h:#define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL)

このエラーに関する適切な説明が見つかりましたhere

これは WinDriver で定義されたエラーであり、単に Windows から再定義されたエラーであり、それが通常何を意味するかについての説明は正しいという事実を無視してください。

これが発生する理由の例を次に示しますが、この動作には他にも考えられる理由があります

于 2008-10-28T15:30:06.360 に答える
0

私はアナライザーを持っていませんが (少なくとも「まだ」)、DebugView をインストールして、次の出力トレースでドライバーが何をしているかを確認しました。表示されている最初の転送 (ベンダー固有のもの) は成功し、2 番目の転送は停止しています。「I/O エラー」を意味する「-5」の戻りコード (特に有用ではありません) が呼び出しから返されます。

00002674 315.26220703 LIBUSB-DRIVER - vendor_class_request(): type: vendor
00002675 315.26223755 LIBUSB-DRIVER - vendor_class_request(): recipient: device
00002676 315.26223755 LIBUSB-DRIVER - vendor_class_request(): request: 0x04
00002677 315.26223755 LIBUSB-DRIVER - vendor_class_request(): value : 0x0000
00002678 315.26223755 LIBUSB-DRIVER - vendor_class_request(): index: 0x0000
00002679 315.26223755 LIBUSB-DRIVER - vendor_class_request(): size: 8 00002680 315.26226807 LIBUSB-DRIVER - vendor_class_request(): direction: in
00002681 315.26226807 LIBUSB-DRIVER - vendor_class_request() : タイムアウト: 100
00002682 315.26617432 LIBUSB-DRIVER - vendor_class_request(): 8 bytes transmitted 00002683 315.26721191
00002684 315.26721191
00002685 315.26721191 LIBUSB-DRIVER - vendor_class_request(): type: vendor
00002686 315.26721191 LIBUSB-DRIVER - vendor_class_request(): recipient: device
00002687 315.26724243 LIBUSB-DRIVER - vendor_class_request (): request: 0x04
00002688 315.26724243 LIBUSB-DRIVER - vendor_class_request(): value: 0x0000
00002689 315.26724243 LIBUSB-DRIVER - vendor_class_request(): index: 0x0000
00002690 315.26724243 LIBUSB-DRIVER - vendor_class_request(): size: 8 00002691 315.26724243 LIBUSB-DRIVER - vendor_class_request(): 方向: で
00002692 315.26727295 LIBUSB-DRIVER - vendor_class_request(): timeout: 100
00002693 315.27017212 LIBUSB-DRIVER - vendor_class_request(): request failed: status: 0xc0000001, urb-status: 0xc000000c
00002694 315.27407837 [3684] LIBUSB_DLL: error: usb_control_msg: sending control message failed 、勝利エラー: システムに接続されているデバイスが機能していません。
00002695 315.27407837 [3684]
00002696 315.27511597
00002697 315.27514648 LIBUSB-DRIVER - release_interface(): インターフェイス 0

于 2008-10-30T02:04:20.290 に答える