打印

关于MSCAN的程序问题

[复制链接]
6690|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abfgrab|  楼主 | 2009-7-6 19:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

以下是我编的一个自发自收的程序,想让它接收的时候按中断子程序里面的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;//接受器满标志位
}

相关帖子

沙发
win2000_li| | 2009-7-8 08:36 | 只看该作者

有例程吗!~!

飞思卡尔提供相关的例程的,你可以参考看。

使用特权

评论回复
板凳
d865841995| | 2016-12-28 14:40 | 只看该作者
win2000_li 发表于 2009-7-8 08:36
飞思卡尔提供相关的例程的,你可以参考看。

相关哪里能找到?官网么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

7

帖子

0

粉丝