USB论坛
直播中

尤立虔

9年用户 1068经验值
擅长:控制/MCU
私信 关注
[问答]

使用FX3进行Sync_SlaveFIFO_2bit双向通信,烧录程序后用usb control center 无法识别出设备,为什么?

你好, 使用FX3进行Sync_SlaveFIFO_2bit 双向通信,,将FLAGA-FALGD都配置成thread_x_DMA_Ready(x= 0,1,2,3),烧录程序后用usb control center 无法识别出设备,但在设备管理器里面能检测到设备,代码是在原demo上增加了2个dma通道,硬件上没有引出uart接口,不知道程序卡在哪里了,代码里#if test #end之间代码是自己添加的,可能是哪里出了问题,
#ifdef MANUAL
/* Create a DMA MANUAL channel for U2P transfer.
* DMA size is set based on the USB speed. */
dmaCfg.size = DMA_BUF_SIZE* size;
dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT_U_2_P;
dmaCfg.prodSckId = CY_FX_PRODUCER_USB_SOCKET;
dmaCfg.consSckId = CY_FX_CONSUMER_PPORT_SOCKET;
dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE;
/* Enabling the callback for produce event. */
dmaCfg.notification = CY_U3P_DMA_CB_PROD_EVENT;
dmaCfg.cb = CyFxSlFifoUtoPDmaCallback;
dmaCfg.prodHeader = 0;
dmaCfg.prodFooter = 0;
dmaCfg.consHeader = 0;
dmaCfg.prodAvailCount = 0;
apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoUtoP,
CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, “CyU3PDmaChannelCreate failed, Error code = %dn”, apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
/* Create a DMA MANUAL channel for P2U transfer. */
dmaCfg.prodSckId = CY_FX_PRODUCER_PPORT_SOCKET;
dmaCfg.consSckId = CY_FX_CONSUMER_USB_SOCKET;
dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT_P_2_U;
dmaCfg.cb = CyFxSlFifoPtoUDmaCallback;
apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoPtoU,
CY_U3P_DMA_TYPE_MANUAL, &dmaCfg)
#if test
/*------------------------------------add ---------------------------------------*/
/* Create a DMA MANUAL channel for U2P transfer.
* DMA size is set based on the USB speed. */
dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT_U_2_P_CAN_RX;
dmaCfg.prodSckId = CY_FX_PRODUCER_USB_SOCKET;
dmaCfg.consSckId = CY_FX_CONSUMER_PPORT_SOCKET_CAN_RX;
dmaCfg.cb = CyFxSlFifoUtoPDmaCallback;
apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoUtoP_CAN_RX,
CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);
if (apiRetStatus != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, “CyU3PDmaChannelCreate failed, Error code = %dn”, apiRetStatus);
CyFxAppErrorHandler(apiRetStatus);
}
/* Create a DMA MANUAL channel for P2U transfer. */
dmaCfg.prodSckId = CY_FX_PRODUCER_PPORT_SOCKET_CAN_TX;
dmaCfg.consSckId = CY_FX_CONSUMER_USB_SOCKET;
dmaCfg.count = CY_FX_SLFIFO_DMA_BUF_COUNT_P_2_U_CAN_TX;
dmaCfg.cb = CyFxSlFifoPtoUDmaCallback;
apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoPtoU_CAN_TX,
CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);
/*------------------------------------end of add ------------------------------------------*/
#endif

回帖(1)

切克切克闹

2025-5-22 16:59:07

针对您在使用FX3的SlaveFIFO模式时遇到的USB识别问题,以下是可能的原因和排查步骤:




1. USB描述符/配置问题



  • 现象:设备管理器能识别,但USB Control Center无法识别。

  • 可能原因

    • USB设备未正确配置为SlaveFIFO模式。

    • USB描述符(如接口/端点配置)与SlaveFIFO模式不匹配。


  • 排查步骤

    1. 检查固件中是否在CyFxSlFifoApplnInit()中调用了CyU3PUsbSetDesc()CyU3PUsbStart()

    2. 确认USB接口类型设置为CY_U3P_USB_PROTO_IFACE_NUM_FOR_BULK

    3. 检查端点配置是否正确(如EP1-IN/EP1-OUT是否启用)。





