Hi, I'm interfacing a skynav skm53 GPS with an ARM cortex LPC1768 microcontroller on board MCB1700. Here's the small code snippet for initialization of UART and reading GPS data. I can see the characters coming in but I don't get them in desired sequence i.e NMEA format (starting $GPGGA).
Please let me know if there is anything wrong in my code.
uint32_t UARTInit( uint32_t PortNum, uint32_t baudrate ) { uint32_t Fdiv; uint32_t pclkdiv, pclk; LPC_PINCON->PINSEL4 &= ~0x0000000F; LPC_PINCON->PINSEL4 |= 0x0000000A; /* Enable RxD1 P2.1, TxD1 P2.0 */ if(PortNum == 1 ) /* By default, the PCLKSELx value is zero, thus, the PCLK for all the peripherals is 1/4 of the SystemFrequency. */ /* Bit 8,9 are for UART1 */ pclkdiv = (LPC_SC->PCLKSEL0 >> 8) & 0x03; switch ( pclkdiv ) { case 0x00: default: pclk = SystemFrequency/4; break; case 0x01: pclk = SystemFrequency; break; case 0x02: pclk = SystemFrequency/2; break; case 0x03: pclk = SystemFrequency/8; break; } LPC_UART1->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ Fdiv = ( pclk / 16 ) / baudrate ; /*baud rate */ LPC_UART1->DLM = Fdiv / 256; LPC_UART1->DLL = Fdiv % 256; LPC_UART1->LCR = 0x03; /* DLAB = 0 */ LPC_UART1->FCR = 0x07; /* Enable and reset TX and RX FIFO. */ NVIC_EnableIRQ(UART1_IRQn); LPC_UART1->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART1 interrupt */ return (TRUE); } return( FALSE );
main.c
int main (void){ /* SystemClockUpdate() updates the SystemFrequency variable */ SystemClockUpdate(); UARTInit(1, 9600); /* baud rate setting */ GLCD_Init(); /* Initialize graphical LCD */ GLCD_Clear(White); /* Clear graphical LCD display */ GLCD_SetBackColor(White); GLCD_SetTextColor(Blue); while (1) { for(UART1Count=0;UART1Count<200;UART1Count++) { if((LPC_UART1->RBR) != '\0') { UART1Buffer[UART1Count] = LPC_UART1->RBR ; // IRQ handler is not getting invoked, that's why tried to read characters from RBR // and found some characters too though not in NMEA format } } for(UART1Count=0;UART1Count<200;UART1Count++) { if(UART1Buffer[UART1Count] == '$') { UART1Count = UART1Count + 1; if(UART1Buffer[UART1Count] == 'G') { UART1Count = UART1Count + 1; if(UART1Buffer[UART1Count] == 'P') { UART1Count = UART1Count + 1; if(UART1Buffer[UART1Count] == 'G') { UART1Count = UART1Count + 1; if(UART1Buffer[UART1Count] == 'G') { UART1Count = UART1Count + 1; if(UART1Buffer[UART1Count] == 'A') { GLCD_DisplayString(Line2,"Hello World!"); // didn't reach here } else continue } else continue; } else continue; } else continue; } else continue; } } } }
IRQ_Handler (Not getting Invoked)
void UART1_IRQHandler (void) { uint8_t IIRValue, LSRValue; uint8_t Dummy = Dummy; IIRValue = LPC_UART1->IIR; IIRValue >>= 1; /* skip pending bit in IIR */ IIRValue &= 0x07; /* check bit 1~3, interrupt identification */ if ( IIRValue == IIR_RLS ) /* Receive Line Status */ { LSRValue = LPC_UART1->LSR; /* Receive Line Status */ if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) { /* There are errors or break interrupt */ /* Read LSR will clear the interrupt */ UART1Status = LSRValue; Dummy = LPC_UART1->RBR; /* Dummy read on RX to clear interrupt, then bail out */ return; } if ( LSRValue & LSR_RDR ) /* Receive Data Ready */ { /* If no error on RLS, normal ready, save into the data buffer. */ /* Note: read RBR will clear the interrupt */ UART1Buffer[UART1Count] = LPC_UART1->RBR; UART1Count++; if ( UART1Count == BUFSIZE ) { UART1Count = 0; /* buffer overflow */ } } } else if ( IIRValue == IIR_RDA ) /* Receive Data Available */ { /* Receive Data Available */ UART1Buffer[UART1Count] = LPC_UART1->RBR; UART1Count++; if ( UART1Count == BUFSIZE ) { UART1Count = 0; /* buffer overflow */ } } else if ( IIRValue == IIR_CTI ) /* Character timeout indicator */ { /* Character Time-out indicator */ UART1Status |= 0x100; /* Bit 9 as the CTI error */ } else if ( IIRValue == IIR_THRE ) /* THRE, transmit holding register empty */ { /* THRE interrupt */ LSRValue = LPC_UART1->LSR; /* Check status in the LSR to see if valid data in U0THR or not */ if ( LSRValue & LSR_THRE ) { UART1TxEmpty = 1; } else { UART1TxEmpty = 0; } } }
Please help.