| 
 
| <br />以下是我编的一个自发自收的程序,想让它接收的时候按中断子程序里面的B口亮,但是当程序运行到CAN-init这个字程序的时候就全部亮了,请问是什么原因,谢谢高手的解答。 <br />#include <hidef.h>      /* common defines and macros */<br />#include <mc9s12dp256.h>     /* derivative information */<br />#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"<br />  void delay() {<br />  long j=60000;<br />  while(j--);<br />  j=60000;<br />  while(j--);<br />  j=60000;<br />  while(j--);<br />  j=60000;<br />  while(j--);//延时子程序<br />  }<br />  <br />  void CAN_init()//CAN的初始化程序用CAN4发送用CAN0接受<br />  {<br />      CAN0CTL0_INITRQ=1;//MSCAN进入初始化模式 ,并置位INITAK<br />      CAN4CTL0_INITRQ=1;<br />      while(CAN0CTL1_INITAK==0&&CAN4CTL1_INITAK==0);//判断是不是进入初始化了,INITAK置位就表明进入初始化<br />      CAN0IDAC=0X02;//标示符接受模式为8个8位接受过滤器<br />      CAN4IDAC=0X02;<br />      CAN0IDMR0=0XFF;<br />      CAN4IDMR0=0XFF;//标示符屏蔽寄存器,忽略标示符接受寄存器的所有位<br />      CAN0IDMR1=0XFF;<br />      CAN4IDMR1=0XFF;<br />      CAN0BTR0=0X40;//同步跳转宽度为两个时钟周期,波特率预分频系数为1<br />      CAN4BTR0=0X40;<br />      CAN0BTR1=0X3F;//每位采样一次,设置time segment2为4个时钟周期segment1为16个时钟周期<br />      CAN4BTR1=0X3F;<br />      CAN0CTL1=0X80;//使能MSCAN<br />      CAN4CTL1=0X80;<br />      CAN0CTL0_INITRQ=0;//重新启动MSCAN,并与CAN总线同步<br />      CAN4CTL0_INITRQ=0;<br />      <br />      while((CAN0CTL1_INITAK==1)&&(CAN4CTL1_INITAK==1));//初始化完成等待应答信号<br />     //CAN0RIER_RXFIE=1;//接收器满中断使能 ,在数据发送前设置接受方式<br />  }<br />  <br />  void CAN4_TX()//发送子程序<br />  {<br />    uchar i;<br />    CAN4CTL0_TIME=1;<br />    CAN0RIER_RXFIE=1;//接收器满中断使能 ,在数据发送前设置接受方式<br />    i=CAN4T**;//当报文发送成功后,MSCAN将该位置1,当发送缓冲区有报文发送时,cpu必须将其置1<br />    CAN4TBSEL=i;//相应缓冲区选择寄存器<br />    i=CAN4TBSEL;<br />    CAN4TXIDR1=0X01;//设置为标准帧数据帧<br />    CAN4TXIDR2=0X00;//标示符寄存器<br />    CAN4TXDSR0=0X01;//以下是数据段寄存器<br />    CAN4TXDSR1=0X02;<br />    CAN4TXDSR2=0X03;<br />    CAN4TXDSR3=0X04;<br />    CAN4TXDSR4=0X05;<br />    CAN4TXDSR5=0X06;<br />    CAN4TXDSR6=0X07;<br />    CAN4TXDSR7=0X08;<br />    CAN4TXDLR=0X08;//数据段长度寄存器设置数据段长度为8<br />    CAN4T**=i;<br />  }<br />  <br />  void SET_PLL(void)   //busCLK=20M<br />{<br />  REFDV=0x03;          // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)锁相环用来提高总线频率<br />  SYNR=0x01;          //        =2*16M*5/4=40M<br />  asm{<br />    BRCLR CRG**,#$08,*<br />    BSET CLKSEL,#$80<br />    }               <br />} <br />void main(void) {<br />  /* put your own code here */<br />  SET_PLL();//锁相环设置<br />  EnableInterrupts;<br />  DDRB=0XFF;<br />  CAN_init();<br />  CAN4_TX();<br />  for(;;) {} /* wait forever这里不用分号 */<br />  /* please make sure that you never leave this function */<br />}<br /><br />void interrupt 38 CAN0_RX(void)//中断子程序,可以看做CAN0的接受函数<br />{<br />    CAN0CTL0_RXFRM=1;//成功接收后该位置位,写1清0<br />    //把数据寄存器里面的数据给B口<br />    PORTB=CAN0RXDSR0;<br />    delay();<br />    PORTB=CAN0RXDSR1;<br />    delay();<br />    PORTB=CAN0RXDSR2;<br />    delay();<br />    PORTB=CAN0RXDSR3;<br />    delay();<br />    PORTB=CAN0RXDSR4;<br />    delay();<br />    PORTB=CAN0RXDSR5;<br />    delay();<br />    PORTB=CAN0RXDSR6;<br />    delay();<br />    PORTB=CAN0RXDSR7;<br />    CAN0R**=0X01;//接受器满标志位<br />} | 
 |