5 Replies Latest reply on Feb 26, 2019 8:54 PM by HirotakaT_91

    FX3 with C++ Streamer

    NoAr_1540581

      FX3の「同期スレーブFIFO」のサンプルデザインを使用して、FX3とホストPC間でUSB3.0の通信試験をしているのですが

      ホストPC側でC++
      StreamerからBULK OUTを行うとXfer
      request rejected. NTSTATUS = c0000001のエラーメッセージが表示されて通信が停止する事象が発生しています。エラーコードより原因の特定はできますでしょうか?

       

      【詳細】

      BULK OUTのエラー発生時のGPIFIIのパケット読み出し波形を取得したところ、添付画像のような波形となっていました。1回目のパケット読み出しは問題なく成功しているのですが、2回目のパケット読み出しが異常な波形となっています。規定のパケット長(1024Byte)を読み出し終わる前にFLAG_Cがアサートされている上に、それよりも前にアサートされるべきFLAG_Dがアサートされません。

       

      この結果を見ると、FLAG_Cがアサートされている理由は、C++ StreamerのBULK OUTの最後でショートパケットを受信しているためではないかと推測されますが、

      その推測で正しいでしょうか? C++ StreamerのBULK OUTの仕様を教えて下さい。

       

      また、上記が正しいとしても、FLAG_Cがアサートされているのに、それよりも前にアサートされるべきFLAG_Dがアサートされない理由が分かりません。

      FLAGの動作としてこのような動作となるのは正しいのでしょうか? FLAGの動作について教えて下さい。

       

      - 評価で使用しているサンプルF/W : AN65974の「SlaveFifoSync」のファームウェア

      但し、下記について一部FWを修正して評価しております。

      ― LOOPBACK_SHRT_ZLPのDefineを無効、STREAM_IN_OUT のDefineを有効

       

       

      マクニカ 荒井

       

       

       

       

       

        • 1. Re: FX3 with C++ Streamer
          HirotakaT_91

          ・NT STATUSについて

          Microsoftの"2.3.1 NTSTATUS Values"のページに従い、

          [MS-ERREF]: NTSTATUS Values

          "NTSTATUS 0xC0000001""STATUS_UNSUCCESSFUL"を指し、

          "{Operation Failed} The requested operation was unsuccessful.(要求した操作が失敗しました。)"

          という意味になります。

          そのため、BULK_OUT転送時にこのエラーメッセージが出たのはXfer Requestが失敗したためです。

          (これだけでは原因特定になりません。)

           

           

          ・Streamerアプリケーションについて

          以下のドキュメントにて簡易的ですが情報が提供されています。

          AN86947 https://www.cypress.com/file/202286/download

          あとは、C++でもC#でもStreamerアプリケーションのソースコードがございますのでこちらもご参照ください。

           

          ショートパケットが受信されたというのは推測であり実際に確認されたわけではないですよね?

          ショートパケットは受信されない筈です。

           

           

          ・FLAGの動作

          FLAG C, Dの動作としては、ご理解いただいている通り、FLAG_Cがアサートされるより前にFLAG_Dがアサートされるのが普通です。

          何か問題が起きていますが、現状ですとまだわかりません。

           

          以下、問題解決のために教えてください。

          Q1. 使用しているFPGAボードはなんですか?Spartan 6 SP601評価キットですか?

          Q2. Verilogファイルは編集していますか?またはSpartan 6 SP601用に用意している"slavefifo2b_fpga_top.bit"を使用していますか?

          Q3. Bulkloopアプリケーションを使い、loopbackは試していますか?

           試していない場合、試してみていただけますか?

           試している場合、問題はありませんでしたか?

           

          よろしくお願い致します。

          Hirotaka Takayama

          • 2. Re: FX3 with C++ Streamer
            NoAr_1540581

            Q1. 使用しているFPGAボードはなんですか?Spartan 6 SP601評価キットですか?

            Q2. Verilogファイルは編集していますか?またはSpartan 6 SP601用に用意している"slavefifo2b_fpga_top.bit"を使用していますか?

            [Ans.]

            FPGAボードはXilinx
            Zynq7000評価キット(ZC702)です。AN65974のFPGA論理を参考にして独自に作成したFPGA論理を使用しています。

             

            Q3. Bulkloopアプリケーションを使い、loopbackは試していますか?

             試していない場合、試してみていただけますか?

             試している場合、問題はありませんでしたか?

            [Ans.]

            Control Centerアプリを使用したLoopbackでは再現しません。

            StreamerアプリでのみBULK
            OUTのエラーが発生します。

             

            上記状況のみでの解決が困難であり、アナライザーでのログ取得が必須な場合、お客様にてアナライザーを所持していない事もあり

            別途相談させて頂ければと考えております。

             

             

            宜しくお願い致します

             

            以上

            • 3. Re: FX3 with C++ Streamer
              HirotakaT_91

              こちら側ではお客様の状況が確認できないため、どこに問題があるかを明らかにし、問題を調べていきたく思います。 

              まず、大きく分けて、ホストアプリケーション、FX3、FPGA (Zynq7000評価キット ZC702)のうち一つ以上に問題が存在すると考えられます。

              ・ホストアプリケーションは、サイプレス社の用意したStreamerやControl Centerを利用し、現在Streamerアプリケーションでのみ投稿いただいた問題が発生しています。

              ・FX3では、AN65974の「SlaveFifoSync」のファームウェアを使用しています。(STREAM_IN_OUTに対応)

              ・FPGAは、ZC702を使用しているとのことですが、verilogはStreamerに対応した論理となっていますか?ピンマッピングは正しく行えていますか?PCLK (GPIF IIに供給するクロック)には100MHz、またはそれ以下の周波数のクロックを供給していますか?

               

               

              今の所FPGA側の設定に原因があるのではないか、と感じているのですが、可能であればFPGAの設定情報をご提供いただけますでしょうか。

              USB Protocolアナライザー等での調査は、各種設定が正しいことを確認できた後に行うことになるかと思います。

               

               

              FYI: Control Centerアプリでもloopbackは確認できますが、より多くのデータを送った場合の動作を確認するにはBulkloopアプリケーションがご利用いただけます。(Bulkloopアプリケーションを使う場合にはそれに応じた論理をFPGAで使う必要があります。既にサイプレスで用意されているものを使用することも可能です。)

              C#版   C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\application\c_sharp\bulkloop\bin\Release\BulkLoop.exe

              C++版 C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\application\cpp\bulkloop\x86\Release\bulkloop.exe

               

              よろしくお願い致します。

              Hirotaka Takayama

              • 4. Re: FX3 with C++ Streamer
                NoAr_1540581

                >今の所FPGA側の設定に原因があるのではないか、と感じているのですが、可能であればFPGAの設定情報をご提供いただけますでしょう>か。

                上記設定情報に関しして、項目を具体的にして頂く事で回答可能となっております。

                ・参考までに、GPIFIIインターフェースのクロック設定は100MHzで、ピンアサインは正しく設定しています。

                又、ピンアサインが正しく設定されていなければControl CenterでのBULK OUT転送は出来ないという認識ですが正しいでしょうか?

                 

                根拠はありませんが、FLAG_C、FLAG_Dの振る舞いを見ると、GPIFIIのステートマシンが異常なステートに陥っているように思えます。

                GPIFIIのステートマシンの状態をリアルタイムに見る方法はありますでしょうか?

                可能なら調査してみたいのですが。よろしくお願い致します。

                 

                マクニカ 荒井

                • 5. Re: FX3 with C++ Streamer
                  HirotakaT_91

                  GPIF IIのステートを見る方法としては、CyU3PGpifSMState(&curState) が役立ちます。

                  以下にGPIF IIステートを確認するためのプログラム例を示します。

                  uint8_t curState_p;

                  CyU3PGpifGetSMState(&curState_p);

                  CyU3PDebugPrint (4, "Current status = %d\r\n", curState_p);

                   

                  AN65974は日本語も英語もございますので、精読し、仕様に従ってFPGAを動作させていただければと思います。

                  よろしくお願い致します。

                  Hirotaka Takayama