
{
CAN0CTL0 = 0x01; /* Enter Initialization Mode */
while (! (CAN0CTL1&0x01));
// Set the baudrate 20Kbps
CAN0CTL1 = 0x84; //wake up enabled
CAN0BTR0= 0x4F; // SJW =1 .
CAN0BTR1= 0xDF; // Sample 3 times to ensure the correcty.
CAN0IDAC = 0x10;
CAN0IDAR0 = ACC_CODE_ID_JIAOXIANG_HIGH ;
CAN0IDMR0 = MASK_CODE_ST_ID_HIGH;
CAN0IDAR1 = ACC_CODE_ID_JIAOXIANG_LOW;
CAN0IDMR1 = MASK_CODE_ST_ID_LOW;
CAN0IDAC = 0x10;
CAN0IDAR2 = 0x00;
CAN0IDMR2 = MASK_CODE_ST_ID_HIGH;
CAN0IDAR3 = 0x00;
CAN0IDMR3 = MASK_CODE_ST_ID_LOW;
CAN0IDAR4 = 0x00;
CAN0IDMR4 = MASK_CODE_ST_ID_HIGH;
CAN0IDAR5 = 0x00;
CAN0IDMR5 = MASK_CODE_ST_ID_LOW;
CAN0IDAR6 = 0x00;
CAN0IDMR6 = MASK_CODE_ST_ID_HIGH;
CAN0IDAR7 = 0x00;
CAN0IDMR7 = MASK_CODE_ST_ID_LOW;
CAN0CTL0 = 0x00; /* Exit Initialization Mode Request */
while ((CAN0CTL1&0x01) != 0) ;
}
void interrupt CAN_RX_ISR(void)
{
uchar length, index;
uchar rxdata[8];
length = (CANRXDLR & 0x0F);
for (index=0; index CANRFLG = 0x01; /* Clear RXF */ } uchar CANSendFrame (unsigned long id, uchar priority, uchar length, uchar *txdata ) { uchar txbuffer; if (!CANTFLG) //Is Transmit Buffer full ? Full ( TXEx=0;) return ERR_BUFFER_FULL; CANTBSEL = CANTFLG; /* Select lowest empty buffer */ txbuffer = CANTBSEL; // Backup selected buffer /* Load Id to IDR Register */ *((unsigned long *) ((unsigned long)(&CANTXIDR0))) = id; // I appreciate this , easy and good. if(length>8) length=8; for ( index=0; index } CANTXDLR = length; /* Set Data Length Code */ CANTXTBPR = priority; /* Set Priority */ CANTFLG = txbuffer; /* Start transmission */ while ( (CANTFLG & txbuffer) != txbuffer); // Wait for Transmission completion PTM = 0xFF; }