2. DMA通道配置错误



  • 现象:新增的DMA通道导致异常。

  • 可能原因

    • DMA通道未正确创建或启动。

    • 缓冲区大小(size/count)设置不合理。


  • 排查步骤

    1. 检查CyU3PDmaChannelCreate()CyU3PDmaChannelSetXfer()的返回值,确认DMA通道初始化成功。

    2. 确保dmaCfg.sizedmaCfg.count的值合理(例如DMA_BUF_SIZE=1024CY_FX_SLFIFO_DMA_BUF_COUNT=4)。

    3. 检查DMA通道的prodSckIdconsSckId是否指向正确的Socket(如EP1对应Socket 0)。





3. GPIO标志(FLAGA-FLAGD)配置错误



  • 现象:GPIO映射错误导致SlaveFIFO握手失败。

  • 可能原因

    • FLAGA-FLAGD未正确映射到GPIO引脚。

    • 硬件引脚连接与固件配置不一致。


  • 排查步骤

    1. 检查CyFxSlFifoInit()中的GPIO配置,例如:
      ioCfg.gpioSimpleEn[0] = 0xFFFFFFFF;  // 启用所有GPIO
      ioCfg.gpioSimpleEn[1] = 0xFFFFFFFF;

    2. 确认CyU3PSlFifoSetFlags()中设置的GPIO与硬件实际连接一致。





4. 固件卡死在初始化阶段



  • 现象:程序未完成初始化。

  • 可能原因

    • 内存分配失败(如DMA缓冲区过大)。

    • 关键函数返回错误(如CyU3PDmaChannelCreate()返回CY_U3P_ERROR_BAD_ARGUMENT)。


  • 排查步骤

    1. 在关键函数后添加错误检查:
      status = CyU3PDmaChannelCreate(&handle, CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);
      if (status != CY_U3P_SUCCESS) {
      CyU3PDebugPrint(4, "DMA Channel Creation Failed: %dn", status);
      return status;
      }

    2. 使用CyU3PDebugPrint()输出调试信息(需开启CY_U3P_DEBUG_PRINT宏)。





5. 硬件问题



  • 现象:USB信号不稳定或电源问题。

  • 排查步骤

    1. 检查USB线缆是否正常。

    2. 测量VBUS电压是否稳定(5V±5%)。

    3. 确认FX3的时钟源(如19.2MHz晶振)正常工作。





调试建议



  • GPIO/LED调试:在关键代码段添加GPIO电平切换,通过示波器观察执行流程。

  • 最小化测试:暂时注释新增的DMA通道代码,验证原始Demo是否能正常工作。

  • USB日志:使用CyU3PUsbGetSpeed()检查USB连接速度(全速/高速)。




参考代码片段


// 检查DMA通道配置
CyU3PDmaChannelConfig_t dmaCfg;
dmaCfg.size = 1024;  // 按实际需求调整
dmaCfg.count = 4;    // 缓冲区数量
dmaCfg.validSckCount = 2;
dmaCfg.prodSckId[0] = (CyU3PDmaSocketId_t)CY_FX_EP_PRODUCER_SOCKET;
dmaCfg.consSckId[0] = (CyU3PDmaSocketId_t)CY_FX_EP_CONSUMER_SOCKET;

// 启用调试输出
#define CY_U3P_DEBUG_PRINT 1
CyU3PDebugPrint(4, "Current USB Speed: %dn", CyU3PUsbGetSpeed());

如果问题仍未解决,建议提供更详细的代码片段(尤其是DMA配置部分)和硬件连接图,以便进一步分析。

举报

更多回帖

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