搜索
bottom↓
回复: 2

请教:AT90CAN128为什么不进入接收MOB中断呢?【恢复】

[复制链接]

出0入0汤圆

发表于 2008-12-6 11:30:05 | 显示全部楼层 |阅读模式
1、晶振是内部4M,波特率=125K,选择8TQ,3,2,2,1,

2、MOB0=接收指令,MOB1=发送指令

3、先不管上层协议,将标识码寄存器和标识码屏蔽寄存器全部设置=0

   只要调试通过两个结点之间能够进入接收中断即可。





void CAN_Init(void)

{

      CANGCON |= (1<<SWRES);               //        CAN控制器软复位 

///////////////////////////////////////////////////////////////////////////////////////

//4M,125K,8TQ,3,2,2,1,参见数据手册   

///////////////////////////////////////////////////////////////////////////////////////

      CANBT1 = 0x06;                                        // 晶振=4M,波特率=125K

      CANBT2 = 0x04;                                        //

      CANBT3 = 0x13;                                        //        

      CANTCON = 0xff; 

//-------------------------------------------------------------------

//MOB0=接收上位机发来的指令

//-------------------------------------------------------------------

  CANPAGE  = 0x00;                                                              //MOB0,自动增量,初值为0 

  CANSTMOB = 0; 

  CANCDMOB = 0x08;   //CAN2.0A,DLC=8 

  CANIDT4 = 0x00;    // 标识码寄存器

  CANIDT3 = 0x00;

  CANIDT2 = 0x00; 

  CANIDT1 = 0x00; 

          

  CANIDM4  = 0x00;                                                              

  CANIDM3  = 0x00;                                                              

  CANIDM2  = 0x00;                                                              

  CANIDM1  = 0x00;  //屏蔽寄存器  



//-------------------------------------------------------------------

//MOB1=发送指令

//-------------------------------------------------------------------

  CANPAGE  = (1 << 4);                                                          //MOB0,自动增量,初值为0 

  CANSTMOB = (1<<TXOK); 

  CANCDMOB = 0x08;            // CAN2.0A DLC=8 

  CANIDT4 = 0x00;    // 标识码寄存器

  CANIDT3 = 0x00;

  CANIDT2 = 0x00; 

  CANIDT1 = 0x00; 

          

  CANIDM4  = 0x00;                                                              

  CANIDM3  = 0x00;                                                              

  CANIDM2  = 0x00;                                                              

  CANIDM1  = 0x00;  //屏蔽寄存器  



  CANGIE |= ((1<<ENIT) + (1<<ENRX));    //        开放CAN全局中断,允许接收中断  

  CANIE2 |= 0x01;                       //开MOB0信箱接收中断(接收邮箱) 

  CANPAGE  = 0x00; 

  CANCDMOB |= 0x80;                     //MOB0接收使能 

  CANGCON |= 0x02;                      //CAN控制器启动 

}





//////////////////////////////////////////////

//MOB1=发送邮箱

//////////////////////////////////////////////

void CAN_Send(void)

{

  uint8 i;



    CANGIE &= ~(1<<ENRX);        

    CANPAGE = (1 << 4)             //        设置发送MOB为MOB1

   if (CANSTMOB & (1<<TXOK))

   {

           CANSTMOB &= ~(1<<TXOK);

        for (i = 0 ; i < 8 ; i++)

            CANMSG = i;

        CANCDMOB = 0x48;        //        MOB发送使能(bit7:bit6=01),DLC=8

   }

   CANGIE |= (1 << ENRX);        //        接收中断允许

}





//////////////////////////////////////////////

//MOB0=接收邮箱

//////////////////////////////////////////////

#pragma interrupt_handler AT90CAN128_ISR:iv_CANIT

void AT90CAN128_ISR(void)

{

    uint8 i,flag;



    CANGIE &= ~(1<<ENRX);                                  //关接收中断                

    flag = CANSIT2;

/////////////////////////////////////////

//MOb0 interrupt.

/////////////////////////////////////////        

   if (flag & 0x01)        

   {

        CANPAGE = 0x00;                 //选择MOB0

        for (i = 0 ; i < 8 ; i++)

            rece_Buf = CANMSG;        //读取邮箱数据        

}

  CANPAGE = 0x00; 

   CANSTMOB &= ~(1<<RXOK);                //清中断标志

   CANCDMOB = 0x88;                      //接收使能 ,CAN2.0A,DLC=8

   CANGIE |= (1<<ENRX);                   //开接收中断         

}





void main(void)

{

        CLI();

        PORT_Init();

        TIMER0_Init();         

        TIMER2_Init();         

        TJA1040_ENABLE();

        CAN_Init();

        Watchdog_Init();

        SEI();

        while (1)

        {

              TJA1040_ENABLE();//周立功TJA1040收发器

              CAN_Send();

              WDR();

        }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-12-8 11:25:56 | 显示全部楼层
随便看看

出0入0汤圆

 楼主| 发表于 2008-12-6 11:34:10 | 显示全部楼层
发错位置了,呵呵。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表