USB3.0 communication is not stable

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
NCH_4488531
Level 1
Level 1

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?

0 Likes
1 Solution
KandlaguntaR_36
Moderator
Moderator
Moderator
25 solutions authored 10 solutions authored 5 solutions authored

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

View solution in original post

0 Likes
1 Reply
KandlaguntaR_36
Moderator
Moderator
Moderator
25 solutions authored 10 solutions authored 5 solutions authored

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

0 Likes