AnsweredAssumed Answered

About 9S12 CAN bus wake function

Question asked by jin cheng xie on Aug 4, 2016

When using chip is the MC9S12XE256, I met a problem.

As datasheet said:"The MSCAN can recover from stop or wait via the wake-up interrupt. This interrupt can only occur if the MSCAN was in sleep mode (SLPRQ = 1 and SLPAK = 1) before entering power down mode, the wakeup option is enabled (WUPE = 1), and the wake-up interrupt is enabled (WUPIE = 1)."   (P656 16.4.7.7)

But I configuration register,The code can not jump to VectorNumber_Vcan1wkup.in other words,System after entering the stop or wait mode,and To send data through the CAN analyzer, CAN't wake up.what's the problem?How to can bus into sleep or power down mode when no activity,and Can bus has activities when wake up again?Please provide code as much as possible.Thanks!

The key code as shown below. The code as shown in attachment.

 

Regards,

xjc

 

 

#include"mc9s12xet256.h"

#include  "mmi.h"

#include "dal_gpio.h"

#define SYNR_NUM             9                                    

#define REFDV_NUM            1                                     

#define  TEST_PIN            GPIOE, GPIO_Pin_4

#define  IO_GSM_POWER_EN       GPIOA, GPIO_Pin_5

#define  IO_GSM_POWER_KEY      GPIOA, GPIO_Pin_4

 

 

static void mmi_ppl_init(void)

{

    CLKSEL_PLLSEL = 0;

    PLLCTL_PLLON = 1;                                                                                                               

// f(vco) = 2 * f(osc) * (SYNR + 1) / (REFDV + 1) */

    SYNR = 0xC0 | SYNR_NUM;                                                  

    REFDV = 0x80 | REFDV_NUM;                                                

    POSTDIV = 0x00;

    _asm(nop);                                                               

    while (!CRGFLG_LOCK) {                                                   

        ;

    }

    CLKSEL_PLLSEL = 1;                                                       

}

 

 

static void mmi_CPU_Gotostop(void)

{

    __asm ANDCC #0x7F;

    CLKSEL_PLLSEL = 0;

    __asm STOP;

}

static void mmi_CPU_Gotowait(void)

{

    __asm WAI;

}

 

 

 

 

void main(void)

{

     mmi_ppl_init();

  

     CAN1TIER = 0x00;                                                        

     CAN1RIER = 0x01;                                                     

     CAN1RFLG_RXF = 1;                                                        

     CAN1CTL0_CSWAI = 0;                                                     

     CAN1CTL0_WUPE = 1;                                                       

     CAN1RIER_WUPIE=1;

     CAN1RFLG_WUPIF =1;

   

     EnableInterrupts;

   

     CreateOutputPort(TEST_PIN); 

     WriteOutputPort(TEST_PIN, true);

 

 

      _asm nop;

      _asm nop;

      _asm nop;

      _asm nop;

      _asm nop;

    

     CAN1CTL0_SLPRQ=1;

  // CAN1CTL1_SLPAK=0;

     while( !CAN1CTL1_SLPAK);

   

   //   mmi_CPU_Gotowait();

    mmi_CPU_Gotostop(); 

         

     while(1)

     {

         CAN1CTL0_SLPRQ=0;

      // CAN1CTL1_SLPAK=0;      

         WriteOutputPort(TEST_PIN, false);     

     }        

  

}

/*******************************************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED

static void interrupt  VectorNumber_Vcan1wkup  CAN1_Wkup_interrupt(void)

{

    CAN1RFLG_WUPIF =1;

}

#pragma CODE_SEG DEFAULT_ROM

/*******************************************************************/

 

 

#pragma CODE_SEG __NEAR_SEG NON_BANKED

static void interrupt VectorNumber_Vcan1rx CAN1_Rx_interrupt(void)

{

    CAN1RFLG = 0x01;                                                      

}

#pragma CODE_SEG DEFAULT_ROM

Original Attachment has been moved to: main[1].c.zip

Outcomes