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.