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

Need help with LPC1767 Uart RX interrupt

Good Afternoon to all, I'm working with ARM processor LPC1768 in a MCB1700 board, and in my project i need to use uart to communicate with a PLC modem. I'm using the code bellow to do this. If a try to communicate with a Hyperterminal or similar on windows, my interruption works fine, but if a try to communicate with the before mentioned PLC modem, a can't get any interrupts. I have probed the uart pins P2.0 and P2.1 and the PLC modem pins, and i can see that my TX messages arrive on the modem, and i can see that the modem answer those messages accordingly, and i can see that the uart RX pin receives those messages, but no interruption are toggled...

Can anyone help me with this issue? any suggestion to other uart implementation?

//---------------------------------------------------------------------------
#include <LPC17xx.h>
#include "Serial.h"
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Defines
//---------------------------------------------------------------------------
#define SW_FIFO_SIZE            512
#define RLS_INTERRUPT           0x03
#define RDA_INTERRUPT           0x02
#define CTI_INTERRUPT           0x06
#define THRE_INTERRUPT          0x01
#define LSR_RDR                 (1<<0)
#define LSR_OE                  (1<<1)
#define LSR_PE                  (1<<2)
#define LSR_FE                  (1<<3)
#define LSR_BI                  (1<<4)
#define LSR_THRE                (1<<5)
#define LSR_TEMT                (1<<6)
#define LSR_RXFE                (1<<7)
#define UART_DISABLED           0x00
#define UART_OPERATIONAL        0x01
#define UART_OVERFLOW           0x02
#define UART_PARITY_ERROR       0x03
#define UART_FRAMING_ERROR      0x04
#define UART_BREAK_DETECTED     0x05
#define UART_CHAR_TIMEOUT       0x06
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
BYTE  UART0_RxBuf[UART0_RX_BUFFER_SIZE];
BYTE  UART0_TxBuf[UART0_RX_BUFFER_SIZE];
BYTE  UART0_RxTail;
BYTE  UART0_RxHead;
BYTE uart0_tx_sts;
BYTE uart0_rx_sts;
uint32_t rdaInterrupts = 0;
uint32_t ctiInterrupts = 0;
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Controle
//---------------------------------------------------------------------------
void Serial0Init( unsigned int baudRate )
{
  int pclk, fdiv;

  LPC_SC->PCONP |= (1 << 3);
  LPC_PINCON->PINSEL0 |= (1 << 4);             /* Pin P0.2 used as TXD0 (Com0) */
  LPC_PINCON->PINSEL0 |= (1 << 6);             /* Pin P0.3 used as RXD0 (Com0) */

  LPC_SC->PCLKSEL0 &= ~(3 << 6); // clear bits
  LPC_SC->PCLKSEL0 |=  (1 << 6); // set to "01" (full speed)
  pclk = SystemCoreClock;

  LPC_UART0->LCR = 0x03;             /* 8 bits, no Parity, 1 Stop bit */
  LPC_UART0->LCR |= (1 << 7);
        /*
        fdiv = (pclk/(16*baudRate));
        LPC_UART0->DLM = (fdiv >> 8) & 0xFF;
        LPC_UART0->DLL = (fdiv) & 0xFF;
        */
  // baudrate of 38400 with a clock rate of 100 MHz
  LPC_UART0->DLM = 0;//Fdiv / 256;
  LPC_UART0->DLL = 108;//Fdiv % 256;
  LPC_UART0->FDR = 0x21;///

  LPC_UART0->LCR &= ~(1 << 7);
  LPC_UART0->FCR |= (0x0 << 6); //(0x3 = 14, 0x00 = 1)
  //LPC_UART0->FCR |= 0x01;
  //LPC_UART0->FCR |= 0x06;

  NVIC_EnableIRQ(UART0_IRQn);
  NVIC_SetPriority(UART0_IRQn,30);
  LPC_UART0->IER = 0x07; //Enable

  LPC_UART0->LCR    = 0x03;
}
//---------------------------------------------------------------------------
void UART0_IRQHandler(void) __irq
{
  BYTE intId, lsrReg;
  BYTE byData,bTmpTail;

  intId = ((LPC_UART0->IIR)>>1)& 0x7;
  if(intId == RLS_INTERRUPT) { //RLS
        lsrReg = LPC_UART0->LSR;
        if (lsrReg & LSR_OE)
                uart0_rx_sts = UART_OVERFLOW;
        else if (lsrReg & LSR_PE)
                uart0_rx_sts = UART_PARITY_ERROR;
        else if (lsrReg & LSR_FE)
                uart0_rx_sts = UART_FRAMING_ERROR;
        else if (lsrReg & LSR_BI)
                uart0_rx_sts = UART_BREAK_DETECTED;
  } else if (intId == RDA_INTERRUPT) {
    while((LPC_UART0->LSR) & 0x1) {
        UART0_RxBuf[UART0_RxHead] = LPC_UART0->RBR;
      UART0_RxHead += 1;
        if (UART0_RxHead == UART0_RX_BUFFER_SIZE)
        UART0_RxHead = 0;
    }
    rdaInterrupts++;
  } else if (intId == CTI_INTERRUPT) {
        while((LPC_UART0->LSR) & 0x1) {
        UART0_RxBuf[UART0_RxHead] = LPC_UART0->RBR;
      UART0_RxHead += 1;
        if (UART0_RxHead == UART0_RX_BUFFER_SIZE)
        UART0_RxHead = 0;
    }
    ctiInterrupts++;
  }
}
//---------------------------------------------------------------------------

Parents
  • If it works with Hyperterminal, and not with your Modem, perhaps you should be looking more closely at what exactly the modem is sending. ie What the signal is doing, not the software.

    Look at the baud rate (bit timing), framing (bits, parity, stop).

    If the USART isn't generating an interrupt, perhaps it isn't receiving valid data? Look at the status bits, etc.

Reply
  • If it works with Hyperterminal, and not with your Modem, perhaps you should be looking more closely at what exactly the modem is sending. ie What the signal is doing, not the software.

    Look at the baud rate (bit timing), framing (bits, parity, stop).

    If the USART isn't generating an interrupt, perhaps it isn't receiving valid data? Look at the status bits, etc.

Children