« promgenでbitファイルをMCSに変換する方法 | トップページ | 状態変数型の発振器と18bit ADC »

2014.01.31

USB FX3がBulkInでハングアップする

ほとんどのPCでは大丈夫だけれども、特定のPCでは、EZ-USB FX3がBulkInでハングアップするという現象が起きてしまいます。

EZ-USB FX3からデータを入力するには、CyAPI.libを使って、

USBDevice->BulkInEndPt->XferData(data, len);

とやります。

このXferData()を実行して、ターゲットがデータを送ってこなければ指定したタイムアウトまで待待つはずです。しかし、一部のPCではターゲットがすぐにデータを返さないとFailしてしまうようなのです。

実際にFPGAからFX3に向かってデータを送信するまでの時間をマイクロ秒単位で変えていってみたところ、125μ秒を超えるとハングアップする可能性が出てくることがわかりました。

Read_wave_3

波形は上の波形で毎回同じでも、返すタイミングが伸びていくとダメなようです。

おそらく、XferData()を実行すると、INパケットが発行されるのでしょう。ここでFPGAがすぐにデータを返せばよいのですが、125μ秒を超えてしまってNAKが返った(EZ-USB FX3が「まだデータが用意できていない」ことを示した)場合は、一部のPCでは関数がFailしてしまうのだと思います。

デバイスドライバを最新のcyusb3.sys(‎2013‎年‎6‎月‎10‎日、‏‎16:13:38 V1.2.3.3)に置き換えてみても、結果は同じでした。

本来は、EZ-USB FX3がNAKを返しても、繰り返しリトライするべきだと思うのですが・・

で、CyAPIのライブラリの中を見てみると、このXferData()という関数は、中でBeginDataXfer()、WaitForXfer()、FinishDataXfer()を呼び出しているだけなので、自分でこれらの関数を呼び出してみたのですが、結果は同じでした。

BeginDataXfer()でINパケットを発行するらしいのですが、つまり、BeginDataXfer()の時点でFX3がデータを送信する準備できていないければダメなのです。だから、データが用意できるまで待たせることができません。

これはEZ-USB FX3にFPGAをつなぐ場合だけではなく、どうやらFX3のファームウェアでパケットを作って返す場合でも同じことが起こるようです。

なお、BeginDataXfer()では、DeviceIoControlでIOCTL_ADAPT_SEND_NON_EP0_DIRECTというリクエストを発行しているようです。

    DeviceIoControl (hDevice,
        IOCTL_ADAPT_SEND_NON_EP0_DIRECT,
        pXmitBuf,
        iXmitBufSize,
        buf,
        bufLen,
        &dwReturnBytes,
        ov);

だから、これ以上の解析はドライバの中まで入ってみてみないといけないようです。

今のところ回避方法はみつかっていません。

  • 問題が起きるPCではUSB2.0で接続する
  • BulkIN転送では125μ秒以上、待たせないようにする

くらいの解決策しか見当たりません。

|

« promgenでbitファイルをMCSに変換する方法 | トップページ | 状態変数型の発振器と18bit ADC »

コメント

書籍共々、いつも大変勉強させて頂いています。

近日上がったこちらの症状ではないですか?
http://www.cypress.com/?id=4&rID=91272
(最新英語版Slavefifo資料にもこの症状の簡単な対処法が追記されています。)
但し、一部のサンプルでしか正式対応が進んでいない様でSlavefifoはまだ、リリースされていないみたいです。

(私もエンドポイント情報ばかり気を取られていて、気づくのに大変時間を取られました。)
ご参考になれば

投稿: 波多野 | 2014.02.04 23:30

波多野さん
貴重な情報ありがとうございます。

ID=91272のAnswerはパワーマネジメントに関するもののようです。それらしき資料が見つけられませんでした。

Trouble Shooting Guideにある
「FX3 stops sending data on all USB IN endpoints abruptly」か「Transfer freeze on a burst enabled IN endpoint」の現象でしょうか?

投稿: なひたふ | 2014.02.05 01:49

コメントを書く



(ウェブ上には掲載しません)




« promgenでbitファイルをMCSに変換する方法 | トップページ | 状態変数型の発振器と18bit ADC »