工具/软件:Code Composer Studio
大家好:
我对 CAN 接收中断有疑问。 在我的程序中 、CAN 邮箱16到31被设置为接收邮箱。 程序运行超过5小时后 、它 无法进入 CAN 中断、RMP 和 RML 接收邮箱全部为1、 CANGIF0.MIV0保持在31。谁知道原因、谢谢。
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.
工具/软件:Code Composer Studio
大家好:
我对 CAN 接收中断有疑问。 在我的程序中 、CAN 邮箱16到31被设置为接收邮箱。 程序运行超过5小时后 、它 无法进入 CAN 中断、RMP 和 RML 接收邮箱全部为1、 CANGIF0.MIV0保持在31。谁知道原因、谢谢。
谢谢、我已经阅读了这些值。 他们没有问题。 我现在遇到的问题是、在程序运行354分钟后、当 CAN 进入接收中断时、在邮箱31接收到数据后、其余邮箱将不会接收数据。 此时、RMP 和 RML 都被置位。 无法运行到 ECANaRegs.CANRMP.ALL = 0xFFFFFF0000、因此无法清除 RMP 和 RML;我的程序主要用于生成 PWM 波、开关频率为15K。
中断空 CAN0A_intISR (空)
{
易失性 uint16 TempPIEIER;
uint16 i;
TempPIEIER = PieCtrlRegs.PIEIER9.ALL;//保存 PIEIER 寄存器供以后使用
IER |= M_INT9;//通过调整 IER 设置全局优先级
IER &= 0x0104;
PieCtrlRegs.PIEIER3.ALL &= 0x0001;//通过调整 PIEIER2来设置组优先级以允许 INT2.2中断当前 ISR
PieCtrlRegs.PIEACK.ALL = 0xFFFF;//启用 PIE 中断
asm (" NOP");//等待一个周期
EINT;
if (ECANaRegs.CANGIF0.bit.MIV0 == 16)
{
for (CAN_READ=0;CAN_READ<=15;CAN_READ++)
{
mailbox_read (CAN_Read+16);//此 func 读取指定的邮箱数据
CAN_reci[CAN_read][0]=TestMbox1;
CAN_reci[CAN_read][1]=TestMbox2;
}
gCAN-reci_cAN();
bzw = 1;
bzw_CANjiniance =0;
zdjs++;
zdjs1++;
if (zdjs ==1)
{
P_CheckSet();
P_GetSetFromRam();
}
if (zdjs >=2)
{
zdjs =2;
}
}
ECANaRegs.CANRMP.ALL = 0xFFFFFF0000;
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
EINT;
for (i = 1;i <= 10;i++){}
Dint;
PieCtrlRegs.PIEIER9.ALL = TempPIEIER;
}
如果满足接受屏蔽过滤标准(如果未使用过滤、则为精确的 ID 匹配)、则必须在相应的邮箱中接收消息。 在相应的邮箱中不会接收到有效的消息。
图83 (SPRUFB0D 的第121页)清楚地显示了要识别的中断的各种起作用的位。 这些步骤也清楚地说明了顺序。
您需要按照 CAN 用户指南中的说明使用32位 R/W。 请参阅 SPRUEU1第15页中的1.3.2.1。 这条线违反了以下规定:ECANaRegs.CANGIF0.bit.MIV0 == 16
如果您找到了问题的解决方案、请关闭帖子。