1
\$\begingroup\$

I'm trying to receive data to a PIC24FJ256DA210 from another device using UART communication.

I set up the UART as described below:

void InitUART(void)
{
    uint32_t baudRate = 312500;
    int brg = FCY/(16*baudRate)-1;

     /* Assign UART 1 signal onto pin 4 of PortF (RP10) using PPS */
    TRISFbits.TRISF4 = 1;
    __builtin_write_OSCCONL(OSCCON&0xbf); // clear bit to allow re-map
    RPINR18bits.U1RXR = 10; //Assign U1RX to RP10
    __builtin_write_OSCCONL(OSCCON | 0x40); // lock pin re-map

    CloseUART1(); //disable UART if enabled previously

    /*Enable UART interrupts*/
    IEC0bits.U1RXIE = 1; // interrupt on reception allowed
    IEC0bits.U1TXIE = 0; // no interrupt on transmition
    IEC4bits.U1ERIE = 1; // interrupts on errors allowed
    IPC2bits.U1RXIP = 5; // interrupt level of reception
    IPC16bits.U1ERIP = 6; // interrupt level on errors
    U1STAbits.URXISEL = 0; // interrupt when any character is received

    /* Initialize UART1 */
    U1BRG = brg;
    U1MODEbits.STSEL = 0; // 1 stop bit
    U1MODEbits.PDSEL = 0; //8 bit data, no parity
    U1MODEbits.BRGH = 0; //Standard speed mode
    U1MODEbits.RXINV = 0; //UxRX idle state is '1'
    U1MODEbits.ABAUD = 0; //Auto-Baud disabled
    U1MODEbits.LPBACK = 0; //Loopback disabled
    U1MODEbits.WAKE = 1; //Wake up on start bit detect
    U1MODEbits.UEN = 0; //UTx and URx enabled
    U1MODEbits.IREN = 0; //IrDA disabled
    U1STAbits.ADDEN = 0; //Adress detec mode disabled
    U1RX_Clear_Intr_Status_Bit; //clear RX interrupt falg
    U1MODEbits.UARTEN = 1; //UART enable
} 

My problem is that every time I launch debug (I'm working with MPLAB X IDE), the U1 RX Interrupt keeps getting triggered even though nothing is yet sent to the PIC.

Did I do something wrong while initializing UART? It migth be a silly mistake but I really can't figure it out.

Thank you.

\$\endgroup\$
1
\$\begingroup\$

That's normal behaviour. As soon as you enable the receive interrupt it will fire because the Overrun Error flag in the status register will be set.

You will need to clear this error flag in software before you get any more RX interrupts.

See the datasheet for details: http://ww1.microchip.com/downloads/en/DeviceDoc/39708a.pdf

\$\endgroup\$
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.