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

2009-10-27 15:15 3755 3 3 分类: 汽车电子

笔记七:双验收滤波(扩展帧)<?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://assets-stash.oss-cn-shanghai.aliyuncs.com/album/old-resources/2009/10/23/cb05b38f-dd8f-4ae1-a1e5-f54cd44df311.rar

文章评论0条评论)

登录后参与讨论
相关推荐阅读
akuei_2_550826815 2011-10-22 18:26
Verilog的私私细语 - 时钟化和信号的长度
目录 第2章 时钟化和信号的长度 2.01 一个时钟一块数据的概念 2.02 信号时钟化 2.03 深入了解模块的沟通 2.04 电平检测模块的整合(即时事件在时序上的不和谐)      实验八:电...
akuei_2_550826815 2011-09-08 12:47
瞎搞Time Quest 和无责任的笔记 第二章
最近整合篇的第二章的构思和灵感都累积不少了,应该是时候开工了。恰好手头上还有一本笔记还没有写完,就是这本瞎搞TimeQuest的第二章。目录笔者也懒得贴了,看过第一章的同学多少也会猜到第二章的内容是什...
akuei_2_550826815 2011-08-29 18:21
瞎搞Time Quest 和无责任的笔记 第一章
哎呀 ... 潜水了都有一段时间了,这是最近研究的成果和目标。 话说TimeQuest这个东西真的很搞怪呀,做得笔者不得不从其他的方向去研究它。 好了还是切入正题,TimeQuest用作静态时序的工具...
akuei_2_550826815 2011-07-06 17:43
Verilog的私私细语 - 整合的概念
目录         02  第1章  整合的概念          1.01  源码上的整合                   实验一:字面上的整合          1.02  时钟和步骤的定...
akuei_2_550826815 2011-06-22 10:18
VerilogHDL那些事儿 - 建模篇v4 + 时序篇v1
VerilogHDL那些事儿 - 建模篇v4 ====== v4 ====== 主要是修改了大量用法上的BUG和极限的精简内容 https://docs.google.com/leaf?id=0B...
akuei_2_550826815 2011-06-10 13:19
Verilog HDL的礼物 - Verilog HDL扫盲文
目录 02第0章 Verilog HDL语言扫盲文 030.01 各种的HDL语言 030.02 HDL语言的层次 03 0.03 RTL级和组合逻辑级 040.04 Verilog HDL语言真的那...
我要评论
0
3
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /4 下一条