完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的应用是,cyusb3014的UART,gpio55和gpio56直接和FPGA相连,EP0收到PC数据,通过UART发送给fpga,uart收到fpga回应的数据通过EP0回送给PC。发送的uart通信的是16byte的数据帧,通信频率不超过每秒5次。目前遇到的问题是,3014的UART配置成寄存器模式,很大概率会出现CY_U3P_UART_ERROR_RX_OVERFLOW错误,并且通信无法恢复,uart回调函数如下:
uart初始化函数: ep0处理部分: 目前没有找到问题。然后又尝试了UART DMA模式,UART RX 没有问题,但是TX有问题,TX有时候会发送失败导致FPGA没有收到数据帧, dma uart初始化如下: glTxBuffer = (CyU3PDmaBuffer_t*)CyU3PDmaBufferAlloc (32); glRxBuffer = (CyU3PDmaBuffer_t*)CyU3PDmaBufferAlloc (32); /* Initialize the UART module */ apiRetStatus = CyU3PUartInit (); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } /* Configure the UART */ CyU3PMemSet ((uint8_t *) glUartConfig, 0, sizeof (glUartConfig)); glUartConfig.baudRate = CY_U3P_UART_BAUDRATE_115200; glUartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT; glUartConfig.parity = CY_U3P_UART_NO_PARITY; glUartConfig.flowCtrl = CyFalse; glUartConfig.txEnable = CyTrue; glUartConfig.rxEnable = CyTrue; glUartConfig.isDma = CyTrue; /* DMA mode */ /* Set the UART configuration */ apiRetStatus = CyU3PUartSetConfig ( glUartConfig, NULL); if (apiRetStatus != CY_U3P_SUCCESS ) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } /* Create a DMA Manual channel between UART producer socket and UART consumer socket */ CyU3PMemSet ((uint8_t *) dmaConfig, 0, sizeof(dmaConfig)); dmaConfig.size = CY_FX_UART_DMA_BUF_SIZE; dmaConfig.count = 1; dmaConfig.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD; dmaConfig.consSckId = CY_U3P_CPU_SOCKET_CONS; dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE; dmaConfig.notification = CY_U3P_DMA_CB_PROD_EVENT; dmaConfig.cb = ReceivedDataCallBack; dmaConfig.prodHeader = 0; dmaConfig.prodFooter = 0; dmaConfig.consHeader = 0; dmaConfig.prodAvailCount = 0; /* Create the channel */ apiRetStatus = CyU3PDmaChannelCreate ( glUartRXChHandle, CY_U3P_DMA_TYPE_MANUAL_IN, dmaConfig); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } dmaConfig.size = CY_FX_UART_DMA_BUF_SIZE; dmaConfig.count = 1; dmaConfig.prodSckId = CY_U3P_CPU_SOCKET_PROD; dmaConfig.consSckId = CY_U3P_LPP_SOCKET_UART_CONS; dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE; dmaConfig.notification = 0; dmaConfig.cb = NULL; dmaConfig.prodHeader = 0; dmaConfig.prodFooter = 0; dmaConfig.consHeader = 0; dmaConfig.prodAvailCount = 0; /* Create the channel */ apiRetStatus = CyU3PDmaChannelCreate ( glUartTXChHandle, CY_U3P_DMA_TYPE_MANUAL_OUT, dmaConfig); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } /* Set UART Tx and Rx transfer Size to infinite */ apiRetStatus = CyU3PUartTxSetBlockXfer(0xFFFFFFFF); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } apiRetStatus = CyU3PUartRxSetBlockXfer(0xFFFFFFFF); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } /* Set DMA Channel transfer size */ apiRetStatus = CyU3PDmaChannelSetXfer ( glUartRXChHandle, 0); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } apiRetStatus = CyU3PDmaChannelSetXfer ( glUartTXChHandle, 0); if (apiRetStatus != CY_U3P_SUCCESS) { /* Error handling */ CyFxAppErrorHandler(apiRetStatus); } 发送函数如下: CyU3PReturnStatus_t UartDMA_SendData(uint8_t * buffer, unsigned int len) { CyU3PReturnStatus_t status; unsigned int i = 0; CyU3PDmaChannelGetBuffer( glUartTXChHandle, glTxBuffer, 0); for(i = 0; i < len; i++) { glTxBuffer->buffer = buffer; } CyU3PDmaChannelSetupSendBuffer( glUartTXChHandle, glTxBuffer); status = CyU3PDmaChannelCommitBuffer( glUartTXChHandle, 16, 0); return status; } 不知道有没有人遇到这样 的问题??谢谢 |
|
相关推荐
1个回答
|
|
首先,CY_U3P_UART_ERROR_RX_OVERFLOW错误表示接收缓冲区溢出。在你的代码中,这可能是由于以下原因导致的: 1. 数据接收速度过快:cyusb3014的UART的接收缓冲区有限,如果数据发送速度超过接收速度,就可能导致接收缓冲区溢出。你可以通过增加接收缓冲区的大小或者降低数据发送速率来解决这个问题。 2. 缓冲区未及时读取:如果你的应用程序在接收到数据后没有及时读取接收缓冲区,就可能导致接收缓冲区溢出。你可以参考你的代码,确保在接收到数据后及时读取接收缓冲区。 3. 噪音或干扰:如果你的UART线路存在噪音或干扰,就可能导致接收缓冲区溢出。你可以检查UART线路是否存在干扰,并采取相应的措施来排除干扰。 对于你的问题描述,尝试与FPGA通信,将数据发送给FPGA并接收FPGA的回应,可以考虑以下几点: 1. 确保你的UART配置正确,包括波特率、数据位、停止位等参数的设置。 2. 检查你的FPGA是否按照预期配置了相应的UART接收和发送线路。 3. 确保你的数据传输模式正确,例如你提到的16字节的数据帧和频率限制。 4. 检查你的代码逻辑,确保在发送和接收数据时没有逻辑错误导致缓冲区溢出。 如果你已经尝试上述解决方案但仍然遇到问题,可以进一步调试和排查。可以考虑使用调试工具监控和分析UART的数据发送和接收过程,以及排查硬件连接的问题。 至于UART DMA模式中遇到的问题,这可能涉及到DMA配置和使用上的问题。你可以仔细检查DMA的初始化和配置,并确保DMA的发送和接收操作正确和稳定。此外,也可以考虑增加错误处理和错误检测机制,以便更好地调试和排查问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
3979 浏览 0 评论
8536 浏览 0 评论
5954 浏览 0 评论
4098 浏览 1 评论
5189 浏览 0 评论
请问一下qspi mtsr引脚传输一次32bit后引脚不拉低怎么解决?
414浏览 2评论
654浏览 2评论
4758浏览 2评论
最近UJA1023开发遇到问题了,各位大神有谁知道可以替代这颗芯片的
586浏览 1评论
820浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 01:11 , Processed in 0.701455 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号