完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我正在集成两个 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 = (CyU3PDmaSocketid_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 相关的问题? 我可以采取哪些额外的调试步骤来解决这个问题? |
|
相关推荐
1个回答
|
|
|
在FX3开发中, 1. 检查DMA缓冲区地址对齐FX3的DMA控制器对缓冲区地址有严格的对齐要求:
正确做法示例: 2. 验证DMA通道配置合并两个示例时,需确保通道配置(
示例配置: 3. 确保通道已正确启动在提交缓冲区之前,必须调用 4. 检查通道类型(Manual/Socket)
错误场景: 5. 避免内存冲突
6. 调试建议
7. 参考SDK示例
常见问题总结
通过以上步骤,应能定位并解决错误代码66的问题。建议优先检查缓冲区地址对齐和通道启动逻辑,这是此错误最常见的诱因。 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2353 浏览 0 评论
1425 浏览 0 评论
1874 浏览 0 评论
CYUSB3014烧录失败Cypress Benicia USB Boot Device
7868 浏览 1 评论
11294 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:24 , Processed in 0.653067 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
448