关于MSCAN的程序问题

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

有例程吗!~!

飞思卡尔提供相关的例程的,你可以参考看。<br /><br />
d865841995 发表于 2016-12-28 14:40 | 显示全部楼层
win2000_li 发表于 2009-7-8 08:36
飞思卡尔提供相关的例程的,你可以参考看。

相关哪里能找到?官网么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部