/**************************************************************************** * $Id:: uart.c 5751 2010-11-30 23:56:11Z usb00423 $ * Project: NXP LPC17xx UART example * * Description: * This file contains UART code example which include UART initialization, * UART interrupt handler, and APIs for UART access. * **************************************************************************** * Software that is described herein is for illustrative purposes only * which provides customers with programming information regarding the * products. This software is supplied "AS IS" without any warranties. * NXP Semiconductors assumes no responsibility or liability for the * use of the software, conveys no license or title under any patent, * copyright, or mask work right to the product. NXP Semiconductors * reserves the right to make changes in the software without * notification. NXP Semiconductors also make no representation or * warranty that such application will be suitable for the specified * use without further testing or modification. ****************************************************************************/ #include "uart.h" #include #include #define IER_RBR 0x01 #define IER_THRE 0x02 #define IER_RLS 0x04 #define IIR_PEND 0x01 #define IIR_RLS 0x03 #define IIR_RDA 0x02 #define IIR_CTI 0x06 #define IIR_THRE 0x01 #define LSR_RDR 0x01 #define LSR_OE 0x02 #define LSR_PE 0x04 #define LSR_FE 0x08 #define LSR_BI 0x10 #define LSR_THRE 0x20 #define LSR_TEMT 0x40 #define LSR_RXFE 0x80 #define BUFSIZE 0x40 #define TRUE 1 #define FALSE 0 volatile uint32_t UART0Status, UART1Status; volatile uint8_t UART0TxEmpty = 1, UART1TxEmpty = 1; /***************************************************************************** ** Function name: UARTInit ** ** Descriptions: Initialize UART port, setup pin select, ** clock, parity, stop bits, FIFO, etc. ** ** parameters: portNum(0 or 1) and UART baudrate ** Returned value: true or false, return false only if the ** interrupt handler can't be installed to the ** VIC table ** *****************************************************************************/ uint32_t uart_init( uint32_t PortNum, uint32_t baudrate ) { uint32_t Fdiv; uint32_t pclkdiv, pclk; SystemCoreClockUpdate(); uint32_t SystemFrequency = SystemCoreClock; if ( PortNum == 0 ) { LPC_PINCON->PINSEL0 &= ~0x000000F0; LPC_PINCON->PINSEL0 |= 0x00000050; /* RxD0 is P0.3 and TxD0 is P0.2 */ /* By default, the PCLKSELx value is zero, thus, the PCLK for all the peripherals is 1/4 of the SystemFrequency. */ /* Bit 6~7 is for UART0 */ pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 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_UART0->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ Fdiv = ( pclk / 16 ) / baudrate ; /*baud rate */ LPC_UART0->DLM = Fdiv / 256; LPC_UART0->DLL = Fdiv % 256; LPC_UART0->LCR = 0x03; /* DLAB = 0 */ LPC_UART0->FCR = 0b111; /* Enable and reset TX and RX FIFO. */ // NVIC_EnableIRQ(UART0_IRQn); //LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART0 interrupt */ return (TRUE); } else if ( PortNum == 1 ) { LPC_PINCON->PINSEL4 &= ~0x0000000F; LPC_PINCON->PINSEL4 |= 0x0000000A; /* Enable RxD1 P2.1, TxD1 P2.0 */ /* 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 ); } /***************************************************************************** ** Function name: UARTSend ** ** Descriptions: Send a block of data to the UART 0 port based ** on the data length ** ** parameters: portNum, buffer pointer, and data length ** Returned value: None ** *****************************************************************************/ void uart_send( uint32_t portNum, const char *BufferPtr, uint32_t Length ) { //unsigned int *U0LSR = (unsigned int *)0x4000C014; if(portNum == 0) { while(Length != 0) { /* THRE status, contain valid data */ //while ( !(UART0TxEmpty & 0x01) ); // while(((*U0LSR) & 0b100000) != 0); while((LPC_UART0->LSR & 0b100000) == 0); LPC_UART0->THR = *BufferPtr; UART0TxEmpty = 0; /* not empty in the THR until it shifts out */ BufferPtr++; Length--; } } else { while ( Length != 0 ) { /* THRE status, contain valid data */ while ( !(UART1TxEmpty & 0x01) ); LPC_UART1->THR = *BufferPtr; UART1TxEmpty = 0; /* not empty in the THR until it shifts out */ BufferPtr++; Length--; } } return; } void uart_receive(uint32_t portNum, char *BufferPtr, uint32_t Length) { if(portNum == 0) { while(Length != 0) { /* THRE status, contain valid data */ //while ( !(UART0TxEmpty & 0x01) ); // while(((*U0LSR) & 0b100000) != 0); while((LPC_UART0->LSR & 0b1) == 0); *BufferPtr = LPC_UART0->RBR; BufferPtr++; Length--; } } else { /* while ( Length != 0 ) { while ( !(UART1TxEmpty & 0x01) ); LPC_UART1->THR = *BufferPtr; UART1TxEmpty = 0; // not empty in the THR until it shifts out BufferPtr++; Length--; } */ } return; } /****************************************************************************** ** End Of File ******************************************************************************/