Part Number:IWR6843
在mss_main.c中,代码为UART LOGGING配置了DMA通道,我尝试将UART LOGGING改为 TX|RX 可同时收发的模式,但是修改了相关文件后,UART LOGGING无法接收到任何数据,只能发送;
当我将DMA通道的配置都注释后,UART LOGGING又能接收数据了,这是为什么?
DMA配置的代码:
UART_Params_init(&uartParams);uartParams.writeDataMode = UART_DATA_BINARY;uartParams.readDataMode = UART_DATA_BINARY;uartParams.clockFrequency = gMmwMssMCB.cfg.sysClockFrequency;uartParams.baudRate= gMmwMssMCB.cfg.loggingBaudRate;uartParams.isPinMuxDone= 1U;uartParams.dmaHandle= dmaHandle;/*Here*/uartParams.txDMAChannel= 1U;/*Here*/uartParams.rxDMAChannel= 2U;/*Here*/
Chris Meng:
你好,
logging的这个UART硬件上就只有TX一根信号线,只能输出信号,不能接收。
,
Guifeng Xu:
你好,但是在引脚复用列表中我找到了UART LOGGING相关引脚的复用,并且也编写代码成功读取到了信息:
while(1){memset ((void *)&rxBuff[0], 0, sizeof(rxBuff));UART_read(gMmwMssMCB.loggingUartHandle,&rxBuff[0],(sizeof(rxBuff)-1));//task_sleep(1);for(i=0;i<BuffSize-1;i++){if(rxBuff[i]==mySign[0] && rxBuff[i+1]==mySign[1]){UART_writePolling (gMmwMssMCB.commandUartHandle,(uint8_t*)myData,sizeof(myData));break;}}}但是配置了DMA却无法接收信息了.
同样的,我将此DMA通道配置到UART COMMAND:
/* Setup the default UART Parameters */UART_Params_init(&uartParams);uartParams.clockFrequency= gMmwMssMCB.cfg.sysClockFrequency;uartParams.baudRate= gMmwMssMCB.cfg.commandBaudRate;uartParams.isPinMuxDone= 1U; //uartParams.dmaHandle= dmaHandle;/*Here*/ //uartParams.txDMAChannel= 1U;/*Here*/ //uartParams.rxDMAChannel= 2U;/*Here*//* Open the UART Instance */gMmwMssMCB.commandUartHandle = UART_open(0, &uartParams);UART COMMAND(CLI)就失去了反应,无法发送与接收任何数据.
目前的情况是:
1.UART LOGGING 不配置DMA,能够TX&RX(TX数据会有缺失)
2.UART LOGGING 配置DMA,无法RX
3.UART COMMAND 不配置DMA,能够TX&RX
4.UART COMMAND 配置DMA,无法TX&RX
如果我想要UART LOGGING在配置DMA后,还能TX&RX,应该如何设置?
,
Chris Meng:
你好,
从下面的pinmux配置就可以看出,UART3只有一个引脚,只支持TX的功能。我无法理解你的UART logging可以RX是如何能实现的。你的测试代码是否有问题?
static void Pcount3DDemo_platformInit(Pcount3DDemo_platformCfg *config){
/* Setup the PINMUX to bring out the UART-1 */ Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINN5_PADBE, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); Pinmux_Set_FuncSel(SOC_XWR68XX_PINN5_PADBE, SOC_XWR68XX_PINN5_PADBE_MSS_UARTA_TX); Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINN4_PADBD, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); Pinmux_Set_FuncSel(SOC_XWR68XX_PINN4_PADBD, SOC_XWR68XX_PINN4_PADBD_MSS_UARTA_RX);
/* Setup the PINMUX to bring out the UART-3 */ Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINF14_PADAJ, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); Pinmux_Set_FuncSel(SOC_XWR68XX_PINF14_PADAJ, SOC_XWR68XX_PINF14_PADAJ_MSS_UARTB_TX);
,
Chris Meng:
Guifeng Xu 说:我将此DMA通道配置到UART COMMAND:
为什么没有下面的相关代码?
uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY;
,
Guifeng Xu:
我刚刚测试过,即使这样配置,CLI也无法接收数据(无法正常使用).
关于pinmux,我额外添加的配置如下:
Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINP4_PADBB, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);Pinmux_Set_FuncSel(SOC_XWR68XX_PINP4_PADBB, SOC_XWR68XX_PINP4_PADBB_MSS_UARTB_RX);并且不配置DMA下 *能够正常接收数据* ,这个引脚我独立引出来了.
在这个配置下应该如何配置DMA使其能够接收数据呢?
,
Chris Meng:
你好,
下面的配置代码里UART3只有TX功能。请尝试修改重新编译驱动再重新编译代码试一下。另,industrial toolbox目前最新的版本是10.1,建议使用最新版本。
C:\ti\mmwave_sdk_03_05_00_04\packages\ti\drivers\uart\platform\uart_xwr68xx.c
#ifdef SUBSYS_MSS
/** * @brief This is the XWR68xx MSS specific UART configuration. There are * 2 UART instances available on the MSS. UART1 is tied to SCI-A and UART3 is * tied to SCI-B. This should *NOT* be modified by the customer. */UartSci_HwCfg gUartSciHwCfg[2] ={ /* UART1 Hardware configuration: * – Capable of sending and receiving data * – PIN MUX is required */ { ((volatile SCIRegs*)SOC_XWR68XX_MSS_SCI_A_BASE_ADDRESS), UartSci_Duplexity_FULL, UartSci_PinMux_REQUIRED, SOC_XWR68XX_MSS_SCIA_LVL0_INT, SOC_XWR68XX_MSS_SCIA_TX_DMA_REQ, SOC_XWR68XX_MSS_SCIA_RX_DMA_REQ, &UartSci_openDMA, &UartSci_closeDMA, &UartSci_isDMAEnabled, &UartSci_initiateRxDMA, &UartSci_initiateTxDMA },
/* UART3 Hardware configuration: * – Capable of only sending data * – PIN MUX is required */ { ((volatile SCIRegs*)SOC_XWR68XX_MSS_SCI_B_BASE_ADDRESS), UartSci_Duplexity_TX_ONLY, UartSci_PinMux_REQUIRED, SOC_XWR68XX_MSS_SCIB_LVL0_INT, SOC_XWR68XX_MSS_SCIB_TX_DMA_REQ, SOC_XWR68XX_MSS_SCIB_RX_DMA_REQ, &UartSci_openDMA, &UartSci_closeDMA, &UartSci_isDMAEnabled, &UartSci_initiateRxDMA, &UartSci_initiateTxDMA }};
,
Guifeng Xu:
我修改了此处的代码,修改为了 UartSci_Duplexity_FULL ,并且可用.可TX|RX,已经经过测试.
我修改为了可用,为什么您要写一份将RX功能关闭的给我 XD
我只是想请教一下 在mss中,UART LOGGING的DMA通道是否只有发送有配置,而接收没有配置?如果有,我应该修改哪里?
,
Chris Meng:
Guifeng Xu 说:
我修改了此处的代码,修改为了 UartSci_Duplexity_FULL ,并且可用.可TX|RX,已经经过测试.
我修改为了可用,为什么您要写一份将RX功能关闭的给我 XD
从你的post里,我无法知道你修改了什么。我提供的是默认代码,标出需要修改的地方供参考。
请问你使用的硬件是IWR6843ISK还是你自己做的板子?
你能否使用uart驱动的测试代码来复现你的问题?
C:\ti\mmwave_sdk_03_05_00_04\packages\ti\drivers\uart\test\xwr68xx
,
Guifeng Xu:
我的修改如下:
UartSci_Duplexity_FULL,/*UartSci_Duplexity_TX_ONLY,*/...Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINP4_PADBB, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL);Pinmux_Set_FuncSel(SOC_XWR68XX_PINP4_PADBB, SOC_XWR68XX_PINP4_PADBB_MSS_UARTB_RX);...正如我所描述的,我将预留的引脚复用为UART LOGGING的RX,并且修改了驱动文件.
这个配置方法是可行的.
我从IWR6843的设备中将UART LOGGING的两条线引了出来.
请问应该如何配置DMA?
如果UART LOGGING口无法配置DMA,那么UART COMMAND口如何配置DMA?
为什么您看不到我的问题 XD
我的问题是 如何配置UART LOGGING和UART COMMAND的DMA
谢谢!
,
Guifeng Xu:
直接配置
UART_Params_init(&uartParams);// uartParams.writeDataMode = UART_DATA_BINARY;// uartParams.readDataMode = UART_DATA_BINARY; uartParams.clockFrequency = gMmwMssMCB.cfg.sysClockFrequency; uartParams.baudRate = gMmwMssMCB.cfg.commandBaudRate; uartParams.isPinMuxDone = 1U; uartParams.dmaHandle = dmaHandle;/*Here*/ uartParams.txDMAChannel = 1U;/*Here*/ uartParams.rxDMAChannel = 2U;/*Here*/
/* Open the UART Instance */ gMmwMssMCB.commandUartHandle = UART_open(0, &uartParams);
会导致CLI无法接收数据.
补充再一次.
,
Chris Meng:
Guifeng Xu 说:会导致CLI无法接收数据
从下面的代码可以看出,在TEXT模式下,需要输出回车等特殊字符,所以无法和DMA模式很好的配合使用。也是你代码修改UART为DMA模式后CLI不能正常工作的原因。
static void UartSci_writeChar( UartSci_Driver* ptrUartSciDriver, UartSci_HwCfg* ptrHwCfg){ /* Is the UART Driver operating in TEXT/BINARY Mode? */ if (ptrUartSciDriver->params.writeDataMode == UART_DATA_TEXT) { /* TEXT Mode: */ if (ptrUartSciDriver->writeCR) { /* Write the return character */ UartSci_putCh (ptrHwCfg->ptrSCIRegs, CONST_CR);
/* Write size is incremented an additional time on the detection of '\n' * So we decrement it back again here. */ ptrUartSciDriver->writeSize–; ptrUartSciDriver->writeCount++; ptrUartSciDriver->writeCR = 0; } else { /* Add a return if next character is a newline. */ if (*(char *)ptrUartSciDriver->ptrWriteBuffer == CONST_LF) { ptrUartSciDriver->writeSize++; ptrUartSciDriver->writeCR = 1; }
/* Write the character to the transmit buffer: */ UartSci_putCh (ptrHwCfg->ptrSCIRegs, *(uint8_t*)ptrUartSciDriver->ptrWriteBuffer);
/* Move to the next character */ ptrUartSciDriver->ptrWriteBuffer = (uint8_t *)ptrUartSciDriver->ptrWriteBuffer + 1; ptrUartSciDriver->writeSize–; ptrUartSciDriver->writeCount++; } } else { /* Binary Mode: */ UartSci_putCh (ptrHwCfg->ptrSCIRegs, *(uint8_t *)ptrUartSciDriver->ptrWriteBuffer);
/* Move to the next character */ ptrUartSciDriver->ptrWriteBuffer = (uint8_t *)ptrUartSciDriver->ptrWriteBuffer + 1; ptrUartSciDriver->writeSize–; ptrUartSciDriver->writeCount++; }}
下面的论坛讨论也可以参考:
IWR1443BOOST: CaptureDemo to UART – Sensors forum – Sensors – TI E2E support forums
,
Chris Meng:
Guifeng Xu 说:那么UART COMMAND口如何配置DMA?
在C:\ti\mmwave_sdk_03_05_00_04\packages\ti\drivers\uart\test\common\uart_test.c里有使用UART0的DMA模式进行读写的测试代码,请参考,里面使用的是binary mode+dma。
Guifeng Xu 说:2.UART LOGGING 配置DMA,无法RX
请问是一个byte都没有收到,还是没有收到你设定收的全部数据?
,
Guifeng Xu:
关于第一个回答:我查看了这个代码,我的理解如下:UART配置需要按照:
/* Setup the default UART Parameters */ UART_Params_init(&uartParams); uartParams.clockFrequency = gMmwMssMCB.cfg.sysClockFrequency; uartParams.baudRate = gMmwMssMCB.cfg.commandBaudRate; uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY; uartParams.readEcho = UART_ECHO_OFF;// uartParams.isPinMuxDone = 1U; uartParams.dmaHandle = dmaHandle;/*Here*/ uartParams.txDMAChannel = 1U;/*Here*/ uartParams.rxDMAChannel = 2U;/*Here*/
/* Open the UART Instance */ gMmwMssMCB.commandUartHandle = UART_open(0, &uartParams);
DMA配置为默认配置: DMA_Params_init(&dmaParams); dmaHandle = DMA_open(0, &dmaParams, &errCode);我开启了一个任务来接收uartCommand的数据,在此之前我已经调用了CLI_close()以确保只有一个任务在读取UART COMMAND:void Mmwave_CLI_Write_Task(UArg arg0, UArg arg1){ uint8_t rxBuff[256]; uint16_t BuffSize=256; uint32_t i; uint32_t readNum=0; const char startData[20]="[getData.]\r\n"; while(1) { memset ((void *)&rxBuff[0], 0, sizeof(rxBuff)); readNum=UART_read(gMmwMssMCB.commandUartHandle,&rxBuff[0],(sizeof(BuffSize)-1)); for(i=0;i<BuffSize;i++) { if(rxBuff[i]=='A') { UART_write(gMmwMssMCB.commandUartHandle,(uint8_t*)startData,sizeof(startData)); break; } } UART_write(gMmwMssMCB.commandUartHandle,(uint8_t*)readNum,sizeof(readNum)); Task_sleep(1000); }}
逻辑为读取到'A'则发送一个标志数据.然而我无法读取到任何数据.我缺少哪一部分的配置吗?
关于第二个问题:目前测试结果为一个byte都没有接收到.谢谢您的回答!
,
Guifeng Xu:
谢谢您的回答!
在第二次测试中我修改了一下我的代码,问题已经解决了.谢谢!
,
Guifeng Xu:
您好!
我测试完UART COMMAND的DMA可用了.
UART LOGGING的rxDMA是没有预先配置吗?
我的pinmux代码如下: /*for logging*/ Pinmux_Set_OverrideCtrl(SOC_XWR68XX_PINP4_PADBB, PINMUX_OUTEN_RETAIN_HW_CTRL, PINMUX_INPEN_RETAIN_HW_CTRL); Pinmux_Set_FuncSel(SOC_XWR68XX_PINP4_PADBB, SOC_XWR68XX_PINP4_PADBB_MSS_UARTB_RX);
配置了DMA通道后无法接收数据,但是可以发送.如果需要配置,我应该在哪个位置配置呢?