chenzhi658 发表于 2017-7-13 14:45

ECAN的ECanbRegs.CANRMP寄存器问题

现象:通过不同的ID发送到邮箱2、12和24,接着对应的RMP位被置位,然后去清除某一RMP时,其他的RMP也被清除了。
问题:清除某一RPM,其余的RMP也被清除,这是什么原因?DSP数据手册没有说明啊,你们有没有遇到过?
Uint32 test_CanRec1=0,test_CanRec2=0;
Uint16 test_CanRec3=0,test_CanRec4=0;
#pragma CODE_SECTION(CAN_Receiv_EventManager, "ramfuncs");
void CAN_Receiv_EventManager(void){
        if(Par_uCAN_OPrater_EN == 1 && Par_FieldBusType == 3){
                test_CanRec2 = ECanbRegs.CANRMP.all;
                if(test_CanRec4 & 0x0001){
                        if(ECanbRegs.CANRMP.bit.RMP24 == 1){                      //
                                ECanbRegs.CANRMP.bit.RMP24 = 1;
                        }
                }
                if(test_CanRec4 & 0x0004){
                        if(ECanbRegs.CANRMP.bit.RMP2 == 1){                      //
                                ECanbRegs.CANRMP.bit.RMP2 = 1;
                        }
                }
                test_CanRec1 = ECanbRegs.CANRMP.all;
                if(test_CanRec4 & 0x0002){
                        if(ECanbRegs.CANRMP.bit.RMP12 == 1){
                                ECanbRegs.CANRMP.bit.RMP12 = 1;
                        }
                }
                test_CanRec3 = (Uint16)(ECanbRegs.CANRMP.all >>10);
        }
}

chenzhi658 发表于 2017-7-13 14:49

坐等大神

chenzhi658 发表于 2017-7-13 16:13


问题解决了,原来是代码书写问题,
比如清除24邮箱需要
ECanbShadow.CANRMP.all = 0;
ECanbShadow.CANRMP.bit.RMP24 = 1;
ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all;

太不专一 发表于 2017-7-14 16:16

对啊,CAN的很多寄存器都必须用影子寄存器操作。

chenzhi658 发表于 2017-7-17 11:00

太不专一 发表于 2017-7-14 16:16
对啊,CAN的很多寄存器都必须用影子寄存器操作。

但是
发送邮箱这样子,会多发
ECanbShadow.CANTRS.all = ECanbRegs.CANTRS.all;
ECanbShadow.CANTRS.bit.TRS17 = 1;
ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all;
也要这样写,才不会多发。你们也是这样子发送邮箱得嘛???
ECanbShadow.CANTRS.all = 0;
ECanbShadow.CANTRS.bit.TRS17 = 1;
ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all;

太不专一 发表于 2017-7-27 15:44

chenzhi658 发表于 2017-7-17 11:00
但是
发送邮箱这样子,会多发
ECanbShadow.CANTRS.all = ECanbRegs.CANTRS.all;


                        tempEcanReg.CANTRS.all = EcanReg->CANTRS.all;
                        tempEcanReg.CANTRS.bit.TRS1 = 1;
                        EcanReg->CANTRS.all = tempEcanReg.CANTRS.all;
不会多发啊
页: [1]
查看完整版本: ECAN的ECanbRegs.CANRMP寄存器问题