TI中文支持网
TI专业的中文技术问题搜集分享网站

IWR6843: 关于 DEMO \ti\mmwave_industrial_toolbox_4_1_0\labs\people_counting\68xx_people_counting 的一个问题

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通道后无法接收数据,但是可以发送.如果需要配置,我应该在哪个位置配置呢?

赞(0)
未经允许不得转载:TI中文支持网 » IWR6843: 关于 DEMO \ti\mmwave_industrial_toolbox_4_1_0\labs\people_counting\68xx_people_counting 的一个问题
分享到: 更多 (0)