原创 笔记七:双验收滤波(扩展帧)

2009-10-27 15:15 3974 7 7 分类: 汽车电子

笔记七:双验收滤波(扩展帧)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


在写笔记五的时候,因为犯了一些老毛病耽误了很多时间(老是改不了打瞌睡的坏习惯)...这一章笔记是要讨论久违的验收滤波模式中的双验收滤波模式。不知道大家有没有参考过ilove314 写过的一篇文章,文中介绍了双验收滤波-普通帧,我也从中受益到不少。


61252911-9867-45b3-ab4d-165a33b87bc4.JPG



我们开始从图表里分析。在双验收滤波模式中,接收屏蔽寄存器AMR0AMR2是等价的,AMR1AMR是等价的,换之接收代码寄存器ACR0ACR2是等价的,而AC1ACR3也是等价的。(继续分析)而双验收滤波模式中,仅针对报文中的标示符ID.28~ID.13进行滤波功能。那么现在把视线转移到下面的逻辑图表中吧。图表里指示道,无论是过滤器1还是过滤器2其中一方通过验收滤波,那么该报文都会被接收到RXFIFO里边。



那么我主要针对以上几个要点,稍微修改一下节点初始化函数,与变量初始化函数



//变量初始化


void Init_Data(void)


{


int i;



ACR[0]=ACR[2]='C'; //假设接收的标示符为C1**,只要写入前两个字节的标示符


ACR[1]=ACR[3]='1';



AMR[0]=AMR[2]=0x00; //这样写是为了更能了解,AMR0~3之间的等价关系


AMR[1]=AMR[3]=0x00; //接收屏蔽寄存器,依然修改为无屏蔽



TXD_Buffer[0]=0x88; //EFF格式,数据长度的 TX帧信息


TXD_Buffer[1]='C'; //目的标示符为CAN1


TXD_Buffer[2]='A';


TXD_Buffer[3]='N';


TXD_Buffer[4]='1';


TXD_Buffer[5]=TXD_Data; //发送数据


TXD_Buffer[6]=0x00;


TXD_Buffer[7]=0x00;


TXD_Buffer[8]=0x00;


TXD_Buffer[9]=0x00;


TXD_Buffer[10]=0x00;


TXD_Buffer[11]=0x00;


TXD_Buffer[12]=0x00;



for(i=0;i<13;i++) //接收缓冲变量初始化


{


RXD_Buffer=0x00;


}



TXD_Data=0x00; //发送数据初始化


RXD_Data=0x00; //接收数据初始化


}




//CAN初始化


void Init_CAN(void)


{


   unsigned char bdata temp;   //建立存储在bdata中的临时变量temp



   do


   {


      MODR=0x01;  //AFM=0,MOD3=0, 亦即双验收滤波模式(顺便进入复位模式)


  temp=MODR;  //模式寄存器-设置复位模式而且单验收滤波模式


   }


   while(!(temp&0x01));  //判断



   CDR=0x88;     //时钟分频寄存器-设置PeliCAN模式,Clock off有效


   BTR0=0x31;    //总线时序寄存器-波特率为10kbps


   BTR1=0x1c;


   IER=0x01;      //中断使能寄存器-接收中断使能


   OCR=0xaa;     //输出控制寄存器-借签...


   CMR=0x04;     //命令寄存器-释放RXFIF0



   ACR0=ACR[0];      //接收代码寄存器和接受屏蔽寄存器,在初始化过程中,只要在


   ACR1=ACR[1];    //在变量初始化函数下了一点修改,这了是可以无视的


   ACR2=ACR[2]; 


   ACR3=ACR[3];



   AMR0=AMR[0];    //接收屏蔽寄存器-无任何屏蔽


   AMR1=AMR[1]; 


   AMR2=AMR[2]; 


   AMR3=AMR[3];   //最后两位为无用位,必须设置为逻辑1



   do


   {


      MODR=0x00; 


  temp=MODR;   //模式寄存器-推出复位模式,保持双验收滤波模式


   }


   while(temp&0x01);   //判断...


}   



(没有显示完成的源码真的很抱歉,毕竟文章的长度有限,这里只露出两段函数而已)



在变量初始化函数中,主要是针对代码接收寄存器与屏蔽接收寄存器的等价关系进行了修改。在以上的例子当中,假设完整的报文标示符是'C' '1' 'A' ' B',但是在双验收滤波模式中,仅针对报文中的前两个字节进行验收功能,所以呢,只要写入 'C' 与 '1' 就行了。那么接下来有关接收屏蔽位的赋值,全部写入0x00(无屏蔽动作)就行了。



最后也不要忘了,当完成对CAN的初始化后,在初始化函数的最后一段代码中,写入MODR=0x00



结论一下:


在个人的结论中,如果要使用双验收滤波模式,还不如使用单验收滤波模式来得更直接也更容易明白!


毕竟验收动作针对的报文标示符当然是越多越好。呵呵!



这篇笔记就写到这里位置吧,有点累了。


(以上的所有内容纯属个人意见而已,毕竟也只是我的思想产物,如果还有不完整之处还要请多多包含。)


 


https://static.assets-stash.eet-china.com/album/old-resources/2009/10/23/cb05b38f-dd8f-4ae1-a1e5-f54cd44df311.rar

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条