LPC1114 - What is my problem with UART....?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LPC1114 - What is my problem with UART....?

954 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by tyassin on Wed Apr 24 02:44:34 MST 2013
Hello,

I have attached my complete code for the LPC1114. I use the LPCXpresso board.
What I want to achieve is to send out data on the UART port, no interrupt or anything should be used. I have tried to find/read several examples but can simply not get the UART to do anything. The voltage on the TXD pin is 3.3V and that is it:-(
If somebody could see what could be going wrong here. I simply just want som reaction on the UART port.

Thank you.

#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include <cr_section_macros.h>
#include <NXP/crp.h>

__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

#define SYSTEM_CLOCK_IN_MHZ 36                    //main clock in MHz.
#define FALSE 0

#define LSR_THRE 0x20
#define LSR_TEMT 0x40
#define LSR_RDR 0x01
#define TEMT (1<<6)
#define LINE_FEED 0xA
#define CARRIAGE_RET 0xD

void setup_power(void)
{
    LPC_SYSCON->PDRUNCFG = 0b1110110101000011;        //Power-up:        Flash
                                                     //                BOD
                                                    //                ADC
                                                    //                System oscillator
                                                    //                System PLL
                                                    //Power down:    RC oscillator
                                                    //                RC oscillator output
                                                    //                Watchdog oscillator
}


void setup_clocks(void)
{
    LPC_SYSCON->SYSAHBCLKDIV = 0b1;                        //System clock divide to the peripherals (timers etc.) => System clock = main system clock.
    LPC_SYSCON->SYSAHBCLKCTRL = 0b00010011111011111;    //enable clock to:     ROM
                                                        //                    RAM
                                                        //                    Flash register interface
                                                        //                    Flash array access
                                                        //                    GPIO
                                                        //                    16-bit timer 0
                                                        //                    16-bit timer 1
                                                        //                    32-bit timer 0
                                                        //                    32-bit timer 1
                                                        //                    ADC
                                                        //                    I/O configuration block
                                                        //Disable clock to:    I2C
                                                        //                    SPI0
                                                        //                    UART
                                                        //                    WDT
                                                        //                    CAN
                                                        //                    SPI1
}

void setup_main_clock(void)
{
    //set up for 12MHz Crystal (XTAL) and PLL for 24MHz, 36MHz or 48MHz system clock:
    LPC_SYSCON->MAINCLKSEL = 0b0;                    //select main system clock = IRC output for not to remove system clock from system:
    LPC_SYSCON->MAINCLKUEN = 0b0;                    //
    LPC_SYSCON->MAINCLKUEN = 0b1;                    //
    while((LPC_SYSCON->MAINCLKUEN & 0b1) == FALSE); //wait until updated.
    LPC_SYSCON->PDRUNCFG |= 1 << 7;                 //power-down SYSPLL.

#if SYSTEM_CLOCK_IN_MHZ == 24
    LPC_SYSCON->SYSPLLCTRL = 0b1000001;                //Set PLL to Fout = 24MHz.
#elif SYSTEM_CLOCK_IN_MHZ == 36
    LPC_SYSCON->SYSPLLCTRL = 0b1000010;                //Set PLL to Fout = 36MHz.
#else                                                //SYSTEM_CLOCK_IN_MHZ = 48:
    LPC_SYSCON->SYSPLLCTRL = 0b11;                    //Set PLL to Fout = 48MHz.
#endif

    LPC_SYSCON->SYSPLLCLKSEL = 0b1;                    //select 12MHz crystal (XTAL) for the PLL input:
    LPC_SYSCON->SYSPLLCLKUEN = 0b0;                    //
    LPC_SYSCON->SYSPLLCLKUEN = 0b1;                    //
    while((LPC_SYSCON->SYSPLLCLKUEN & 0b1) == FALSE); //wait until updated.
    LPC_SYSCON->PDRUNCFG &= ~(1 << 7);              //power-up SYSPLL.
    while((LPC_SYSCON->SYSPLLSTAT & 0b1) == FALSE);    //wait for PLL to lock on system (XTAL) oscillator.
    LPC_SYSCON->MAINCLKSEL = 0b11;                    //select main system clock = PLL output:
    LPC_SYSCON->MAINCLKUEN = 0b0;                    //
    LPC_SYSCON->MAINCLKUEN = 0b1;                    //
    while((LPC_SYSCON->MAINCLKUEN & 0b1) == FALSE); //wait until updated.

#if DEBUG_MODE
    LPC_SYSCON->CLKOUTDIV = 0b11000;                //enable CLKOUT output and divide selected clock with 24.
    LPC_SYSCON->CLKOUTCLKSEL = 0b10;                //WDT clock to CLKOUT.
    LPC_SYSCON->CLKOUTUEN = 0b0;
    LPC_SYSCON->CLKOUTUEN = 0b1;
#endif
}

void us_delay(uint32_t usec)
    {
        if(usec < 3)
            LPC_TMR32B0->MR0 = SYSTEM_CLOCK_IN_MHZ;
        else
            LPC_TMR32B0->MR0 = (usec * SYSTEM_CLOCK_IN_MHZ) - ((SYSTEM_CLOCK_IN_MHZ * 17)/10);

        LPC_TMR32B0->TCR = 0b1;                    //start timer32-0.

        while(LPC_TMR32B0->TCR & 0b1);            //wait for time to expire.
        LPC_TMR32B0->TCR = 0b10;                //clear (TC) timer32-0.
    }

void UART_Init(unsigned int baudrate)
{
    unsigned int regVal;
    unsigned int Fdiv;

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); /* Enable IOCON block */
    LPC_IOCON->PIO1_6 &= ~0x07;    //Clear the first 3 bits in the FUNC of the 'PIO1_6'
    LPC_IOCON->PIO1_6 |= 0x01;     //Set PIO1_6 as UART RXD
    LPC_IOCON->PIO1_7 &= ~0x07;       //Clear the first 3 bits in the FUNC of the 'PIO1_7'
    LPC_IOCON->PIO1_7 |= 0x01;     //Set PIO1_7 as UART TXD
    /*Enable UART Clock*/
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);    //Enable UART clock
    LPC_SYSCON->UARTCLKDIV = 0x01;    //Divide by 1

    LPC_UART->LCR = 0x83;           //8 bits, no parity, 1 stop bit, DLAB(divisor latch access bit) = 1
    regVal = LPC_SYSCON->UARTCLKDIV;
    Fdiv = (((SystemCoreClock)/regVal)/16)/baudrate ;    /*baud rate */

    LPC_UART->DLM = Fdiv / 256;
    LPC_UART->DLL = Fdiv % 256;
    LPC_UART->LCR = 0x03;        /* Diable latch access bit DLAB = 0 */ //Skal være 0 for at kunne skrive til THR
    LPC_UART->FCR = 0x07;        /* Enable and reset TX and RX FIFO. */

    /* Read to clear the line status. */
    regVal = LPC_UART->LSR;

    /* Ensure a clean start, no data in either TX or RX FIFO. */
    while (( LPC_UART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );
    while ( LPC_UART->LSR & LSR_RDR )
    {
        regVal = LPC_UART->RBR;    /* Dump data from RX FIFO */
    }
}

