Other Parts Discussed in Thread: TM4C129XNCZAD
Hi,
I'm using TM4C129XNCZAD evaluation board and I'm having trouble getting the UART0 UDMA RX done to trigger.
Rx interrupts is received and I"m able to schedule the UART0 Rx task that configures and starts the uDMA read. The data is read from the UART FIFO but I fail to get the UDMA RX done trigger so I can process the received data.
I checked my code against the demo code and I'm not able to see a difference that could explain the problem.
Could you please take a look at the attached code (removed all non essential sections) and let me know what I'm doing wrong?
thanks.
//define the uDMA control table
#if defined(ewarm)
#pragma data_alignment=1024
unsigned char ucControlTable[1024];
#elif defined(ccs)
#pragma DATA_ALIGN(ucControlTable, 1024)
tDMAControlTable ucControlTable[1024];
#else
unsigned char ucControlTable[1024] __attribute__ ((aligned(1024)));
#endif
OS_TID gTaskUART0Tx_ID; //RS232 Tx Task ID
OS_TID gTaskUART0Rx_ID; //RS232 Rx Task ID
uint8_t rxBuffer[100]; //RS232 received data
uint8_t txBuffer[100]; //RS232 transmit data
/**************************************************************************
**************************************************************************/
__task void taskInit(void) {
gTaskUART0Tx_ID = os_tsk_create(taskUART0Tx, TASK_UART0_TX_PRIORITY);
gTaskUART0Rx_ID = os_tsk_create(taskUART0Rx, TASK_UART0_RX_PRIORITY);
os_tsk_delete_self();
}
/**************************************************************************
**************************************************************************/
__task void taskUART0Rx(void) {
for( ; ; ) {
//wait on the Rx event
eventStatus = os_evt_wait_or(TASK_EVENT_RX_FLAG, 0xFFFF);
transferSize = 100;
uDMAChannelTransferSet( UDMA_CHANNEL_UART0RX,
UDMA_MODE_BASIC,
(void *)(UART0_BASE + UART_O_DR),
(void *) rxBuffer,
transferSize);
uDMAChannelEnable(UDMA_CHANNEL_UART0RX);
}//forever loop
}
/**************************************************************************
**************************************************************************/
__task void taskUART0Tx(void) {
for( ; ; ) {
os_evt_wait_or(TASK_EVENT_TX_FLAG, 0xFFFF);
transferSize = 100;
uDMAChannelTransferSet( UDMA_CHANNEL_UART0TX,
UDMA_MODE_BASIC,
(void *)txBuffer,
(void *)(UART0_BASE + UART_O_DR),
transferSize);
uDMAChannelEnable(UDMA_CHANNEL_UART0TX);
}//forever loop
}
/**************************************************************************
**************************************************************************/
void SystemInit (void) {
SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ);
gSysCtlClock = SysCtlClockFreqSet(
SYSCTL_USE_PLL |
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_25MHZ |
SYSCTL_CFG_VCO_480,
120000000); //desired system frequency
}
/**************************************************************************
**************************************************************************/
void GPIO_Init(void) {
SysCtlPeripheralEnable(SYSCTL_PERIPH_EMAC0); //Ethernet
SysCtlPeripheralReset(SYSCTL_PERIPH_EMAC0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_EPHY0);
SysCtlPeripheralReset(SYSCTL_PERIPH_EPHY0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
SysCtlPeripheralReset(SYSCTL_PERIPH_UDMA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); //RS232
SysCtlPeripheralReset(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOA);
//configure UART pins for RS232
GPIOPinConfigure(GPIO_PA0_U0RX); //RS232 Com 0 Rx
GPIOPinConfigure(GPIO_PA1_U0TX); //RS232 Com 0 Tx
//for each function pin, select the type
GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0 | //RS232 Com0 Rx
GPIO_PIN_1); //RS232 Com0 Tx
}
/**************************************************************************
**************************************************************************/
void uDMA_Init(void) {
//set the control table
uDMAControlBaseSet(ucControlTable);
//enable uDMA
uDMAEnable();
//setup the uDMA interrupts
IntEnable(INT_UDMA | INT_UDMAERR);
}
/**************************************************************************
**************************************************************************/
void UART0_Init(void) {
UARTConfigSetExpClk(UART0_BASE,
gSysCtlClock,
UART0_BAUDRATE,
UART_CONFIG_WLEN_8 |
UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);
//configure the fifo's trigger level.
UARTFIFOEnable(UART0_BASE);
UARTFIFOLevelSet(UART0_BASE,
UART_FIFO_TX4_8, //4 words threshold
UART_FIFO_RX4_8); //4 words threshold
UARTDisableSIR(UART0_BASE);
UARTEnable(UART0_BASE);
UARTTxIntModeSet(UART0_BASE, UART_TXINT_MODE_EOT);
UARTIntEnable( UART0_BASE,
UART_INT_TX | //transmit done (flush the tx task)
UART_INT_RX | //Rx fifo level reached
UART_INT_OE | //overrun
UART_INT_BE | //break
UART_INT_PE | //parity
UART_INT_FE | //framing
UART_INT_RT); //receiver timeout
IntEnable(INT_UART0);
// Configure the uDMA for UART0 read and write
UARTDMAEnable(UART0_BASE, UART_DMA_RX | UART_DMA_TX);
uDMAChannelAssign(UDMA_CH8_UART0RX);
uDMAChannelAssign(UDMA_CH9_UART0TX);
uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX, UDMA_ATTR_ALL);
uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0TX, UDMA_ATTR_ALL);
// uDMAChannelAttributeEnable( UDMA_CHANNEL_UART0RX,
// UDMA_ATTR_USEBURST);
uDMAChannelAttributeEnable( UDMA_CHANNEL_UART0TX,
UDMA_ATTR_USEBURST);
uDMAChannelControlSet(UDMA_CHANNEL_UART0RX, //NBRFIFO
UDMA_SIZE_8 | //data size
UDMA_SRC_INC_NONE | //no source address increment
UDMA_DST_INC_8 | //destination address increment
UDMA_ARB_4); //arbitration size
uDMAChannelControlSet(UDMA_CHANNEL_UART0TX, //WFIFO
UDMA_SIZE_8 | //data size
UDMA_SRC_INC_8 | //source address increment
UDMA_DST_INC_NONE | //no destination address increment
UDMA_ARB_4); //arbitration size
}
/**************************************************************************
**************************************************************************/
void UART0_Handler(void) { // A 16x12 bit receive FIFO
uint32_t IntStatus; //ISR status
IntStatus = UARTIntStatus(UART0_BASE, true);
UARTIntClear(UART0_BASE, IntStatus);
//if its an Rx
if(IntStatus & UART_INT_RX) {
isr_evt_set(TASK_EVENT_RX_FLAG, gTaskUART0Rx_ID);
} //if its an Rx interrupt
//Check for Rx DMA done
if(uDMAChannelModeGet(UDMA_CHANNEL_UART0RX) == UDMA_MODE_STOP) {
// CODE TO PROCESS THE rxBuffer CONTENT
}
//Check for Tx DMA done
if( (IntStatus & UART_INT_TX) ||
(uDMAChannelModeGet(UDMA_CHANNEL_UART0TX) == UDMA_MODE_STOP)) {
//CODE TO CLEAR THE txBuffer
}
}
/**************************************************************************
**************************************************************************/
void main() {
SystemInit(); //system setup
GPIO_Init(); //setup GPIO
uDMA_Init(); //setup the uDMA
UART0_Init(); //setup RS232
os_sys_init(taskInit);
}
Khaled.