This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

LPC1788 uart3 - rx gets framing errors ...

Hello, I'm trying to get my 1788's uart (uart3) working. I have initialized the uart correctly (or so I think).
cclk = 12MHz
pclk = cclk / 4

snippet of my uart setup code:

    LPC_SC->PCONP |= (0x01 << 25); // Enable PCUART3

    LPC_IOCON->P0_0 = 0x02; // 0b00010 => Setup as UART3 TXD, no pulldown or pull up.
    LPC_IOCON->P0_1 = 0x02; // 0b00010 => Setup as UART3 RXD, no pulldown or pull up.

    // Set DLAB=1 so we can set the baud rates for uart 3.
    LPC_UART3->LCR = (0x01 << 7);

    // input clk = 120MHz
    // pclk = in_clk / 2 = 60MHz
    // Baud = 31250 bits per sec
    // Divider = (pclk / (16.0 * baud))
    //         = 120 = 0x0078
    LPC_UART3->DLM = 0x00; // MSB = 0x00
    LPC_UART3->DLL = 0x06; // LSB = 0x78;

    LPC_UART3->FDR = 0x10;  // diavdd = 0, mulval = 1

    // Set up Rx and Tx FIFO.
    LPC_UART3->FCR = 0x07 ; // 0b0000_0111

    // Set DLAB=0 since we plan on using interrupts.
    // Set UART3 for 8 bit data, 1 stop bit, no parity bit.
    LPC_UART3->LCR = 0x03;

    // Interrupt handler.
    NVIC_EnableIRQ(UART3_IRQn);

    // Disable Transmit.
    LPC_UART3->TER = 0x0;

    // Interrupt setup.
    LPC_UART3->IER = 0x01; // 0b0001 Onl

My interrupt handler does:

  const uint32_t iir = LPC_UART3->IIR;
  const uint32_t type = (iir & 0x0f) >> 1;
  if (iir & 0x01) {
    return;  // We apparently have nothing here.
  }
  if (type == IIR_RDA) {
    const uint32_t lsr = LPC_UART3->LSR;  // *** Often indicates a framing error ?!?!
    // Read data availabe.
    {
      const uint8_t ch = (LPC_UART3->RBR & 0xFF);
      HandleRead(ch);
    }
  } else if (type == IIR_RLS) {
   ...
  }

I'm testing my code by using a standard message generator which sends messages that I can control.
The bytes that I receive in the interrupt handler seem firstly _bad_ (or wrong) and I see a framing error.
I've checked and double checked the baud/clks/dividers/parity/stop bits etc.
I can't see what I'm doing wrong.
Perhaps someone here can point out what I'm missing ...

Been stuck on this for a while now :(

Thanks.