Hey everyone!
I have one problem. In my part of code below, I enable UART timeout interrupt, then get first byte, depending from that byte value, enable different size uDMA. Its like everything okey, but then I check uDMA buffer, alllways first byte incorrect. Maybe you have some ideas why?
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_uart.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/udma.h"
#define UART_RXBUF_SIZE 8
static uint8_t g_pui8RxPing[UART_RXBUF_SIZE];
volatile uint8_t cThisChar = 0;
volatile uint8_t rx_start = 0;
volatile uint8_t rx_address = 0;
#pragma DATA_ALIGN(ucControlTable, 1024)
uint8_t ucControlTable[1024];
// Library error routine
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif
// UART interrupt handler. Called on completion of uDMA transfer
void
UART1IntHandler(void)
{
uint32_t ui32Status;
ui32Status = ROM_UARTIntStatus(UART0_BASE, 1);
ROM_UARTIntClear(UART0_BASE, ui32Status);
cThisChar = ROM_UARTCharGet(UART0_BASE);
if(cThisChar == 0x55)
{
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,
(void *)(UART0_BASE + UART_O_DR),
g_pui8RxPing, sizeof(g_pui8RxPing));
ROM_uDMAChannelEnable(UDMA_CHANNEL_UART0RX);
}
}
void
InitUART0(void)
{
// Enable UART1 and make sure it can run while the CPU sleeps
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0);
// Configure and enable the UART with DMA
ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200,
UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);
ROM_UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8);
ROM_UARTEnable(UART0_BASE);
ROM_UARTDMAEnable(UART0_BASE, UART_DMA_RX | UART_DMA_TX);
ROM_IntEnable(INT_UART0);
ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);
ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
}
int
main(void)
{
ROM_FPULazyStackingEnable();
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
ROM_SysCtlPeripheralClockGating(true);
// GPIO setup for LEDs
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
// GPIO setup for UART
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// Enable uDMA
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_UDMA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
ROM_SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA);
ROM_uDMAEnable();
ROM_uDMAControlBaseSet(ucControlTable);
InitUART0();
while(1)
{
}
}
For example I write to launchpad TM4C123GXL: 0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08
In uDMA buffer I get: 0x04,0x02,0x03,0x04,0x05,0x06,0x07. So first bayte incorrect (always different lenght), and last one is out of buffer lenght..