我正在集成两个 FX3 示例项目:
通过 FX3 进行 USB
通信的大容量存储类 (MSC) 示例。
使用 GPIF II 接口进行 FX3 至
FPGA 通信的从属 FIFO 同步示例。
我合并了两个示例以实现与 FX3 的 USB 通信,然后通过 GPIF II 将数据传输到 FPGA。 然而,当我使用 CyU3PDmaChannelCommitBuffer 提交 DMA 缓冲区时遇到错误。 返回的错误代码为66(CY_U3P_ERROR_INVALID_ADDR)。
DMA 初始化配置:
=====================================
/* 创建大容量存储设备操作所需的DMA通道。 */
无效 CyFxMscApplnDmaInit (无效)
{
CyU3PDmaChannelConfig_t dmaConfig;
CyU3PReturnStatus_t 状态;
glMscCbwBuffer = (uint8_t *)CyU3PDmaBufferAlloc(1024);
glMscCswBuffer = (uint8_t *)CyU3PDmaBufferAlloc(1024);
glMscDataBuffer = (uint8_t *)CyU3PDmaBufferAlloc(1024);
如果 ((glMscCbwBuffer == NULL) || (glMscCswBuffer == NULL) || (glMscDataBuffer == NULL))
{
CyU3PDebugPrint (4, "Failed to allocate scratch bufferrn");
CyFxAppErrorHandler (CY_U3P_ERROR_MEMORY_ERROR);
}
#如果定义 MSC_DMA_CONFIG
/* 配置 MSC DMA 通道 */
dma配置.大小 = 1024;
dmaConfig.计数 = CY_FX_MSC_DMA_BUF_COUNT;
dmaConfig.prodSckId = (CyU3PDmaSocke
tid_t)(CY_U3P_UIB_SOCKET_PROD_0 | CY_FX_MSC_EP_BULK_OUT_SOCKET);
dmaConfig.consSckId = CY_FX_CONSUMER_PPORT_SOCKET;
dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE;
dma配置.通知 =CY_U3P_DMA_CB_RECV_CPLT;
dmaConfig.cb = CyFxMscApplnDmaCb;
状态 = CyU3PDmaChannelCreate(&glChHandleMscOut, CY_U3P_DMA_TYPE_MANUAL, &dmaConfig);
如果(状态!= CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "DMA channel create failed, code=%drn", status);
CyFxAppErrorHandler(status);
}
dmaConfig.prodSckId = CY_FX_PRODUCER_PPORT_SOCKET;
dmaConfig.consSckId = (CyU3PDmaSocketId_t)(CY_U3P_UIB_SOCKET_CONS_0 | CY_FX_MSC_EP_BULK_IN_SOCKET);
dma配置.通知 =CY_U3P_DMA_CB_发送_CPLT;
dmaConfig.cb = CyFxMscApplnDmaCb;
状态 = CyU3PDmaChannelCreate(&glChHandleMscIn、CY_U3P_DMA_TYPE_MANUAL、&dmaConfig);
如果(状态!= CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "DMA channel create failed, code=%drn", status);
CyFxAppErrorHandler(status);
}
/* 刷新端点内存 */
CyU3PUsbFlushEp(CY_FX_MSC_EP_BULK_OUT);
CyU3PUsbFlushEp(CY_FX_MSC_EP_BULK_IN);
/* 设置 DMA 通道传输大小 */
状态 = CyU3PDmaChannelSetXfer(&glChHandleMscOut,CY_FX_SLFIFO_DMA_TX_SIZE);
如果(状态!= CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PDmaChannelSetXfer Failed, Error code = %dn", status);
CyFxAppErrorHandler(status);
}
状态 = CyU3PDmaChannelSetXfer(&glChHandleMscIn,CY_FX_SLFIFO_DMA_RX_SIZE);
如果(状态!= CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PDmaChannelSetXfer Failed, Error code = %dn", status);
CyFxAppErrorHandler(status);
}
#结束
}
回调函数:
===================
void CyFxMscApplnDmaCb (CyU3PDmaChannel *handle、CyU3PDmaCbType_t evtype、CyU3PDmaCBInput_t *输入)
{
CyU3PDmaBuffer_t dmaBuf = 输入->buffer_p;
#ifdef 调试
CyU3PDebugPrint(4, “CyFxMscApplnDmaCb 事件 = %drn”, evtype);
#结束
开关(evtype)
{
案例CY_U3P_DMA_CB_RECV_CPLT:
{
如果 ((glMscState == CY_FX_MSC_STATE_CBW) || (glMscState == CY_FX_MSC_STATE_WAITING))
{
#ifdef DISABLE_SLAVE_FIFO
CyU3PReturnStatus_t 状态;
状态 = CyU3PDmaChannelCommitBuffer(句柄,输入->buffer_p.count, 0);
如果(状态!= CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PDmaChannelCommitBuffer failed, Error code = %dn", status);
}
别的
{
CyU3PDebugPrint (4, "CyU3PDmaChannelCommitBuffer successn");
}
#结束
}
别的
{
CyU3PEventSet(&glMscAppEvent, CY_FX_MSC_DATA_RECV_EVENT_FLAG, CYU3P_EVENT_OR);
}
}
休息;
}
}
调试日志:
============
呼叫 USB 连接
已收到 USB 事件 0
CyFxMscAppHandleMscTask evStat = 2,glMscState = 0
USB 设置配置完成
CyFxMscAppHandleMscTask evStat = 4,glMscState = 0
CyU3PDmaChannelCommitBuffer 失败,错误代码 = 66
CyFxMscAppHandleMscTask evStat = 8,glMscState = 2
CyFxMscAppHandleMscTask evStat = 16,glMscState = 3
CyFxMscAppHandleMscTask evStat = 16,glMscState = 5
CyU3PDmaChannelCommitBuffer 失败,错误代码 = 66
CyFxMscAppHandleMscTask evStat = 8,glMscState = 2
CyFxMscAppHandleMscTask evStat = 16,glMscState = 3
CyFxMscAppHandleMscTask evStat = 16,glMscState = 5
CyU3PDmaChannelCommitBuffer 失败,错误代码 = 66
观察结果:
==============
执行过程中该错误多次发生。
在提交缓冲区之前,其他 DMA 操作似乎运行良好。
USB 连接初始化成功,且 FX3 状态转换正确。
错误代码 66 (CY_U3P_ERROR_INVALID_ADDR) 表示缓冲区地址无效。
问题:
===========
CyU3PDmaChannelCommitBuffer 中的错误代码 66 (CY_U3P_ERROR_INVALID_ADDR) 表示什么?
将 MSC 和 Slave FIFO 示例集成在一起时是否需要任何特定配置?
这可能是由于 DMA 缓冲区配置不正确,还是与 GPIF II 相关的问题?
我可以采取哪些额外的调试步骤来解决这个问题?