#include <p18cxxx.h>
#include <delays.h>
#pragma config FOSC=HS2 //20MHz
#pragma config PLLCFG=OFF
#pragma config FCMEN=OFF
#pragma config IESO=OFF
#pragma config PWRTEN=OFF
#pragma config BOREN=OFF
#pragma config BORV=3
#pragma config WDTEN=OFF
#pragma config WDTPS=32768
#pragma config MCLRE=OFF
#pragma config STVREN=ON
#pragma config XINST=OFF
#pragma config CP0=OFF
#pragma config CP1=OFF
#pragma config CPB=OFF
#pragma config CPD=OFF
#pragma config WRT0=OFF
#pragma config WRT1=OFF
#pragma config WRTC=OFF
#pragma config WRTB=OFF
#pragma config WRTD=OFF
#pragma config EBTR0=OFF
#pragma config EBTR1=OFF
//***********************************************************************
#pragma udata
char StdMsg[11]={0x11,0x00,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
#pragma code
void InitCAN(void);
char TxCan(char*);
void main(void)
{
    ANCON0=0;
    ANCON1=0;
    TRISC=0;

    InitCAN();
    while(1)
    {
        LATCbits.LATC4^=1;
        Delay10KTCYx(0);
        TxCan(StdMsg);
    }
}

//*************************************************************************
void InitCAN(void)
{
    TRISBbits.TRISB3=1;
    TRISBbits.TRISB2=0;
    CANCON=0x80;
    while ((CANSTAT & 0xE0) != 0x80);
    /*
    RXM0SIDH=0x00;
    RXM0SIDL=0x00;
    RXM1SIDH=0x00;
    RXM1SIDL=0x00;
    RXM0EIDH=0x00;
    RXM0EIDL=0x00;
    RXM1EIDH=0x00;
    RXM1EIDL=0x00;
    RXB0CONbits.RXM1=0;
    RXB0CONbits.RXM0=1;
    RXB0CONbits.RB0DBEN=0;
    */
    BRGCON1=0x01; //20MHz 500kbps
    BRGCON2=0xA0;
    BRGCON3=0x02;

    CIOCONbits.ENDRHI=1;
    CIOCONbits.CANCAP=0;
    CANCON=0b00000000;
    while ((CANSTAT & 0b11100000) != 0b00000000);
}

char TxCan(char* StdMsg)
{
    if(TXB0CONbits.TXREQ){
        return 1;
    }
    TXB0D1 =StdMsg[4];
    TXB0D2 =StdMsg[5];
    TXB0D3 =StdMsg[6];
    TXB0D4 =StdMsg[7];
    TXB0D5 =StdMsg[8];
    TXB0D6 =StdMsg[9];
    TXB0D7 =StdMsg[10];
    TXB0SIDH=StdMsg[0];
    TXB0SIDL=StdMsg[1];
    TXB0DLC =StdMsg[2];
    TXB0D0 =StdMsg[3];

    // TXB0CONbits.TXPRI0=0;
    //TXB0CONbits.TXPRI1=0;
    TXB0CONbits.TXREQ=1;
    return 0;
}