<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 />} |
|