6 Replies Latest reply on Dec 19, 2018 5:10 PM by HirotakaT_91

    CY7C68001(SX2)がIdle状態が3ms以上続いてもD+がプルアップされない

    hiikc_3918076

      現在SX2を使用してセルフパワーのデバイス製品を作っているのですが,

      デバイスの電源を入れたままPCをシャットダウンして,その後PCを再起動

      するとデバイスが認識されません(デバイスマネージャにも表示されない).

       

      USBの信号(D+,D-)をオシロスコープで観測すると,Chirp終了後にPCが

      SOFを出さないことが分かりました.ここまではPCに問題があります.

       

      しかし,SX2もSOFが出ない状態が続く場合,すなわちIdleが3ms以上継続した場合,

      USBの仕様上High Speedの終端をOffしてD+をプルアップしなければならないはずが,

      ずっとSOFを待つ状態にいるようで,デバイスの電源を立ち上げ直すまで

      PCとの接続ができません.

      これに関してはおそらくSX2の実装に漏れ(バグ)があると思われます.

       

      ちなみにSX2にデスクリプタを再度書き込むとSX2がD+をプルアップして,

      PCと正常に接続されるようになります.

       

      SX2にデスクリプタを再度書き込む以外に,SX2の実装漏れの回避方法など

      あるでしょうか?

        • 1. Re: CY7C68001(SX2)がIdle状態が3ms以上続いてもD+がプルアップされない
          HirotakaT_91

          Cypress Developer Communityをご利用いただきありがとうございます。

           

          状況から見るに、SX2はSuspend stateに入るべきところで入れていないように思われます。

          さらに状況を明確にしていくために、以下の情報をいただくことは可能でしょうか。

           

          1. 問題発生時のUSBトレースの結果

          2. VBUSの観測データ(オシロスコープのキャプチャなど)

          3. PCは完全にシャットダウンをし、その後起動し直した、と理解しましたが合っていますでしょうか?またはシャットダウンではなく再起動を実行していますか?

           

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

          Hirotaka Takayama

          • 2. Re: CY7C68001(SX2)がIdle状態が3ms以上続いてもD+がプルアップされない
            hiikc_3918076

            ご返信頂きましてありがとうございました.

            以下ご回答いたします.

             

            1. 問題発生時のUSBトレースの結果

            USBトレースは下図になります.

            PCを立ち上げた状態からPCの電源を切り(シャットダウン),再度PCを立ち上げた時のUSBトレースです.

            PCからSOFが発行されていたのがシャットダウンでSOFが途切れ,再度PCが立ち上がってChirpが

            行われた後なにもトレースは記録されていません.

            USB認識しない.jpg

             

            2. VBUSの観測データ(オシロスコープのキャプチャなど)

            セルフパワーのデバイスなのでVBUSは使用しておらず,オシロで測定はおこなっていません.

            D+,D-を観測したものは下図となります.

            all.jpg

             

            ①の部分を拡大すると,デバイスChirpが始まっています.

            1.jpg

             

             

            ②の部分を拡大すると,HUB Chirp終了後Host(PC)がSOFを出さずIdle状態になります.

            根本的にはPCがSOFが出していないことが問題なのですが,

            Idle状態が続けばSX2はD+をプルアップしてFullスピード状態に戻り,

            Device detectを待つ状態になると思われますが,そうなっていません.

            2.jpg

             

            3. PCは完全にシャットダウンをし、その後起動し直した、と理解しましたが合っていますでしょうか?またはシャットダウンではなく再起動を実行していますか?

             

            はい,そうです.完全にシャットダウンしてから起動し直しています.

            ですが,今回の現象は電源を落とさずに再起動しても発生しています.

             

            お手数をおかけいたしますが,ご確認の程どうぞ宜しくお願いいたします.

            • 3. Re: CY7C68001(SX2)がIdle状態が3ms以上続いてもD+がプルアップされない
              HirotakaT_91

              詳細にご説明いただきありがとうございます。

              調査を行ったところ、FX2 familyで共通の問題のようです。

               

              適切な解決策をご提案するため、以下2点教えていただけますでしょうか?

              1. ホストOSのバージョン(Windows XP SP1など)はなんですか?

              2. お客様の作成されたボード上にSX2が実装されていますか?または弊社のDVKを使われていますか?(前者だと認識しています。)

               

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

              Hirotaka Takayama

              • 4. Re: CY7C68001(SX2)がIdle状態が3ms以上続いてもD+がプルアップされない
                hiikc_3918076

                ご返信頂きましてありがとうございます.

                以下ご回答いたします.

                 

                1.ホストのOSは,Windows10 Enterprise 2016 LTSB (x64)です.

                2.弊社製基板上にSX2を実装しております.

                 

                どうぞ宜しくお願いいたします.

                • 5. Re: CY7C68001(SX2)がIdle状態が3ms以上続いてもD+がプルアップされない
                  HirotakaT_91

                  ホストと基板のご連絡ありがとうございます。

                   

                  FX2でしたら以下のように解決可能です。

                  ワークアラウンド:ファームウェアでステートマシンを遷移させることで問題を解決します。

                  ステートマシンがend_resetステートであることをFX2は検出できますので、この状態からSuspendモードへと遷移させます。

                  以下のコードをHigh-Speed ISRに追加することで上記動作が可能です。

                   

                  if (EZUSB_HIGHSPEED())

                  {

                       #define HS_INACTIVE_COUNT 272

                       WORD CT4Count = HS_INACTIVE_COUNT;

                       // Look for CT4.3 (JK activity) inactive for 500us

                       // This loop was hand-counted to be 22/12 = 1.8us long,

                       // so 272 iterations are 500us

                       while(--CT4Count)

                       {

                            if (CT4 & 8)

                                 CT4Count = HS_INACTIVE_COUNT;

                       }

                       // If we timed out in state C (wait for SOF), bump the state machine to

                       //state D.

                       if (CT2 == 0xc)

                       {

                            CT1 = 2;

                            WRITEDELAY();

                            CT2 = 0xd;

                            WRITEDELAY();

                            CT1 = 0;

                       }

                       // Resume normal high-speed ISR

                       pConfigDscr = pHighSpeedConfigDscr;

                  }

                   

                  CT1, CT2, CT4の定義は以下の通りです。

                  CT1 - Chirp Test -- Override:

                  CT1.1 = override_fsm -> puts the chirp state machine in the hands of the 8051

                   

                  CT2 -- Chirp Test-- FSM:

                  CT2.[4:0] = chirp_state[4:0]: chirp state machine state

                  CT2.[7:5] = reserved

                   

                  CT4 -- Chirp Test-- Inputs:

                  CT4.3 = phs_pik_data_valid -> gives the state data_valid from the phase-picker

                   

                  SX2について、解決方法を内部で協議しております、申し訳ございませんが少々お待ちください。

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

                  Hirotaka Takayama

                  • 6. Re: CY7C68001(SX2)がIdle状態が3ms以上続いてもD+がプルアップされない
                    HirotakaT_91

                    返信遅くなり申し訳ございません。

                    SX2の場合、ハードウェアの変更による解決をする必要がありますが、弊社では今の所Bus-powerデバイスの場合での解決策しかありませんでした。

                    Bus-powerの場合は、VBUSの供給をRC回路で200ms程度遅延させてスタートアップを遅くすることですが、今回はSelf-powerなのでこれは機能しません。

                     

                    そのため、お客様のハードウェアでどのような解決策があるか、回路図を見て検討させていただきたいと思います。

                    回路図をご提供いただくことは可能でしょうか。

                    大変お手数おかけしますが、よろしくお願い致します。

                    Hirotaka Takayama