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;
}