AnsweredAssumed Answered

lpc824 uart RXRDY interrupt

Question asked by alvarasmikalainis on Jan 8, 2017
Latest reply on Jan 11, 2017 by alvarasmikalainis

Hello, I encountered a problem with RXRDY interrupt of uart in LPC824. I lost first bytes of packet sometimes.

One processor send packet of bytes (13 bytes) every 2 seconds. Another should receive that packet via interrupt. Receiver correctly accept in example 5 packets and the 6'th packets first two bytes was lost (interrupt not generated) and from third byte residual packet was received ok. Then again all ok wiht next packets, but after some time first bytes missing and so on.

Strange thing that if I use pooling method in main loop(if(( LPC_USART1->STAT & 0x01)==1)), then all bytes received correctly, none bytes are lost. So I think interrupt not always generated?

LPC824 main clock is 60mhz, systemcoreclock 30mhz., uart  baudrate 115200 (but with others baudrates situaciot the same).

uart configuration:

const uint32_t UARTCLKDIV=1;
/* Reset FRG */
LPC_SYSCON->PRESETCTRL &= ~ (1<<2);
LPC_SYSCON->PRESETCTRL |= (1<<2);

LPC_SYSCON->UARTCLKDIV=UARTCLKDIV;
LPC_SYSCON->UARTFRGDIV=0xFF;
clk = SystemCoreClock*2/UARTCLKDIV;

 

NVIC_DisableIRQ(UART1_IRQn);
//enable uart
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15);
//reset uart
LPC_SYSCON->PRESETCTRL&=~(1<<4);
LPC_SYSCON->PRESETCTRL|=(1<<4);
//enable pin switch
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);F

 

LPC_SWM->PINASSIGN1 = 0xFF1706FFUL;

 

LPC_USART1->CFG=0;
LPC_USART1->CFG |= (1 << 2);

 

LPC_USART1->BRG = clk / 16 / baudrate - 1;
LPC_SYSCON->UARTFRGMULT = (((clk / 16) * (LPC_SYSCON->UARTFRGDIV + 1)) /
(baudrate * (LPC_USART1->BRG + 1))) - (LPC_SYSCON->UARTFRGDIV + 1);

 

LPC_USART1->INTENSET = 1; // Enable UART interrupt rx
while ( LPC_USART1->STAT & 0x01)
regVal = LPC_USART1->RXDAT; // Dump data from RX FIFO

 

NVIC_SetPriority(UART1_IRQn,0);
NVIC_EnableIRQ(UART1_IRQn); 
LPC_USART1->CFG |= (1 << 0);

Outcomes