Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

FX3/FX2LP XferData() APIの使い方 - KBA226200 - Community Translated (JA)

FX3/FX2LP XferData() APIの使い方 - KBA226200 - Community Translated (JA)

GeethaP_31
Employee
Employee
50 questions asked 10 questions asked 5 questions asked

Community Translated by  NoTa_4591161 Expert         Version: **

Translation - English: FX3/FX2LP XferData() API Usage - KBA226200

質問:

XferData()API関数の「パケットモード」パラメーターの意味は何ですか?

回答:

KBAは、デバイスがエンドポイントディスクリプタのMaxPcktSizeパラメーターの倍数でデータパケットを送信する条件について説明します。

XferData() API関数がCyUSBライブラリで定義されています。このライブラリのソースファイルはhttp://www.cypress.com/documentation/software-and-drivers/ez-usb-fx3-software-development-kitにあります

このAPI関数は、CyUSB3ドライバーにバインドされているホストとデバイス間の同期データ転送に使用されます。このAPI関数を使用するには、CyUSB.NETガイド/ Cypress USB Control Centerソースコードを参照してください。サイプレスUSBコントロールセンターは、「Transfer Data」ボタンが押されたときにこのAPIを呼び出します。

XferData()は、次のいずれかが発生すると戻ります。

  1. 要求された数のデータバイトが転送されていた。
  2. 短いパケットまたは長さがゼロのパケットが転送されたとき。
  3. タイムアウト(関数の呼び出し中に設定)が発生したとき。

XferData()の定義は次のようにします:

public bool XferData(ref byte[] buf, ref int len, bool PacketMode);

IN転送中に、ホストから要求されたデータのバイトがディスクリプタ内のエンドポイントのMaxPcktSizeパラメーターの倍数でない場合、XferData()関数は失敗し、トランザクションが失敗したことを示すエラーコード997が表示されます。これらの条件下で、「PacketMode」パラメーターの重要性は次のように説明されます。USBBulkSourceSinkファームウェアでプログラムされたFX3デバイスを考えます。このファームウェアは、1024バイトとしてMaxPcktSize INエンドポイントを設定します。サイプレスUSBコントロールセンターは、デバイスからデータを読み取るために使用されます。サイプレスUSBコントロールセンターの[ PktMode]チェックボックスが選択されている場合、XferData関数のPacketModeパラメータはtrueに設定されます。ケースA

  1. PktMode」チェックボックスはオフです。
  2. Bytes to transfer」ボックスは16387バイトで埋められます(MaxPcktSizeの倍数ではありません)

[Transfer Data]ボタンを押すと、XferData()関数はタイムアウトになるまで待機し続け、トランザクションが失敗したことを示すエラーコード997を返します。

pastedImage_0.png

ケースB

  1. 「PktMode」チェックボックスがオンになっている
  2. Bytes to transfer」ボックスは16387バイトで埋められます(MaxPcktSizeの倍数ではありません)

[Transfer Data]ボタンをクリックすると、データ転送要求が複数のXferData()関数呼び出しに分割され、それぞれがエンドポイントのMaxPcktSizeパラメーターと等しいデータ長を持ちます。この場合、要求されたデータ長の前の倍数(この場合は16384バイト、0x4000)までのデータがホストアプリケーションで受信されます。

pastedImage_1.png 

これらの両方の状況で、エンドポイントは停止し、ResetPipe)()関数を使用してクリアする必要があり、アプリケーションからの保留中のI/Oトランザクションは、新しい転送を実行する前にAbortPipe()関数を使用してクリアする必要があります。

   pastedImage_2.png

0 件の賞賛
346 件の閲覧回数
寄稿者