1 Reply Latest reply on Dec 4, 2019 11:02 PM by KandlaguntaR_36 Branched from an earlier discussion.

    USB3.0 communication is not stable

    NCH_4488531

      Thanks for your help!

      We fixed the problem by disabling low power mode.

       

      But now we got a new one!

       

      Our board's USB3.0 communication is not stable, it will fail in 20, 40 or 60 hours, the time is unpredictable.

      The last three times we got no error or CTL message from bus hound.

      We read the link error counter, it's no more than 64, and not changed after connection.

       

       

      When it failes, it seems like that not all the pipes are blocked, sometimes EP3 blocked, sometimes other EP_Out pipe blocked.

      When EP3 blocked, we can see the OUT DATA from bus hound, but cannot get the due IN DATA.

      We tried to RESET, FLUSH and ABORT the pipe by calling WinUSB driver's interface,but cannot restore the communication.

      The only way to restore communication without reset our board is to unplug then plug-in the USB cable.

       

      Any idears with why this is happening?

        • 1. Re: USB3.0 communication is not stable
          KandlaguntaR_36

          Hello,

           

          Please check whether you are receiving CYU3P_USBEP_SS_RESET_EVT.

           

          In order to check this, please register for CyFxApplnEpCallback as shown in the GpifTousb example (C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\firmware\basic_examples\cyfxgpiftousb)

           

          You need to perform an endpoint specific recovery when the CYU3P_USBEP_SS_RESET_EVT event is received. The recommended recovery procedure is to stall the endpoint and then stop and restart the DMA path when the CLEAR_FEATURE request is received. Please refer to GpifToUsb example project for the implementation of this sequence.

           

          Note that the host application should detect the STALL and issue clear feature.

           

          if (evtype == CYU3P_USBEP_SS_RESET_EVT)

              {

                    /*Stall the endpoint on which error  occurred*/

                      CyU3PUsbStall (epnum, CyTrue, CyFalse);

              }

           

          if ((bTarget == CY_U3P_USB_TARGET_ENDPT) && (bRequest == CY_U3P_USB_SC_CLEAR_FEATURE)

                          && (wValue == CY_U3P_USBX_FS_EP_HALT))

                  {

                              CyU3PUsbSetEpNak (epnum, CyTrue);

                              CyU3PBusyWait (125);

           

                              CyU3PDmaChannelReset (&glDmaChHandle);

                              CyU3PUsbFlushEp(epnum);

                              CyU3PUsbResetEp (epnum);

                              CyU3PDmaChannelSetXfer (&glDmaChHandle, 0);

                              CyU3PUsbStall (wIndex, CyFalse, CyTrue);

           

                              CyU3PUsbSetEpNak (epnum, CyFalse);

                              isHandled = CyTrue;

                              CyU3PUsbAckSetup ();

                   }

           

          Regards,

          Sridhar