USB论坛
直播中

北冥有熊

9年用户 993经验值
擅长:131594
私信 关注
[问答]

cyusb3014软重启之后slavefifo功能返回错误的原因?

我使用cyusb3014工作再slavefifo 16bit手动模式下,现在我希望通过pc软件去软重启cyusb3014,通过发送vendor命令实验,比如:
if(wValue == CY_FX_USB_RESET)
{
glResetDevice = CyTrue;
CyU3PUsbAckSetup();
}
void SlFifoAppThread_Entry(uint32_t input)
{
...
for (;;)
{
CyU3PThreadSleep (1000);
if (glIsApplnActive)
{
/* Print the number of buffers received so far from the USB host.
CyU3PDebugPrint (6, "Data tracker: buffers received: %d, buffers sent: %d.n",
glDMARxCount, glDMATxCount);*/
}
if (glResetDevice)
{
/* Disconnect from the USB host and reset the device. */
glResetDevice = CyFalse;
CyU3PThreadSleep (1000);
CyU3PConnectState (CyFalse, CyTrue);
CyU3PThreadSleep (1000);
CyU3PDeviceReset (CyFalse);
}
}
}
cyusb3014软重启之后,我发现它的salvefifo模式下的读取和写入功能都不能再正常工作了,总是返回错误代码。我该怎么去修正它实现软重启之后的salvefifo功能正常使用?

回帖(1)

杨福林

2025-5-26 18:22:15

在CYUSB3014软重启后Slave FIFO功能返回错误的可能原因及解决方案如下:


1. DMA通道未完全释放



  • 现象:重启后DMA无法正确传输数据。

  • 原因CyU3PDmaChannelReset可能未彻底释放通道资源。

  • 解决

    • 在重启前调用CyU3PDmaChannelDestroy彻底销毁通道。

    • 确保重启后重新创建DMA通道并正确配置。



// 示例:销毁DMA通道
CyU3PDmaChannelReset(&glChHandleSlFifoUtoP);
CyU3PDmaChannelDestroy(&glChHandleSlFifoUtoP);
// 重新初始化DMA
SlFifoInit();

2. GPIF状态残留



  • 现象:GPIF接口无法进入正确状态。

  • 原因:GPIF状态机未复位导致配置冲突。

  • 解决

    • 重启时先禁用GPIF,再重新加载配置。

    • 调用CyU3PGpifLoad()重新加载GPIF描述符。



CyU3PGpifDisable();
CyU3PGpifLoad(&CyFxGpifConfig);  // 重新加载GPIF配置
CyU3PGpifEnable(CyTrue);          // 启用GPIF

3. USB端点未正确重置



  • 现象:主机无法识别设备或端点超时。

  • 原因:USB端点未正确关闭或重新初始化。

  • 解决

    • CyU3PUsbStop()后,重新设置描述符并启动USB。



CyU3PUsbStop();                   // 停止USB协议栈
CyU3PUsbSetDesc(CyTrue, CY_FX_USB_VID, CY_FX_USB_PID); // 重新设置描述符
CyU3PUsbStart();                  // 重启USB协议栈

4. 状态变量未重置



  • 现象:计数器或标志位残留导致逻辑错误。

  • 解决

    • 在复位流程中重置全局变量。



glDMARxCount = 0;
glDMATxCount = 0;
glIsApplnActive = CyFalse;        // 等待重新激活

5. 固件时序问题



  • 现象:初始化顺序错误导致硬件未就绪。

  • 解决

    • 在关键操作后添加适当延迟(如CyU3PBusyWait(1000))。



CyU3PUsbStop();
CyU3PBusyWait(1000);              // 等待1ms确保USB停止
CyU3PUsbStart();

6. 中断未重新注册



  • 现象:数据事件无法触发。

  • 解决

    • 重启后重新绑定DMA回调函数。



CyU3PDmaChannelRegisterCallback(&glChHandleSlFifoUtoP, 
                                CY_U3P_DMA_CB_XFER_CPLT,
                                SlaveFifoDmaUtoPCb);

调试建议



  • 日志跟踪:在复位流程中增加调试输出,确认每一步返回值。

  • 工具监测:使用Cypress SuiteUSB3或Wireshark监测USB控制传输是否成功。


CyU3PDebugPrint(4, "USB Restart Status: %dn", apiRet); // 检查API返回值

通过以上步骤排查,应能解决软重启后Slave FIFO功能异常的问题。重点检查DMA、GPIF和USB的初始化和释放顺序,确保无资源冲突。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分