[PIC18F2580] Question about CAN registers settings

Find out how to setup your programmer's software and how to solve many common problems.

Moderator: phalanx

Post Reply
flukeco
Posts: 3
Joined: Fri Apr 25, 2014 4:54 am

[PIC18F2580] Question about CAN registers settings

Post by flukeco » Fri May 23, 2014 2:21 am

Hi all,

Now I'm trying to implement CAN bus monitor. My goal is to receive all packets from all nodes.
I did researches from PIC18F2580 datasheet and some CAN related tutorial, but still not sure if I understand it correctly or not.
I don't have actual CAN bus to test my code right now. I'll probably get it next week, but I want to prepare my code before I can get my hands on it.

I want to only receive packets from CAN bus, so I use "Listen Only" mode. And since I need to receive all packets (both standard and extended ID), I disable all masks and filters. Could you please tell me if you spot anything wrong with my code?

Also I'm pretty sure that the code could be made shorter, but I'm strictly following from what I understand by reading the datasheet.

Your suggestions will be highly appreciated.

My CAN module initialize function looks like this:

Code: Select all

void CAN_init(void) {
    TRISB = 0x08;       /* CANRX(RB3) is input, CANTX(RB2) is output*/

    CANCON = 0x80;      /* Request configuration mode (CANCON<7:5> = 0b1xx) */
    /* Wait until op mode is configuration mode (CANSTAT<2:0> = 0b100) */
    while(CANSTAT&0x04 != 0x04);

    /* Use enhanced legacy mode (ECANCON<7:6> = 0b01) */
    ECANCON = 0x40;

    /* Set up baud rate registers */
    /*  500 Kbps @ 40MHz */
    BRGCON1 = 0x41;         /* SWJ = 2TQ BPS = 1 */
    BRGCON2 = 0xBA;         /* SEG2PHTS = 1, sampled once,  PS1 = 8TQ,  PropagationT  = 3TQ */
    BRGCON3 = 0x07;         /* Wake-up disabled, PS2 = 8Tq

    /* Set up filter and mask registers */
    /* B0 is a receive buffer AND B2,B3,B4,B5 are Transmit buffers */
    BSEL0 = 0xF8;   /* 1111 10-- */

    /* Initialize Receive Masks */
    /* Accept all SIDs and EIDs */
    RXM0EIDH = 0xFF;
    RXM0EIDL = 0xFF;
    RXM0SIDH = 0xFF;
    RXM0SIDL = 0xE0;
    RXM1EIDH = 0xFF;
    RXM1EIDL = 0xFF;
    RXM1SIDH = 0xFF;
    RXM1SIDL = 0xE0;

    /* Disable all filters */
    RXFCON0 = 0x00;
    RXFCON1 = 0x00;

    /* No Filters assigned to Masks */
    MSEL0 = 0xFF;     /* Filters 0-2, no mask */
    MSEL1 = 0xFF;     /* Filters 4-7, no mask */
    MSEL2 = 0xFF;     /* Filters 8-11, no mask */
    MSEL3 = 0xFF;     /* Filters 12-15, no mask */

     /* Assign all buffers with no filter */
    RXFBCON0 = 0xFF;
    RXFBCON1 = 0xFF;
    RXFBCON2 = 0xFF;
    RXFBCON3 = 0xFF;
    RXFBCON4 = 0xFF;
    RXFBCON5 = 0xFF;
    RXFBCON6 = 0xFF;
    RXFBCON7 = 0xFF;

    /* Initialize Receive Filters */
    RXF0EIDH = 0x00;
    RXF0EIDL = 0x00;
    RXF0SIDH = 0x00;
    RXF0SIDL = 0x00;
    RXF1EIDH = 0x00;
    RXF1EIDL = 0x00;
    RXF1SIDH = 0x00;
    RXF1SIDL = 0x00;
    RXF2EIDH = 0x00;
    RXF2EIDL = 0x00;
    RXF2SIDH = 0x00;
    RXF2SIDL = 0x00;

    CANCON = 0x60;      /* Request listen only mode (CANCON<7:5> = 0b011) */
    /* Wait until op mode is listen only mode (CANSTAT<2:0> = 0b011) */
    while(CANSTAT&0x03 != 0x03);

    /* Set Receive Mode for buffers */
    RXB0CON = 0x00;
    RXB1CON = 0x00;
}


Best Regards,
Pat

Post Reply