ba_wang_mao 发表于 2008-12-6 11:30:05

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

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();

        }

}

getsoon2008 发表于 2008-12-8 11:25:56

随便看看

ba_wang_mao 发表于 2008-12-6 11:34:10

发错位置了,呵呵。
页: [1]
查看完整版本: 请教:AT90CAN128为什么不进入接收MOB中断呢?【恢复】