TI中文支持网
TI专业的中文技术问题搜集分享网站

关于2812CAN接收邮箱中断

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jh chen:

贴一段你的程序看看.

还有没有别的中断?

3个数据的发送间隔是多少?

CAN中断中还有其他的程序执行没有?

对CANRMP的操作有没有使用影子寄存器.有可能错误清除CMP.

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jinlong li1:

回复 jh chen:

1.还有一个定时器下溢中断

2.我做测试实际只用了一个接收邮箱,数据的发送是通过上位机手动发送,间隔时间很长。

rpm清楚不需要影子寄存器吧。

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jinlong li1:

回复 jinlong li1:

interrupt void Ecan0ISR(void){

Can_receivecounter++;DINT;

if(ECanaRegs.CANRMP.all&0x00040000) {CANSXSRX18(); receiveflag18=1;} if(ECanaRegs.CANRMP.all&0x00080000) {CANSXSRX19(); receiveflag19=1;}

if(ECanaRegs.CANRMP.all&0x20000000) {

CANSXSRX29(); receiveflag29=1; } PieCtrlRegs.PIEACK.bit.ACK9 = 1; EINT;

}

void CANSXSRX29(void){ ECanaRegs.CANRMP.all = (ECanaRegs.CANRMP.all|0x20000000);

a=ECanaMboxes.MBOX29.MDL.byte.BYTE0; b=ECanaMboxes.MBOX29.MDL.byte.BYTE1;

}

上面是中断程序和接收邮箱程序

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jinlong li1:

回复 jinlong li1:

interrupt void Ecan0ISR(void){Can_receivecounter++;DINT;

if(ECanaRegs.CANRMP.all&0x00040000){CANSXSRX18();receiveflag18=1;}if(ECanaRegs.CANRMP.all&0x00080000){CANSXSRX19();receiveflag19=1;

}

if(ECanaRegs.CANRMP.all&0x20000000){CANSXSRX29();receiveflag29=1;

}

PieCtrlRegs.PIEACK.bit.ACK9 = 1;EINT;}

void CANSXSRX29(void){ ECanaRegs.CANRMP.all = (ECanaRegs.CANRMP.all|0x20000000);a=ECanaMboxes.MBOX29.MDL.byte.BYTE0;b=ECanaMboxes.MBOX29.MDL.byte.BYTE1;

}

上面是中断程序和接收邮箱程序

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jh chen:

回复 jinlong li1:

建议改为:

interrupt void Ecan0ISR(void){

struct ECAN_REGS  ECanaShadow;//注意引用CAN的头文件

Can_receivecounter++;//DINT;   //删除这个,其他的中断中也不要写这个.进中断之后会自动禁止,除非你想使能别人打断,这里可以写EINT.

ECanaShadow.CANRMP.all = 0;

ECanaShadow.CANRMP.all = ECanaRegs.CANRMP.all;

//if(ECanaRegs.CANRMP.all&0x00040000)

if((ECanaShadow.CANRMP.all & 0x00040000) ==0x00040000){CANSXSRX18();receiveflag18=1;}

//if(ECanaRegs.CANRMP.all&0x00080000)

if((ECanaShadow.CANRMP.all & 0x00080000) ==0x00080000  ){CANSXSRX19();receiveflag19=1;

}

//if(ECanaRegs.CANRMP.all&0x20000000)

if((ECanaShadow.CANRMP.all & 0x20000000) ==0x20000000){CANSXSRX29();receiveflag29=1;

}

//PieCtrlRegs.PIEACK.bit.ACK9 = 1;

PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;//EINT;}

void CANSXSRX29(void){ 

ECanaRegs.CANRMP.all = 0x20000000;//其他邮箱按设计赋值,只清除对应的位

//ECanaRegs.CANRMP.all = (ECanaRegs.CANRMP.all|0x20000000);//这样先读后写,如果收到两帧,则又可能清除其他的位.

//ECanaRegs.CANRMP.all = RMP_TEMP;//也可以带参

a=ECanaMboxes.MBOX29.MDL.byte.BYTE0;b=ECanaMboxes.MBOX29.MDL.byte.BYTE1;

}

你再试试.

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jinlong li1:

回复 jh chen:

好的,非常感谢,我先试试。

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jinlong li1:

回复 jh chen:

你好,我按照你说的试了一下,现象还是和原来一样。

程序刚开始正常,运行一个小时后,通过观测Can_receivecounter++的值,这个值还能递增,说明程序能够进入邮箱中断;但是观测ECanaRegs.CANRMP.bit.RMP29的值,这个值一直保持为0,而且提取ECanaMboxes.MBOX29.MDL.byte.BYTE0和ECanaMboxes.MBOX29.MDL.byte.BYTE1的数据,也是变化的,说明邮箱29能够接收到数据,并且能够触发邮箱中断,但是CANRMP却没有被置位。

不知道是什么原因?

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jh chen:

回复 jinlong li1:

你的意思是运行一段时间后,程序中a,b的值不变化了吗?

由于进入中断后,RMP29很快会被清0 .你是在什么地方打断点看的?

你可以在运行一段时间后,在中断中打一个断点,发送一组数据看看, 看进入中断后,RMP的那一位置位了?

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jinlong li1:

回复 jh chen:

对对,运行一个小时左右,a、b的值就不变了。RMP位一直保持为0,但是能确定接收邮箱29肯定接收到了数据,并且中断也进入了。

我是用其他邮箱查询发送的,将邮箱29中的数据和RMP位赋给邮箱15,用邮箱15将他们发送给上位机观察的。我试验了好多次,基本都是在一个小时左右出现故障。

问题说明:我在程序中,将3个邮箱配置为接收邮箱,将接收中断配置为ECAN0INT中断线,当某个邮箱接收到数据后,触发邮箱中断,然后根据CANRMP寄存器的标志位确定是哪个邮箱触发了中断,对该邮箱进行接收处理。奇怪的是,程序刚开始运行一直正常,但是运行到一个小时左右后,出现故障。通过反复的测试,总结出故障的现象为,当我向dsp中发送数据时,能够确定邮箱接收到了数据,并且触发了邮箱中断,但是该邮箱的CANRMP标志位并没有被置位,因此dsp程序中无法判别哪个邮箱触发了中断,而且发送邮箱能够正常发送数据。经过测试,确定错误计数寄存器CANTEC/CANREC均正常。                                                     

以上为我所遇到的问题,不知道哪位朋友能够解惑,说一说解决方法或者可能的原因,谢谢!

jh chen:

回复 jinlong li1:

那你可以在运行一段时间后,在中断中打一个断点,发送一组数据看看, 看进入中断后,RMP的那一位  置位了?

赞(0)
未经允许不得转载:TI中文支持网 » 关于2812CAN接收邮箱中断
分享到: 更多 (0)