hi TI
I use tow simultaneous uarts(exactly:uart0 and uart2) with dma to do the 'keyboard echo' in a while-loop, the Pseudocode is below:
//uart_a dma
#define UART_DMA_Tx_CHANNEL_NUM (26)
#define UART_DMA_Tx_L_CHANNEL_NUM (23)
#define UART_DMA_Rx_CHANNEL_NUM (27)
#define UART_DMA_Rx_L_CHANNEL_NUM (24)
//uart_b dma
#define UARTB_DMA_Tx_CHANNEL_NUM (30)
#define UARTB_DMA_Tx_L_CHANNEL_NUM (39)
#define UARTB_DMA_Rx_CHANNEL_NUM (31)
#define UARTB_DMA_Rx_L_CHANNEL_NUM (37)
unsigned char* rxbuffer = 0x88000000;
unsigned char* rxbufferB = 0x88001000;
while(1)
{
{
//---------------------rx characters from keyboard---------------------
//------------------------------------------
//UARTA
Uart_EDMARx(rxbuffer,
RXBUF_LEN,
UART_DMA_Rx_CHANNEL_NUM,
UART_DMA_Rx_L_CHANNEL_NUM);
//------------------------------------------
//UARTB
UartB_EDMARx(rxbufferB,
RXBUF_LEN,
UARTB_DMA_Rx_CHANNEL_NUM,
UARTB_DMA_Rx_L_CHANNEL_NUM);
Uart_Dma_Wait(UART_DMA_Rx_CHANNEL_NUM);
EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, UART_DMA_Rx_CHANNEL_NUM);
UartB_Dma_Wait(UARTB_DMA_Rx_CHANNEL_NUM);
EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, UARTB_DMA_Rx_CHANNEL_NUM);
//---------------------echo the rx characters---------------------
//------------------------------------------
//UARTB
UartB_EDMATx(rxbufferB,
RXBUF_LEN,
UARTB_DMA_Tx_CHANNEL_NUM,
UARTB_DMA_Tx_L_CHANNEL_NUM);
//------------------------------------------
//UARTA
Uart_EDMATx(rxbuffer,
RXBUF_LEN,
UART_DMA_Tx_CHANNEL_NUM,
UART_DMA_Tx_L_CHANNEL_NUM);
//------------------------------------------
//UARTB
UartB_Dma_Wait(UARTB_DMA_Tx_CHANNEL_NUM);
EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, UARTB_DMA_Tx_CHANNEL_NUM);
//------------------------------------------
//UARTA
Uart_Dma_Wait(UART_DMA_Tx_CHANNEL_NUM);
EDMA3ClrIntr(SOC_EDMA30CC_0_REGS, UART_DMA_Tx_CHANNEL_NUM);
}
}
the function Uart_EDMARx/Uart_EDMATx UartB_EDMARx/UartB_EDMATx trigger the dma to receive/transmit the character from/to uart0 and uart2 by edma uart0/2 event;
the function Uart_Dma_Wait/UartB_Dma_Wait will check the EDMA_IPR REG for dma complete(dma interrupt closed).
when run this code,the loop works once,the second time the dma for uart2 will receive the character but can not transmit the character(the IPR-bit for UARTB_DMA_Tx_CHANNEL_NUM always 0).
when I do the 'keyboard echo',only uart0 or uart2 the loop works well;
when I do the 'keyboard echo',uart0 receive and then uart2 echo the loop works well;
when I do the 'keyboard echo',uart0 and uart2 trigger and wait sequentially the loop works well;
However when trigger the uart0 uart2 and dma simultaneous the uart2 tx-dma cannot be completed.
can anybody give some suggestion.