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