#include <hidef.h>
#include “derivative.h”
#include “can.h”
void init_can0(void)
{
if(CAN0CTL0_INITRQ0)
CAN0CTL0_INITRQ=1;
while(CAN0CTL1_INITAK0);
CAN0BTR0_SJW=1;
CAN0BTR0_BRP=7;
CAN0BTR1 = 0x1c;
//CAN0IDAR0=0xFF;
CAN0IDMR0=0xFF;
CAN0IDMR1=0xFF;
CAN0IDMR2=0xFF;
CAN0IDMR3=0xFF;
CAN0IDMR4=0xFF;
CAN0IDMR5=0xFF;
CAN0IDMR6=0xFF;
CAN0IDMR7=0xFF;
CAN0CTL1 = 0xC0;
CAN0CTL0 = 0x00;
//while(CAN0CTL0_INITRQ1);
while(CAN0CTL1_INITAK1);
while(CAN0CTL0_SYNCH==0);
CAN0RIER_RXFIE=1;
}
can_send(struct msg_a_s msg_a)
{ unsigned long sp;
if(msg_a.len>8)
return(0);
if(CAN0CTL0_SYNCH==0)
return(0);
do
{
CAN0TBSEL=CAN0TFLG;
}while(CAN0TBSEL0);
if(msg_a.RTR0)
{
if(msg_a.ide0)
{
CAN0TXIDR0=(unsigned long)msg_a.id>>3;
CAN0TXIDR1=(unsigned long)msg_a.id<<5;
}
else {
CAN0TXIDR0=(unsigned long)msg_a.id>>21;
CAN0TXIDR1=(unsigned long)(((unsigned long)msg_a.id>>15&0x07)|((unsigned long)msg_a.id>>13&0xE0)|0x18);
CAN0TXIDR2=(unsigned long)msg_a.id>>7;
CAN0TXIDR3=(unsigned long)msg_a.id<<1;
}
for(sp=0;sp<msg_a.len;sp++)
*(&CAN0TXDSR0+sp)=msg_a.data[sp];
}
else
{ if(msg_a.ide0)
{
CAN0TXIDR0=(unsigned long)msg_a.id>>3;
CAN0TXIDR1=(unsigned long)msg_a.id<<5|0x10;
} else
{
CAN0TXIDR0=(unsigned long)msg_a.id>>21;
CAN0TXIDR1=(unsigned long)(((unsigned long)msg_a.id>>15&0x07)|((unsigned long)msg_a.id>>13&0xE0)|0x18);
CAN0TXIDR2=(unsigned long)msg_a.id>>7;
CAN0TXIDR3=(unsigned long)msg_a.id<<1|0x01;
}
}
CAN0TXDLR=msg_a.len;
CAN0TXTBPR=msg_a.pro;
CAN0TFLG=1;
}
can_receive(struct msg_a_s *msg_a)
{ unsigned int sp1;
//if(CAN0RXDLR>8)
//return(0);
while(CAN0RFLG0);
msg_a->len=CAN0RXDLR;
if(msg_a->len>8)
return(0);
else {
msg_a->ide=CAN0RXIDR1_IDE;
if(msg_a->ide1) {
msg_a->id=(unsigned long)(CAN0RXIDR0<<21)|(unsigned long)((CAN0RXIDR1&0xE0)<<13)|
(unsigned long)((CAN0RXIDR1&0x07)<<15)|(unsigned long)(CAN0RXIDR2<<7)|(unsigned long)(CAN0RXIDR3>>1);
msg_a->RTR=(unsigned long)CAN0RXIDR3&0x01;
}
else
{
msg_a->id=(unsigned long)CAN0RXIDR1>>5|(unsigned long)CAN0RXIDR0<<3;
msg_a->RTR=((unsigned long)CAN0RXIDR1&0x10)>>4;
}
}
for(sp1=0;sp1<msg_a->len;sp1++)
msg_a->data[sp1]=*(&CAN0RXDSR0+sp1);
CAN0RFLG=1;
}
#ifndef CAN_H
#define CAN_H
struct msg_a_s
{
unsigned long id;
unsigned int ide;
unsigned int len;
unsigned int RTR;
unsigned int data[8];
unsigned int pro;
};
extern void init_can0(void);
extern can_receive(struct msg_a_s *msg_a);
extern can_send(struct msg_a_s msg_a);
#endif