做一个CAN的接口板,用的是MC9S12C32单片机,下面是我写的程序,不知道对不对,但总是调不通。用DG128单片机作接受。CAN收发器用的是MAX3050。还有,datasheet上看,接收中断号为38,但总是进不去。
void can_init(void){ CANCTL0_INITRQ=1; // msCAN Initialization Mode while(!CANCTL1_INITAK); //1 = Initialization Mode Active MSCAN has entered Initialization Mode. CANCTL1_CANE=1; // CAN enable; CANIDAC=0x23; //8*8 filter; CANBTR1_TSEG_20 =5; /* Tseg2=6 */ CANBTR1_TSEG_10 =8; /* Tseg1=9 */ CANIDAR0=0x00; CANIDAR1=0x01; CANIDAR2=0x02; CANIDAR3=0x03; CANIDAR4=0x41; CANIDAR5=0x41; CANIDAR6=0x41; CANIDAR7=0x41; CANIDMR0=0xff; CANIDMR1=0xff; CANIDMR2=0xff; CANIDMR3=0xff; CANIDMR4=0xff; CANIDMR5=0xff; CANIDMR6=0xff; CANIDMR7=0xff; CANBTR0=0x63; //SJW1:SJW0=0:1;Synchronization jump width 2 Tq clock cycles CANBTR1=0x13; //SAMP=one time;time segment 2=2 Tq clock cycles CANCTL0_INITRQ=0; //INITRQ=0 while(CANCTL1_INITAK); // confirm that msCAN has quitted from initialization mode; //CANRIER=0x01; //CANTIER=0x07; //msCAN Interrupt Enable }
void can_transmission(void){ CANTBSEL=CANTFLG; CANTXIDR0=0x10; CANTXIDR1=0x11; CANTXDSR0=0x47; CANTXDSR1=0x47; CANTXDSR2=0x46; CANTXDSR3=0x45; CANTXDSR4=0x44; CANTXDSR5=0x43; CANTXDSR6=0x47; CANTXDSR7=0x48; CANTXDLR=8; // CANTXTBPR=0x00; //设置发送缓冲区优先级 CANTFLG=CANTBSEL; }
void main(void) { /* put your own code here */ can_init(); EnableInterrupts; for(;;) {can_transmission();} /* wait forever */ }
|