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.

CANME寄存器按位使能导致其他邮箱误使能情况

最近在进行eCAN邮箱初始化(多种协议并存下,不同协议单独初始化)如下:

void vYLCanIDInit(void)   //上电初始化和通讯故障初始化
{

ECanaRegs.CANME.all = 0x00000000;

ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000008; 
ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000008; 
ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000108;

ECanaMboxes.MBOX1.MSGID.all = 0xc6900003;

ECanaRegs.CANME.all = 0x00000032; 
ECanaRegs.CANMD.all = 0x00000002; 


ECanaLAMRegs.LAM1.all = 0x81DFFFFF; 
ECanaLAMRegs.LAM4.all = 0x800FFFFC;
ECanaLAMRegs.LAM5.all = 0x800FFFFC;

}

void InfyCanIDInit(void)   //在选择此协议时初始化和通讯故障时初始化
{

ECanaRegs.CANME.bit.ME2 = 0; 
ECanaRegs.CANME.bit.ME8 = 0;

ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000008;
ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000008; 

ECanaMboxes.MBOX2.MSGID.all = 0xC29A00F0; 

ECanaRegs.CANME.bit.ME2 = 1; 
ECanaRegs.CANME.bit.ME8 = 1;

ECanaRegs.CANMD.bit.MD2 = 1; 
ECanaRegs.CANMD.bit.MD8 = 0; 

ECanaLAMRegs.LAM2.all = 0x807FFFFF;
}

在CCS3.3进行仿真时发现其他未使能邮箱有误使能情况:

请大牛帮忙分析分析,谢谢!

  • 补充说明:
        用于模块中用到多种CAN通讯协议,初始化独立配置,其中void vYLCanIDInit(void)是默认执行,对应的应用协议(内部协议)也是一直使能。
    其他的协议(外部协议)采用选择标志位的形式进行初始化和协议解析。现选择其中一种外部协议和默认的内部协议进行说明。
    1.  void vYLCanIDInit(void)函数和 void InfyCanIDInit(void)在上电之后和通讯中断之后都会调用(执行),
        其中void vYLCanIDInit(void)函数先执行,void InfyCanIDInit(void)后执行。

    2. 结合两个初始化函数,一共用到的邮箱有BOX1,BOX2,BOX4,BOX5,BOX8,其中BOX1,BOX2为接收,其余为发送。

    3. 当监控下达广播命令: 0697FF83   03 F0 00 37 00 01 00 00 ,协议中对应的接收邮箱为BOX1 。模块偶尔出现不响应命令的情况。通过CCS3.3仿真
    发现,除了上述使能的邮箱外,还有其他邮箱被使能,如图所示(CANME.MEx)。经查询,下发的命令被BOX31接收。

    疑惑:
            用CANME.MEx的形式使能邮箱是否会导致其他邮箱误使能?
  • 补充说明:
        由于模块中用到多种CAN通讯协议,初始化独立配置,其中void vYLCanIDInit(void)是默认执行,对应的应用协议(内部协议)也是一直使能。
    其他的协议(外部协议)采用选择标志位的形式进行初始化和协议解析。现选择其中一种外部协议和默认的内部协议进行说明。
    1.  void vYLCanIDInit(void)函数和 void InfyCanIDInit(void)在上电之后和通讯中断之后都会调用(执行),
        其中void vYLCanIDInit(void)函数先执行,void InfyCanIDInit(void)后执行。

    2. 结合两个初始化函数,一共用到的邮箱有BOX1,BOX2,BOX4,BOX5,BOX8,其中BOX1,BOX2为接收,其余为发送。

    3. 当监控下达广播命令: 0697FF83   03 F0 00 37 00 01 00 00 ,协议中对应的接收邮箱为BOX1 。模块偶尔出现不响应命令的情况。通过CCS3.3仿真
    发现,除了上述使能的邮箱外,还有其他邮箱被使能,如图所示(CANME.MEx)。经查询,下发的命令被BOX31接收。

    疑惑:
            用CANME.MEx的形式使能邮箱是否会导致其他邮箱误使能?
  • 从第一段代码邮箱4.5为发送邮箱,并分别写了 LAM registers。第二段代码中看到您没有使用32-bit R/W. For example, the following statements are not permitted:
     
    ECanaRegs.CANME.bit.ME2 = 1;
    ECanaRegs.CANME.bit.ME8 = 1;
     
    ECanaRegs.CANMD.bit.MD2 = 1;
    ECanaRegs.CANMD.bit.MD8 = 0;
    You need to use the shadow registers to ensure all R/W are 32-bit.具体可以参考:http://www.ti.com/lit/an/spra876b/spra876b.pdf