Hi Mark, thanks for the response. I hadn't wanted to spam the group with too much code in my first post, but here is the TX handler:
void UartTXIRQHandler(uint8 a_UartChannel)
{
volatile int readIdx = s_UartTXReadIdx[a_UartChannel];
volatile int writeIdx = s_UartTXWriteIdx[a_UartChannel];
if(readIdx == writeIdx) // all bytes are now done transmitting?
{
s_UartTXState[a_UartChannel] = UART_TXSTATE_IDLE;
UART_C2_REG( UART__base_ptr_tbl[a_UartChannel] ) &= ~(UART_C2_TCIE_MASK | UART_C2_TIE_MASK); // disable transmitter interrupts
return;
}
UART_MemMapPtr pUartbase = UART__base_ptr_tbl[a_UartChannel];
volatile uint8 *pSrc = s_UartTXBuffers[a_UartChannel];
uint8 freeSpace = s_FifoSize[a_UartChannel] - UART_TCFIFO_REG(pUartbase);
while(freeSpace != 0)
{
--freeSpace;
uint8 val = pSrc[readIdx++];
(void)UART_PDD_ReadInterruptStatusReg(pUartbase); // to ensure we clear the flags
UART_PDD_PutChar8(pUartbase, val); // Put an 8-bit character to the transmit register
readIdx &= UART_BUF_MASK; // account for wrap
if(readIdx == writeIdx) // all bytes are now done transmitting?
{
s_UartTXState[a_UartChannel] = UART_TXSTATE_IDLE;
UART_C2_REG(pUartbase) &= ~(UART_C2_TCIE_MASK | UART_C2_TIE_MASK); // disable transmitter interrupts
break;
}
}
s_UartTXReadIdx[a_UartChannel] = readIdx;
}
I have the receiver interrupt permanently enabled, and enable the transmitter interrupt when I have bytes to send in my local tx buffer.
Here's a portion of my setup code:
// disable transmitter and receiver (Transmitter MUST be disabled to write to the FIFO watermark register!!)
UART_C2_REG( UART__base_ptr_tbl[a_UartChannel] ) &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK );
// this chip appears to only have an 8 byte deep FIFO
UART_PDD_EnableFifo(UART__base_ptr_tbl[a_UartChannel], (UART_PDD_TX_FIFO_ENABLE | UART_PDD_RX_FIFO_ENABLE)); /* Enable RX and TX FIFO */
UART_RWFIFO_REG( UART__base_ptr_tbl[a_UartChannel] ) = UART_RWFIFO_RXWATER( 1 );
UART_TWFIFO_REG( UART__base_ptr_tbl[a_UartChannel] ) = UART_TWFIFO_TXWATER( 1 );
UART_PDD_FlushFifo(UART__base_ptr_tbl[a_UartChannel], (UART_PDD_TX_FIFO_FLUSH | UART_PDD_RX_FIFO_FLUSH)); /* Flush RX and TX FIFO */
// enable UART transmitter and receiver
UART_C2_REG( UART__base_ptr_tbl[a_UartChannel] ) |= (UART_C2_TE_MASK | UART_C2_RE_MASK );
// enable noise, parity, overruyn, framing error interrupts
UART_C3_REG( UART__base_ptr_tbl[a_UartChannel] ) |= (UART_C3_PEIE_MASK | UART_C3_FEIE_MASK | UART_C3_NEIE_MASK | UART_C3_ORIE_MASK);
UART_PDD_EnableInterrupt(UART__base_ptr_tbl[a_UartChannel], ( UART_PDD_INTERRUPT_RECEIVER )); // Enable RX interrupts
I'm using Kinetis Design Studio version 3.1.0 and have set the RXTX interrupt priority level for all the UARTs to "Maximal". I've also enabled error interrupt and it's also "Maximal".
The only other interrupt I have enabled is a timer interrupt at "Medium Priority"
Cheers,
Barry.