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.

28035 ecan接收标志位会偶尔被清除,但是邮箱内的数据有更新

Other Parts Discussed in Thread: CONTROLSUITE

DSP28035,有看过例程;使用循环扫描接收
void can_inrecieve(Uint16 MBXnbr)
{
volatile struct MBOX *Mailbox;
rmsqueue->head = 0;
Mailbox = &ECanaMboxes.MBOX0+MBXnbr;
    rmsqueue->ms_rebuffer[0].cob_id = Mailbox->MSGID.bit.STDMSGID;
    rmsqueue->ms_rebuffer[0].rtr= Mailbox->MSGCTRL.bit.RTR;
    rmsqueue->ms_rebuffer[0].len=Mailbox->MSGCTRL.bit.DLC;
    switch(rmsqueue->ms_rebuffer[0].len)
    {
case 8:rmsqueue->ms_rebuffer[0].data[7] = Mailbox->MDH.byte.BYTE4;
case 7:rmsqueue->ms_rebuffer[0].data[6] = Mailbox->MDH.byte.BYTE5;
case 6:rmsqueue->ms_rebuffer[0].data[5] = Mailbox->MDH.byte.BYTE6;
case 5:rmsqueue->ms_rebuffer[0].data[4] = Mailbox->MDH.byte.BYTE7;
case 4:rmsqueue->ms_rebuffer[0].data[3] = Mailbox->MDL.byte.BYTE0;
case 3:rmsqueue->ms_rebuffer[0].data[2] = Mailbox->MDL.byte.BYTE1;
case 2:rmsqueue->ms_rebuffer[0].data[1] = Mailbox->MDL.byte.BYTE2;
case 1:rmsqueue->ms_rebuffer[0].data[0] = Mailbox->MDL.byte.BYTE3;
case 0:break;
default:break;
}
    getnum = 1;
}
if(ECanaRegs.CANRMP.all)
{
            if(getnum == 0)
            {
if(ECanaRegs.CANRMP.bit.RMP31 == 1)
{
ECanaRegs.CANRMP.bit.RMP31 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP31 == 1)
  ECanaRegs.CANRFP.bit.RFP31 = 1; //清除远程帧标志
else
{
MBXnbr = 31;//现在使用邮箱号为0
can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP30 == 1)
{
ECanaRegs.CANRMP.bit.RMP30 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP30 == 1)
  ECanaRegs.CANRFP.bit.RFP30 = 1; //清除远程帧标志
else
{
  MBXnbr = 30;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP13 == 1)
{
ECanaRegs.CANRMP.bit.RMP13 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP13 == 1)
  ECanaRegs.CANRFP.bit.RFP13 = 1; //清除远程帧标志
else
{
  MBXnbr = 13;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP28 == 1)
{
ECanaRegs.CANRMP.bit.RMP28 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP28 == 1)
  ECanaRegs.CANRFP.bit.RFP28 = 1; //清除远程帧标志
else
{
  MBXnbr = 28;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP27 == 1)
{
ECanaRegs.CANRMP.bit.RMP27 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP27 == 1)
  ECanaRegs.CANRFP.bit.RFP27 = 1; //清除远程帧标志
else
{
  MBXnbr = 27;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP25 == 1)
{
ECanaRegs.CANRMP.bit.RMP25 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP25 == 1)
  ECanaRegs.CANRFP.bit.RFP25 = 1; //清除远程帧标志
else
{
  MBXnbr = 25;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP24 == 1)
{
ECanaRegs.CANRMP.bit.RMP24 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP24 == 1)
  ECanaRegs.CANRFP.bit.RFP24 = 1; //清除远程帧标志
else
{
  MBXnbr = 24;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP22 == 1)
{
ECanaRegs.CANRMP.bit.RMP22 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP22 == 1)
  ECanaRegs.CANRFP.bit.RFP22 = 1; //清除远程帧标志
else
{
  MBXnbr = 22;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP21 == 1)
{
ECanaRegs.CANRMP.bit.RMP21 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP21 == 1)
  ECanaRegs.CANRFP.bit.RFP21 = 1; //清除远程帧标志
else
{
  MBXnbr = 21;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP19 == 1)
{
ECanaRegs.CANRMP.bit.RMP19 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP19 == 1)
  ECanaRegs.CANRFP.bit.RFP19 = 1; //清除远程帧标志
else
{
  MBXnbr = 19;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP18 == 1)
{
ECanaRegs.CANRMP.bit.RMP18 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP18 == 1)
  ECanaRegs.CANRFP.bit.RFP18 = 1; //清除远程帧标志
else
{
  MBXnbr = 18;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
else if(ECanaRegs.CANRMP.bit.RMP14 == 1)
{
ECanaRegs.CANRMP.bit.RMP14 = 1;  // clear RMP by writing '1'
if(ECanaRegs.CANRFP.bit.RFP14 == 1)
  ECanaRegs.CANRFP.bit.RFP14 = 1; //清除远程帧标志
else
{
  MBXnbr = 14;//现在使用邮箱号为0
  can_inrecieve(MBXnbr);
}
}
            }

来处理接收的数据,其中getnum在处理完一个邮箱数据后会被置0,当28,25,22,19都有数据接收并且是依次连续接收的数据时,会有一个邮箱偶尔标志位被清除,但邮箱内的数据有变化,即收到主站的数据,当只有一个邮箱数据接收标志位不会被清除。如果你有更好的建议接收方式,请推荐下,不能使用中断接收。只能循环扫描处理邮箱数据。