This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F2812, ECAN receive interrupt issues

Hi,

I want to receive multip messages from a Master MCU by Ecan Interrupt.  Master MCU is sending the messsage periodly.

At the same time, I need to use CPUTIMER0.

I met some problem:

1, sometimes, I never get a recieve interrupt after I run the system. never even run into the ECAN0INTA_ISR(); although the Master MCU is keeping sending the messages.

2, when I turn on CPUTIMER0, and set the timer is 250us, ECAN will receive the message sometimes when start, but will never receive after few munites. If the timer0 is set to 25000us, it works much better.

I am not sure if InitECan() is correct or not?  anybody can check my code for me? maybe i missed something in my code.

Thank you very much!

 

void main(void)
{

   ...........

   InitCpuTimers();  
   // ConfigCpuTimer(&CpuTimer0, 150, 250);   //0.25ms
    ConfigCpuTimer(&CpuTimer0, 150, 25000);   //0.25ms
      //StartCpuTimer0();
    InitECan();
    delay_loop();
    delay_loop();

    IER = 0x0000;
   IFR = 0x0000;

   EALLOW; 
    PieVectTable.TINT0 = &TINT0_ISR;
    PieVectTable.ECAN0INTA = &ECAN0INTA_ISR;
    PieVectTable.ECAN1INTA = &ECAN1INTA_ISR;
    PieVectTable.ADCINT = &ADCINT_ISR;
    PieVectTable.XINT1=&XINT1_ISR;
    PieVectTable.XINT2=&XINT2_ISR;
   EDIS; 
    
   //使能PIE级
    XIntruptRegs.XINT1CR.bit.ENABLE=1;//使能外部中断
    XIntruptRegs.XINT1CR.bit.POLARITY=0;//中断产生在下降沿,=1为上升沿。

    XIntruptRegs.XINT2CR.bit.ENABLE=1;//使能外部中断
    XIntruptRegs.XINT2CR.bit.POLARITY=0;//中断产生在下降沿,=1为上升沿。

    // 开CPU中断
     
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1;    //Xint1中断使能
    PieCtrlRegs.PIEIER1.bit.INTx5 = 1;    //XINT2中断使能     
    PieCtrlRegs.PIEIER1.bit.INTx6 = 1; //ADC中断使能
      PieCtrlRegs.PIEIER1.bit.INTx7 = 1;  //定时器0中断
    PieCtrlRegs.PIEIER9.bit.INTx5 = 1; //ECAN0 中断使能
   
   IER |= M_INT1;
   IER |= M_INT9;
   EINT;

........

}

void InitECan(void)
{
    struct ECAN_REGS ECanaShadow;
//    struct LAM_REGS LAMSET;
    EALLOW;
    GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1;  //CAN引脚配置
    GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1;

    ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
    ECanaShadow.CANTIOC.bit.TXFUNC = 1;
    ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
   
    ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
    ECanaShadow.CANRIOC.bit.RXFUNC = 1;
    ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
    EDIS;
   
    ECanaRegs.CANME.all = 0;
   
    /*发送邮箱的ID号*/
    ECanaMboxes.MBOX0.MSGID.all = 0x9555AAA0;
   
    /*接收邮箱的ID号*/
    ECanaMboxes.MBOX15.MSGID.all = 0xc0000000;
   
    ECanaRegs.CANGAM.all=0x7fffffff;
//    LAMSET.LAM16.all = 0x1fffffff;

    /*0~15 is TX,16~31 is RX*/
    ECanaRegs.CANMD.all = 0xFFFFf000;
   
    /*32个邮箱使能*/
    ECanaRegs.CANME.all = 0x00008001;
   
    /*数据长度 8个BYTE*/
    ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX7.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX8.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX9.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX10.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX11.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX12.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX13.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX14.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX15.MSGCTRL.bit.DLC = 8;

           
    /*没有远方应答帧被请求*/
    ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX2.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX3.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX4.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX5.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX7.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX8.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX9.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX10.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX11.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX12.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX13.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX14.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX15.MSGCTRL.bit.RTR = 0;

   
    ECanaMboxes.MBOX0.MDL.all = 0x9555AAA0;
    ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;
   
   
    EALLOW;
    /*邮箱屏蔽使能*/
    ECanaRegs.CANMIM.all = 0xFFFFFFFF;
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 1;
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;
   
    do
    {
        ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    }while(ECanaShadow.CANES.bit.CCE != 1);
   
    EALLOW;
    /*(BRPREG+1)=10 feeds a 15MHz CAN clock*/
    ECanaShadow.CANBTC.bit.BRPREG = 39;
    /*150/10=15*/
    ECanaShadow.CANBTC.bit.TSEG2REG = 5;
    ECanaShadow.CANBTC.bit.TSEG1REG = 7;
    ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
   
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 0;
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;
   
    do
    {
        ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    }while(ECanaShadow.CANES.bit.CCE != 0);
   
    EALLOW;
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.STM = 0;
    ECanaShadow.CANMC.bit.SCB = 0;
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;
   

    EALLOW;
    ECanaRegs.CANMIM.all = 0x00008000;
    ECanaRegs.CANMIL.all = 0;
    ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
    ECanaRegs.CANGIM.bit.I0EN = 1;
    ECanaRegs.CANGIM.bit.I1EN = 0;
    ECanaRegs.CANGIM.all = 0x3fc01;
    EDIS;
    PieCtrlRegs.PIEIER9.bit.INTx6 = 0;
    PieCtrlRegs.PIEIER9.bit.INTx5 = 1;

}   

interrupt void ECAN0INTA_ISR(void)        // 0x000DC8  ECAN0INT (CAN)
{

    DINT;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;    // Must acknowledge the PIE group

    if(ECanaRegs.CANRMP.bit.RMP15==1)
    {
          ECanaRegs.CANRMP.bit.RMP15=1;
        PieCtrlRegs.PIEACK.bit.ACK9 = 1;

           Mailbox = &ECanaMboxes.MBOX15;
           ECanaMboxes.MBOX0.MDL.all = Mailbox->MDL.all; // = 0x9555AAAn (n is the MBX number)
           ECanaMboxes.MBOX0.MDH.all = Mailbox->MDH.all; // = 0x89ABCDEF (a constant)
        ECanaRegs.CANME.all = 0;
        ECanaMboxes.MBOX0.MSGID.all  = Mailbox->MSGID.all;
        ECanaRegs.CANME.all = 0x00008001;


        GpioDataRegs.GPDTOGGLE.bit.GPIOD5=1;

       
        ECanaRegs.CANTRS.bit.TRS0 = 1;
        while(ECanaRegs.CANTA.bit.TA0 == 0);
        ECanaRegs.CANTA.bit.TA0 = 1;
       
       }
       else
      {
        ECanaRegs.CANGIF0.all=0xffff;
      }

      EINT;
}