I configured UART0 for transmitting and receiving bytes frames from an external device with DMA
Then I configured also UART1 for transmitting and receiving bytes frames from a different external device
Both to 57600
Sometimes UART1 transmits a frame without some bytes. With UART0 stopped all bytes are always transmitted.
Every UART is configured in the same way....this is UARt1
#define DMA_UART1_RX (22) // RX
#define DMA_UART1_TX (23) // TX
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
GPIOPinConfigure(GPIO_PC4_U1RX);
GPIOPinConfigure(GPIO_PC5_U1TX);
GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5);
UARTConfigSetExpClk(UART1_BASE,SysCtlClockGet(),57600,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
UARTFIFOLevelSet(UART1_BASE,UART_FIFO_TX4_8, UART_FIFO_RX4_8);
UARTTxIntModeSet(UART1_BASE,UART_TXINT_MODE_EOT);
UARTEnable(UART1_BASE);
UARTDMAEnable(UART1_BASE,UART_DMA_RX | UART_DMA_TX);
uDMAChannelAssign(UDMA_CH22_UART1RX);
uDMAChannelAssign(UDMA_CH23_UART1TX);
IntPrioritySet(INT_UART1, INT_PRIORITY_LEVEL_5);
IntEnable(INT_UART1);
uDMAChannelAttributeDisable(EVO_DMA_UART1_RX, UDMA_ATTR_ALTSELECT |
UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK);
uDMAChannelControlSet (EVO_DMA_UART1_RX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_4);
start_RX();
uDMAChannelAttributeDisable(EVO_DMA_UART1_TX, UDMA_ATTR_ALTSELECT |
UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK);
uDMAChannelControlSet (EVO_DMA_UART1_TX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_4);
void IntHandler_UART1(void)
{
uint32_t ulStatus;
uint32_t ulMode;
ulStatus = UARTIntStatus(UART1_BASE,1);
UARTIntClear(UART1_BASE,ulStatus);
ulMode = uDMAChannelModeGet(DMA_UART1_RX | UDMA_PRI_SELECT);
if (ulMode == UDMA_MODE_STOP)
{
start_RX1();
}
else
;
if ((HWREG(UART1_BASE + UART_O_RIS) & UART_RIS_TXRIS) == UART_RIS_TXRIS)
{
uDMAChannelDisable(DMA_UART1_TX);
}
else
;
uDMAIntClear((1 << DMA_UART1_RX) | (1 << DMA_UART1_TX));
}
static void start_RX1(void)
{
uDMAChannelDisable(EVO_DMA_UART1_RX);
UDMA_MODE_BASIC,
(void*)(UART1_BASE + UART_O_DR),
rx1_bytes,
DIM_MAX_TXRX_BYTES);
uDMAChannelEnable(DMA_UART1_RX);
}
static void start_TX1(uint32_t dim)
{
uDMAChannelTransferSet(DMA_UART1_TX | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,
tx1_bytes,
(void*)(UART1_BASE + UART_O_DR),
dim);
uDMAChannelEnable(DMA_UART1_TX);
}