射频识别技术漫谈(22)——RC系列射频芯片的寄存器操作

【转自】http://blog.sina.com.cn/s/blog_9ed067ad01013oob.html

前面提到,RC系列内部64个寄存器的正确操作是软件编写的关键。正确设置寄存器首先要做到与寄存器正确通信,其次是要对寄存器写入正确的值。
    RC系列射频芯片与微控制器的接口有并口和SPI接口两种类型。显然,并口通讯速度快,需要占用的微控制器I/O多,SPI通讯速度慢,但需要的微控制器I/O口少。这里需要特别说明的是,速度的快慢仅体现在控制单元与RC系类芯片本身的通讯速率上,而不影响芯片与标签或卡片的通讯速度,芯片与标签或卡片的通讯速度是由国际标准规定的,任何芯片都必须遵守国际标准。
    并口方式下RC系列芯片的D0-D7直接挂在控制单元的数据总线上,NWR、NRD、ALE、IRQ分别接控制单元对应的写使能、读使能、地址使能、外中断引脚。工作时RC系列的64个寄存器直接映射为控制单元的外部RAM空间。控制单元向RC系列写入数据和命令后,射频芯片执行的结果通过IRQ引脚向控制单元发起中断,控制单元在中断程序中处理射频芯片的响应。
    一、并口总线方式
    比如使用51单片机作为控制单元,使用总线方式,P2.7作为RC系列芯片的片选,使用Keil C51编程,RC系列芯片映射为外部存储单元的方式有两种常用方法:
    1.使用XBYTE宏
    代码如下:

[cpp]  view plain  copy
  1. #define RcBaseAddr 0x7F00    
  2.     #define RegFIFOData      XBYTE[RcBaseAddr + 0x02]   
  3.     RegFIFOData = i;     
  4.     i = RegFIFOData ;   

第一行定义RC芯片的映射基地址;第二行定义了芯片寄存器地址,此处以FIFO数据寄存器为例;后两行是对寄存器的读写实例。
    2.不使用XBYTE宏
    可以程序中软件定义一个指向RC芯片基地址的指针代替XBYTE宏,代码如下:

[cpp]  view plain  copy
  1. unsigned char xdata ini _at_ 0x7F00;    
  2.     unsigned char xdata *GpBase = &ini;    
  3.     #define ReadRawIO(addr) (*(GpBase + addr))    
  4.     #define WriteRawIO(addr,value)  (*((GpBase) + (addr)) = (value))  
  5.     #define     RegFIFOData           0x02      
  6.     WriteRawIO(RegFIFOData,i);   
  7.     i = ReadRawIO(RegFIFOData);  


第一、二行定义一个指向RC芯片的映射基地址的指针GpBase;第三、四行定义了实现读写功能的宏;第五行定义芯片寄存器地址,此处以FIFO数据寄存器为例;最后两行为对寄存器的读写实例。
 
    以上两种方法实质上没有什么区别,看一下XBYTE的宏定义就一目了然了:
    #define XBYTE ((unsigned char volatile xdata *) 0)
    可见 XBYTE只是一个指向外部RAM 0地址的修饰,帮我们把操作指向外部RAM而已。
    上面的方法对P2口有影响,在读写RC系列芯片寄存器时P2口总是输出0x7f,解决的方法是使用PBYTE或pdata,改为页寻址后读写RC系列芯片寄存器时P2口将不会变化,当然这个时候RC系列芯片的片选需要手工操作。
    二、SPI通讯方式
    在SPI通讯方式下,可以使用以下代码实现寄存器读写。

[cpp]  view plain  copy
  1. sbit   RST_RCCHIP     = P3^6;  
  2.     sbit   SCK_RCCHIP     = P2^4;  
  3.     sbit   NSS_RCCHIP     = P3^5;  
  4.     sbit   SI_RCCHIP      = P2^5;  
  5.     sbit   SO_RCCHIP      = P2^6;  
  6.     void RcSetReg(unsigned char RegAddr, unsigned char RegVal)  
  7.     {  
  8.     unsigned char idata i, ucAddr;  
  9.     SCK_RCCHIP= 0;  
  10.     NSS_RCCHIP = 0;  
  11.     ucAddr = ((RegAddr<<1)&0x7E);  
  12.     for(i=8;i>0;i--)  
  13.      {  
  14.         SI_RCCHIP  = ((ucAddr&0x80)==0x80);  
  15.         SCK_RCCHIP= 1;  
  16.         ucAddr <<= 1;  
  17.         SCK_RCCHIP= 0;  
  18.      }  
  19.     for(i=8;i>0;i--)  
  20.      {   
  21.         SI_RCCHIP = ((RegVal&0x80)==0x80);  
  22.         SCK_RCCHIP= 1;  
  23.         RegVal <<= 1;  
  24.         SCK_RCCHIP= 0;  
  25.      }  
  26.     NSS_RCCHIP = 1;  
  27.     SCK_RCCHIP= 1;  
  28.     }  
  29.     unsigned char RcGetReg(unsigned char RegAddr)  
  30.     {  
  31.      unsigned char idata i, ucAddr;  
  32.      unsigned char idata ucResult=0;  
  33.      SCK_RCCHIP = 0;  
  34.      NSS_RCCHIP = 0;  
  35.      ucAddr = ((RegAddr<<1)&0x7E)|0x80;  
  36.      for(i=8;i>0;i--)  
  37.       {  
  38.          SI_RCCHIP = ((ucAddr&0x80)==0x80);  
  39.          SCK_RCCHIP= 1;  
  40.          ucAddr <<= 1;  
  41.          SCK_RCCHIP= 0;  
  42.       }  
  43.      for(i=8;i>0;i--)  
  44.       {  
  45.          SCK_RCCHIP= 1;  
  46.          ucResult <<= 1;  
  47.          ucResult|=(bit)SO_RCCHIP ;  
  48.          SCK_RCCHIP= 0;  
  49.       }  
  50.      NSS_RCCHIP = 1;  
  51.      SCK_RCCHIP= 1;   
  52.      return ucResult;  
  53.     }  


为了促销产品,集成电路芯片的生产厂家通常都会提供产品的参考电路和参考代码。这些参考电路和参考代码一般都能支持芯片正常工作,RC系列射频芯片也不例外。使用参考电路和参考代码虽然可以实现对卡片或标签的正常读写,但卡片或标签的读写距离往往很难达到最佳。硬件上微调天线电路的一些元件参数,配合软件上调节12H和13H寄存器的值,通常可以达到产品的设计要求。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值