void UARTSend(uint8_t *BufferPtr, uint32_t Length)
{
      //while ( !(LPC_USART->LSR & LSR_TEMT) );
      while ( Length != 0 )
      {
          while ( !(LPC_UART->LSR & LSR_THRE) );
          LPC_UART->THR = *BufferPtr;
          BufferPtr++;
          Length--;

      }
      return;
}

int main(void) {
unsigned char buff[4] = {0x30,0x31,0x32,0x33};
//LPC_GPIO3->DIR = 4;
//LPC_GPIO3->DATA = 4;

    UART_Init(9600);
    setup_main_clock();
    setup_power();
    setup_clocks();
    setup_timers();

    while(1)
    {
       while ( !(LPC_UART->LSR & LSR_THRE) );
       LPC_UART->THR = 'A';
    }


    return 0 ;
}
2 Replies

708 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by tyassin on Wed Apr 24 03:04:05 MST 2013
Hello,

Yes you are right:-)
Changed the code so the 12th bit is enabled in SYSAHBCLKCTRL under Setup_Clocks().

It works.
Thank you so much....:-)
0 Kudos

708 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by R2D2 on Wed Apr 24 02:53:44 MST 2013

Quote: tyassin
If somebody could see what could be going wrong here.



 [COLOR=Red]UART_Init(9600);[/COLOR]
 setup_main_clock();
 setup_power();
[COLOR=Red] setup_clocks();[/COLOR]
 setup_timers();
Debug your SYSAHBCLKCTRL. You are setting UART bit in UART_init() and cleaning it in setup_clocks()