打印

【求助】关于TMS320F2812的接收屏蔽问题。

[复制链接]
2145|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlj3304|  楼主 | 2008-7-18 18:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

有关ecan的接收屏蔽问题
我想屏蔽掉can标识符的后三位,我这是标准的can没有扩展位,前几位的can标识符的前8位为1000 1001,是不是MID还是按照不屏蔽之前的设置,跟发送邮箱的一致,只要设置屏蔽寄存器屏蔽掉想要屏蔽的位就可以了?我是再初始化程序中设置的接收以及接收屏蔽,程序如下,结果总是不对,不知道为什么,大家帮忙看一下谢谢了。
void InitECan(void)
{
        struct ECAN_REGS ECanaShadow;
        struct LAM_REGS ECanaLAMRegs;
        EALLOW;
        ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
        ECanaShadow.CANTIOC.bit.TXFUNC = 1;
        ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
        
        ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
        ECanaShadow.CANRIOC.bit.RXFUNC = 1;
        ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
        EDIS;
        


        ECanaRegs.CANME.all = 0x00000000;        
    //ECanaMboxes.MBOX16.MID.all=0x113C0000;
        ECanaMboxes.MBOX16.MID.all=0x51200000;
    ECanaLAMRegs.LAM16.all=0x801FFFFF;
    ECanaMboxes.MBOX16.MCF.bit.RTR = 0;
    ECanaMboxes.MBOX16.MCF.bit.DLC = ECanaMboxes.MBOX0.MCF.bit.DLC; 

        /*0~15 is TX,16~31 is RX*/
        ECanaRegs.CANMD.all = 0xFFFF0000;
        
        /*32个邮箱使能*/
        ECanaRegs.CANME.all = 0x00010001;
        
        
        ECanaMboxes.MBOX0.MCF.all = 0;
        ECanaMboxes.MBOX1.MCF.all = 0;
        ECanaMboxes.MBOX2.MCF.all = 0;
        ECanaMboxes.MBOX3.MCF.all = 0;
        ECanaMboxes.MBOX4.MCF.all = 0;
        ECanaMboxes.MBOX5.MCF.all = 0;
        ECanaMboxes.MBOX6.MCF.all = 0;
        ECanaMboxes.MBOX7.MCF.all = 0;
        ECanaMboxes.MBOX8.MCF.all = 0;
        ECanaMboxes.MBOX9.MCF.all = 0;
        ECanaMboxes.MBOX10.MCF.all = 0;
        ECanaMboxes.MBOX11.MCF.all = 0;
        ECanaMboxes.MBOX12.MCF.all = 0;
        ECanaMboxes.MBOX13.MCF.all = 0;
        ECanaMboxes.MBOX14.MCF.all = 0;
        ECanaMboxes.MBOX15.MCF.all = 0;
        ECanaMboxes.MBOX16.MCF.all = 0;
        ECanaMboxes.MBOX17.MCF.all = 0;
        ECanaMboxes.MBOX18.MCF.all = 0;
        ECanaMboxes.MBOX19.MCF.all = 0;
        ECanaMboxes.MBOX20.MCF.all = 0;
        ECanaMboxes.MBOX21.MCF.all = 0;
        ECanaMboxes.MBOX22.MCF.all = 0;
        ECanaMboxes.MBOX23.MCF.all = 0;
        ECanaMboxes.MBOX24.MCF.all = 0;
        ECanaMboxes.MBOX25.MCF.all = 0;
        ECanaMboxes.MBOX26.MCF.all = 0;
        ECanaMboxes.MBOX27.MCF.all = 0;
        ECanaMboxes.MBOX28.MCF.all = 0;
        ECanaMboxes.MBOX29.MCF.all = 0;
        ECanaMboxes.MBOX30.MCF.all = 0;
        ECanaMboxes.MBOX31.MCF.all = 0;
        

        //没有远方应答帧被请求
        ECanaMboxes.MBOX0.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX1.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX2.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX3.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX4.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX5.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX6.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX7.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX8.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX9.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX10.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX11.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX12.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX13.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX14.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX15.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX16.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX17.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX18.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX19.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX20.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX21.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX22.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX23.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX24.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX25.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX26.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX27.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX28.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX29.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX30.MCF.bit.RTR = 0;
        ECanaMboxes.MBOX31.MCF.bit.RTR = 0;
        EALLOW;
        /*邮箱屏蔽使能*/
        ECanaRegs.CANMIM.all = 0xFFFFFFFF;
        ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
        ECanaShadow.CANMC.bit.CCR = 1;
        ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
        EDIS;
        
        do
        {
                ECanaShadow.CANES.all = ECanaRegs.CANES.all;
        }while(ECanaShadow.CANES.bit.CCE != 1);
        
        EALLOW;
       ECanaShadow.CANBTC.bit.BRP = 19;
       ECanaShadow.CANBTC.bit.TSEG2 = 5;
            ECanaShadow.CANBTC.bit.TSEG1 =7;
      
        /*(BRPREG+1)=10 feeds a 15MHz CAN clock*/
   // if (baud_rate==BR125)
           //ECanaShadow.CANBTC.bit.BRP = 79;//位定时器控制寄存器
            /*150/10=15*/
    //else
       //if(baud_rate==BR250)
       // ECanaShadow.CANBTC.bit.BRP = 39;
       //else
        // if(baud_rate==BR500) 
          // ECanaShadow.CANBTC.bit.BRP = 19;
    ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
        
        ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
        ECanaShadow.CANMC.bit.CCR = 0;
    ECanaShadow.CANMC.bit.DBO=1;
        ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
        EDIS;
        
        do
        {
                ECanaShadow.CANES.all = ECanaRegs.CANES.all;
        }while(ECanaShadow.CANES.bit.CCE != 0);


        EALLOW;
        ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
        ECanaShadow.CANMC.bit.STM = 1;
        ECanaShadow.CANMC.bit.SCB = 1;
        ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
        EDIS;
        
    ECanaRegs.CANME.all = 0x00000000;

        
        
    #if        CAN_INT
        EALLOW;
        ECanaRegs.CANMIM.all = 0xffffffff;
        ECanaRegs.CANMIL.all = 0;
        ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
        ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
        ECanaRegs.CANGIM.bit.I0EN = 1;
        ECanaRegs.CANGIM.bit.I1EN = 1;
        ECanaRegs.CANGIM.all = 0x3ff07;
        EDIS;
        PieCtrl.PIEIER9.bit.INTx6 = 1;
        PieCtrl.PIEIER9.bit.INTx5 = 1;
        #endif
}




