完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
你好,
我一直在努力让UART在DMAmode工作。我想做的是接收一个USB数据包,其中有一些数据要用UART发送出去,并且通过USB将UART接收到的任何数据发送回计算机。我可以使用逐字节模式来实现这一点,但是它需要使用线程来连续查找接收到的数据,并将其放入缓冲区中,以便通过USB发送回计算机。我觉得这将是一个完美的使用UART DMA模式。我找不到任何例子来演示如何做到这一点,除了一个演示如何做回环。因为只有一个DMA通道被创建,但是我认为我需要为发送一个信道和接收一个DMA信道。这是正确的吗? 这里是我编写的初始化UART和创建一个发送和接收DMA通道的代码。这个看起来正确吗? Cyu3PrimStutsUsSerialInIT(空隙){CuU3PUARTCONtiCONTUT UARTCONFIG;CYU3PRESTROSTATUS SUT APIRTSTATION;CYU3PDMACHANNEL CONTICORT DMACONFIG;/ /初始化UART。ApItReStase= CUU3PUARTITIN();CyuU3px成功与否[CyuU3PyErrRoRyAlRead yLoad)返回ApIrtStase//Tube UART配置CYU3PMESET((UTI8A*T*)和UARTCONFIG,0,SIZEOF(UARTCONFIG));UARTCONTION.BUDATRATE CYUU3PYUARTHARBAUDRATE9600;UARTCONTION.CSTOBIT = CYU-U3PYUARTZONONEL STORYBIT;UARTCONTIONIQUICE = CYUU3PYUARTZONNOY奇偶校验;UARTC;UARTCOnFig.TxFabel= CyTrime:UARTCONTRO.RXNETABLE = CyTrime:UARTCONTION.FULTCORTL= CYFLUE;UARTCONTION.ISDMA = CyTalm;ApIdReStase= CUU3PUARTSETCONFIG(和;UARTCONFIG,NULL);= CyuU3pIn成功)返回ApIdSt回事;//初始化DMACONFIG。Cyu3pMeMeSET((UTn8*T**)和;DMACCONFIG,0,SIZEOF(DMACONFIG));DMACONGUIGODMABUFIX大小;DMACONFIGO计数=1;DMACONFIGI.DMAMODE=CyuU3PyDMAYMDEDEB字节;DMACONFIGO PRODHOMED=0;DMACONFIGO PRODHOPETER=0;DMACONFIGO CONSEHADER=0;DMACONFIG.PRODUDSCOUNT计数=0;ANNELL写入UART。DMACONFIG.PRODSCKID = CyuU3PyCpUKEKYOPRD;DMACONFIGIN CXSCHODKY=CYU-U3PYLPPHOSKETYUARTHARCONS;DMACONFIGO通知=0;DMACONFIGUC.CB=NULL;ApIdReStase= CUU3PDMACHANNEL CREATE(和;GULARTTXXCHAD句柄,CYU-U3PYDMAYTYPE MUROALLYOUT,和DMACONFIG);= CyuU3pIa成功)返回ApIrSt回事;/ /创建一个从UART读取的信道。DMACONFIG.PRODSCKID=CyuU3PyLpp.SokKeToUARTHOPRD;DMACONFIGIN CYU-U3PYPUCKETYOK CONS;DMACONFIGION通知= CyuU3PyDMAYBCBYPRODY事件;DMACONFIGUC.CB = CYFXARTARDMACLABACK;APIRESSTATION= CYU3PDMACHANNEL CREATE(&;GualARTrxCH句柄,CyuU3PyDMAX Type Muralalin in,and DMACCONFIG);匹敌!= CyuU3pIa成功)返回ApIrTestStury;//设置UART TX传输大小到无限APIItRealSt= CUU3PUARTTXStBaseBuffFER(0xFFFFFFF);= CyuU3pIa成功)返回ApIrTestStury;//设置UART RX传输大小为1 ApIrtStase= CuU3PuARTrxStBaseBuffFER(0xFFFFFFF);= CyuU3pIa成功)返回ApIrStReSTATION;//设置DMA信道传输大小ApItReStase= CUU3PDMACHANNEL SETXFER(&GLUARTTXCHCHAND句柄,CyfxFXUARTARDMAXTXY大小);= CYU-U3PY成功)返回APIRTSTATION;返回APIRSTATSTATION;} 这里有一些代码将数据发送到UART进行传输。当我这样做的时候,没有数据流出UART。我到底错在哪里? CYU3PRESTROSTATUS SUT SUDUART(UINT8*T*缓冲器,INT长度){CYU3PRESTROSTATUS SUT APIRTSTATION;CYU3PDMABUFFEFRT DTMAFW2UART缓冲器;/ /获得一个OUT缓冲器。ApItReStase= CYU3PDMACHANNEL GETBASIC(&GLUARTTXCHCHAND,和DMAFW2UART缓冲器,CYU3PYAWITITYON);如果(APIRESSTATE!Cyu3pIn成功)返回APIRTSTATION;CYU3PMEMIONE(DMAFW2UARTFUBER),缓冲器,缓冲器,长度;ApIdReStase= CYU3PDMACHANNEICANPROCESSIMPLE(&GLUARTTXCHHACKER,长度,0);= CYU-U3PY成功)返回APIRTSTATION;返回APIRSTATSTATION;} 谢谢您, 加里奥 以上来自于百度翻译 以下为原文 Hello, I have been trying to get the UART to work in DMA mode. What I would like to do is receive a USB packet with some data that I that is to be sent out using the UART and also send any data received by the UART back to the computer over USB. I am able to do this using the byte by byte mode but it requires the use of a thread to continuosly look for received data and put it in a buffer to be sent back to the computer over USB. I seems like this would be a perfect use for the UART DMA mode. I can not find any examples that show how to do this besides the one that shows how to do a loopback. For that there is only one DMA channel created but I think I need to channels one for sending and one for receiveing. Is this correct? Here is some code that I wrote to initialize the UART and create the a send and receive DMA channel. Does this look correct. CyU3PReturnStatus_t SerialInit(void) { CyU3PUartConfig_t uartConfig; CyU3PReturnStatus_t apiRetStatus; CyU3PDmaChannelConfig_t dmaConfig; // Initialize the UART. apiRetStatus = CyU3PUartInit(); if (apiRetStatus != CY_U3P_SUCCESS && apiRetStatus != CY_U3P_ERROR_ALREADY_STARTED) return apiRetStatus; // Set UART configuration CyU3PMemSet ((uint8_t *)&uartConfig, 0, sizeof (uartConfig)); uartConfig.baudRate = CY_U3P_UART_BAUDRATE_9600; uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT; uartConfig.parity = CY_U3P_UART_NO_PARITY; uartConfig.txEnable = CyTrue; uartConfig.rxEnable = CyTrue; uartConfig.flowCtrl = CyFalse; uartConfig.isDma = CyTrue; apiRetStatus = CyU3PUartSetConfig (&uartConfig, NULL); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; // Initialize the dmaConfig. CyU3PMemSet ((uint8_t *)&dmaConfig, 0, sizeof(dmaConfig)); dmaConfig.size = CY_FX_UART_DMA_BUF_SIZE; dmaConfig.count = 1; dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE; dmaConfig.prodHeader = 0; dmaConfig.prodFooter = 0; dmaConfig.consHeader = 0; dmaConfig.prodAvailCount = 0; // Create a channel to write to the UART. dmaConfig.prodSckId = CY_U3P_CPU_SOCKET_PROD; dmaConfig.consSckId = CY_U3P_LPP_SOCKET_UART_CONS; dmaConfig.notification = 0; dmaConfig.cb = NULL; apiRetStatus = CyU3PDmaChannelCreate (&glUartTxChHandle, CY_U3P_DMA_TYPE_MANUAL_OUT, &dmaConfig); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; // Create a channel to read from the UART. dmaConfig.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD; dmaConfig.consSckId = CY_U3P_CPU_SOCKET_CONS; dmaConfig.notification = CY_U3P_DMA_CB_PROD_EVENT; dmaConfig.cb = CyFxUartDmaCallback; apiRetStatus = CyU3PDmaChannelCreate (&glUartRxChHandle, CY_U3P_DMA_TYPE_MANUAL_IN, &dmaConfig); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; // Set UART Tx transfer Size to infinite apiRetStatus = CyU3PUartTxSetBlockXfer(0xffffffff); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; // Set UART Rx transfer Size to 1 apiRetStatus = CyU3PUartRxSetBlockXfer(0xFFFFFFFF); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; // Set DMA Channel transfer size apiRetStatus = CyU3PDmaChannelSetXfer (&glUartTxChHandle, CY_FX_UART_DMA_TX_SIZE); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; return apiRetStatus; } Here is some code that send data to the UART to be transmitted. When I do this no data goes out the UART. What am I doing wrong? CyU3PReturnStatus_t SendUART(uint8_t *buffer, int Length) { CyU3PReturnStatus_t apiRetStatus; CyU3PDmaBuffer_t dmaFw2UARTBuffer; // Get an out buffer. apiRetStatus = CyU3PDmaChannelGetBuffer(&glUartTxChHandle, &dmaFw2UARTBuffer, CYU3P_WAIT_FOREVER); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; CyU3PMemCopy(dmaFw2UARTBuffer.buffer, buffer, Length); apiRetStatus = CyU3PDmaChannelCommitBuffer (&glUartTxChHandle, Length, 0); if (apiRetStatus != CY_U3P_SUCCESS) return apiRetStatus; return apiRetStatus; } Thank you, Garyio |
|
相关推荐
1个回答
|
|
请创建一个威廉希尔官方网站
支持案例来获得与您的问题相关的帮助。
谢谢, 西克里希纳。 以上来自于百度翻译 以下为原文 Please create a tech support case to get help related to your issue. Thanks, sai krishna. |
|
|
|
只有小组成员才能发言,加入小组>>
741个成员聚集在这个小组
加入小组2002 浏览 1 评论
1761 浏览 1 评论
3545 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1696 浏览 6 评论
1466 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
273浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
170浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
355浏览 2评论
299浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
487浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-20 12:34 , Processed in 0.587194 second(s), Total 43, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号