相关帖子

沙发
wlj3304|  楼主 | 2008-7-20 20:32 | 只看该作者

接收屏蔽失效,不知道为什么?

void InitECan(void)
{
    struct ECAN_REGS ECanaShadow;
  
    EALLOW;
    ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
    ECanaShadow.CANTIOC.bit.TXFUNC = 1;
    ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
    
    ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
    ECanaShadow.CANRIOC.bit.RXFUNC = 1;
    ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
    EDIS;

    EALLOW;
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.STM = 1;
    ECanaShadow.CANMC.bit.SCM = 1;
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;
    
    ECanaRegs.CANME.all = 0;
    
    /*发送邮箱的ID号*/
    ECanaMboxes.MBOX0.MID.all = 0x11200000;
    
             /*接收邮箱的ID号*/
    
             ECanaMboxes.MBOX16.MID.all = 0x513C0000;
             ECanaLAMRegs.LAM16.all=0x801c0000;  
        
    /*0~15 is TX,16~31 is RX*/
    ECanaRegs.CANMD.all = 0xFFFF0000;
    
    /*32个邮箱使能*/
    ECanaRegs.CANME.all = 0x00010001;
    
    /*数据长度 8个BYTE*/
                ECanaMboxes.MBOX0.MCF.all=0;
    ECanaMboxes.MBOX16.MCF.all=0;
    ECanaMboxes.MBOX0.MCF.bit.DLC = 8;
    ECanaMboxes.MBOX16.MCF.bit.DLC = 8;
    
                
    /*没有远方应答帧被请求*/
    ECanaMboxes.MBOX0.MCF.bit.RTR = 0;
    ECanaMboxes.MBOX16.MCF.bit.RTR = 0;
            

    ECanaMboxes.MBOX0.MDRL.all = 0x9555AAA0;
    ECanaMboxes.MBOX0.MDRH.all = 0x89ABCDEF;
    
    EALLOW;
    /*邮箱屏蔽使能*/
    ECanaRegs.CANMIM.all = 0xFFFFFFFF;
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 1;
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;
    
    do
    {
        ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    }while(ECanaShadow.CANES.bit.CCE != 1);
    
    EALLOW;
    /*(BRPREG+1)=10 feeds a 15MHz CAN clock*/
    ECanaShadow.CANBTC.bit.BRP = 9;
    /*150/10=15*/
    ECanaShadow.CANBTC.bit.TSEG2 = 5;
    ECanaShadow.CANBTC.bit.TSEG1 = 7;
    ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;

   
    
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 0;
                ECanaShadow.CANMC.bit.DBO=0;
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;
    
    do
    {
        ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    }while(ECanaShadow.CANES.bit.CCE != 0);
    

    
    #if    CAN_INT
    EALLOW;
    ECanaRegs.CANMIM.all = 0xFFFFffff;
    ECanaRegs.CANMIL.all = 0;
    ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
    ECanaRegs.CANGIM.bit.I0EN = 1;
    ECanaRegs.CANGIM.bit.I1EN = 1;
    ECanaRegs.CANGIM.all = 0x3ff07;
    EDIS;
    PieCtrl.PIEIER9.bit.INTx6 = 1;
    PieCtrl.PIEIER9.bit.INTx5 = 1;
    #endif
}
    
我采用的是ecan模式,这是再ti的程序上的改写,只有初始化加进了接收屏蔽,其他地方没有变化。我设置发送邮箱的mid为ECanaMboxes.MBOX0.MID.all=0x11200000;
接收邮箱的mid为ECanaMboxes.MBOX16.MID.all=0x513C00000;
我想屏蔽掉can标识符的后三位,所以设置接收屏蔽寄存器为
ECanaLAMRegs.LAM16.all=0x801C0000;
可是接收到的数据与发送的数据不符,我设置接受屏蔽寄存器mid所有位都无关即
ECanaLAMRegs.LAM16.all=0xFFFFFFFF;
应该是把mid的所有位都屏蔽掉了,可是接收到的数据还是不对。不知道是为什么,这明显就是接受屏蔽寄存器失效,没有用处,大家有没有比较清楚的?急,先谢谢大家。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