物联传媒 旗下网站
登录 注册
RFID世界网 >  技术文章  >  其他  >  正文

基于ARM 平台的RFID 系统设计与实现

作者:北京邮电大学电信工程学院 汪曦鹏
来源:RFID世界网
日期:2007-12-14 15:38:43
摘要:RFID(无线射频)技术作为近年来兴起的一项新兴的自动识别技术。由于其具有读取距离远、穿透能力强、抗污染、效率高、信息量大的特点,已经得到广泛的开发与应用。 本文给出了一种ARM 平台的RFID 系统设计与实现方案,并已经过测试。
1. 引 言 

近年来,RFID(无线射频)技术是正在兴起的一项新兴的自动识别技术。RFID 利用射频方式进行非接触双向通信,从而实现对物体的识别,并将采集到的相关信息数据通过无线技术远程进行传输。相较目前广泛采用的条型码技术,RFID 具有读取距离远(几米至几十米)、穿透能力强(可透过包装箱直接读取信息)、抗污染、效率高(可同时处理多个标签)、信息量大的特点。它的出现给物流和生产方面的工业应用带来了革命性的影响[1]。 

正是由于上述原因,本文提出了一种基于ARM 平台的RFID 系统设计与实现方案,以满足人们在嵌入式领域对RFID 技术的开发与应用。 

2. 系统介绍 

2.1 系统硬件设计 
硬件系统框图:如图处理器采用现行嵌入式系统中最流行ARM系列,具体采用ATMEL公司的工业级ARM 芯片。FLASH为4M,采用的芯片是AM,用于存储LINUX内核,RAMDISK和一些系统配置文件和测试数据。SDRAM为 M,采用的芯片是MT48LC2M32B2TG-6。网络接口的物理层芯片采用RTL8201。同时还配有输入输出设备,即LCD显示屏和5×4键盘。电源采用稳压模块输出稳定的电压,同时设计有单键开关和充电电路等方便用户的功能[2]。 

2.2 系统软件设计 
我们采用LINUX作为系统的操作系统,给标准LINUX打上支持ARM系列的补丁包后内核便提供了对AT91RM9200的支持(我们称之ARM-LINUX),在ARM-LINUX之下,编写键盘,LCD,网卡,FLASH文件系统的驱动程序。在ARM-LINUX上编写一个小型简洁的GUI(图形界面用户接口),使程序更加模块化,便用上层程序的编写和以后系统的升级。如图是软件系统框架图。 

3. 硬件电路设计 

3.1 单键开关电路设计 
单键开关设计必须考虑到以下几点:一是单键开关必须稳定,按一次键只有一次电源的通或断;二是电流问题:因为单键开关无论是关机的时候还是开机的时候都要使用电源,所以必须保证其电流足够小,减少电源的损耗。通过查找资料,我们设计了以下电路(图3): 

该电路的工作原理是:Q8(2N7000),Q7(IRF8540)分别为N沟道和P沟道场效应管,其开启电压(GS之间的电压)分别为3V和-2V,当BP17放开的时候,Q8的GS之间电压很小,Q8截止,D端电流很小,所以R11上的压降很小,Q7的GS端之间的电压很小,Q7同样截止,所以没有电压输出。BP17闭合时,R11,BP17,R21,C69形成回路,电源对C69充电,当C69的电压上升到大约3V时,Q8导通,Q8上D级电流增大,R11上的压降增大,Q7导通,由于Q7导通后的阻抗很小,所以电源类似于接通,对C69继续充电,直到达到电源电压。当再次按下BP17时,C69通过开关放电,电压降低,当降到3V以下时Q8截止,同时Q7也截至,开关关闭。此系统在Q7,Q8没有导通前,MOS管的阻抗很大,所以功耗电流很小。

3.2 充电电路设计
充电电路可以为用户提供很大的方便。一般情况充电电路需要达到的要求是:必须保证电池充电时不过充;充电时间不能太短,但同时也要保证充电电流不能太大;有充电指示。根据上面以上要求,我们设计了以下电路 

该电路的工作原理是:LM7812是一个稳压模块,为系统提供稳定的9V电压。LM555是一个触发器,管腿二和管腿六是触发端,管腿五是参考电压,当管腿二的电压小于管腿五和管腿六的三分之一电压小于管腿五的时候,管腿三输出0V;当管腿二的电压小于管腿五但管腿五的电压大于管腿六的三分之一电压的时候,管腿三输出VCC;当管腿二的电压大于管腿五时候,管腿三输出0V。当该系统上电但没有放充电电池的时候,满足上述条件一,所以管腿三输出0V,二极管不亮;当把待充电池接在VCC端的时候,通过C45滤波(防止干扰脉冲)的采集电压传送到管腿二和管腿六,因为电池本身有电压,所以这个时候满足上述条件二,管腿三输出9V开始充电,发光二极管变亮;当充电完毕,电池达到指定电压时,满足上述条件三,管腿三输出0V,充电结束,发光二极管熄灭。综上所述,只要参考电压足够精确,就不会造成电池过充现象。同时充电电压能够达到9V,所以调节R52完全可以在充电电流和充电时间上进行权衡。所以此电路可以达到上述要求。 

3.3 PROTEL 电路设计和电路板布线的基本流程 
原理图部分:建立自己的元件库。因为并不是所有的元件在PROTEL的元件库中都存在,一般要根据自己实际所用的芯片建立自己的元件库。绘制原理图。当器件比较多的时候,可以采用层次设的方法。分模块对系统进行设计,这样可以使系统更加清晰,降低错误的可能性。原理图画好后,利用其自动编号功能对器件进行编号。PCB板部分.建立自己的封装库,同元件库一样,有时候必须建立自己的封装库,在画封装的时候,要严格按照芯片公司的资料绘制。为每一个元件设置封装。用向导产生PCB文件,定义好电路板的层数和边界。利用设计同步器将器件导入到PCB中。根据具体的工艺设计好规则,如过孔大小,最小线宽。按照易于布线的原则对元件进行布局布线,在布线的时候要遵循一些原则。检查错误。 

4. 系统软件设计 

4.1 LINUX 在AT91RM9200 上的移植 
AT91RM9200两种启动方式:1.其内部存储器地址为0x00100000-0x001FFFFF的部分存在一段启动程序,如果选择这种启动模式在启动时,0x00100000-0x001FFFFF部分的地址被映射到0x00000000,CPU运行这段程序,这段程序会往CPU的调试串口(或者是USB口)不停的发字符“C”,同时提供小于12K程序的串口(利用XMODEM协议)下载功能。2.可以直接从外部存储器启动,主要是连接在SPI(串行外部设备接口)和NCS0(CPU上的一个管腿,是EBI即外部总线接口的一部分,用于外部存储器的寻址)上的SPI DataFlash,Two-wire EEPROM和连接在NCS0上的8比特并行存储器。 

根据CPU的启动方式,我们可以这样设计移植过程及系统的启动方式。在系统移植阶段,我们应用启动方式1,通过其下载功能下载一个小于12K的程序(实际使用的程序为Loader,是开放源码的软件,可以在网上下载到)到SDRAM并运行,该程序可以提供大于12K的串口下载功能,用这个程序下载一个更大的程序到SDRAM中,而这个程序可以提供类似于PC机上BIOS的功能(实际使用的是U-BOOT,是开放源码的软件,可以在网上下载到),其功能主要有:LINUX系统引导,网卡驱动,TFTP下载功能,SDRAM和FLASH之间的读写功能。 

通过其TFTP下载功能下载内核到SDRAM,引导操作系统并进行测试。如果操作系统测试工作无误后,可以应用U-BOOT的写FLASH功能把U-BOOT和LINUX内核写到FLASH中,在应用程序开发阶段应用CPU的启动方式2,直接从FLASH启动。这种方法的优势是:在内核下载的时候,提供了TFTP下载功能,加快了速度。在应用程序开发阶段,因为内核(还有后面的RAMDISK)都是固化在FLASH中,可以省去其下载过程,同样也可以节省时间[3]。 

移植过程大致可分为以下几个步骤:配置用户环境及交叉编译环境;编译Loader和UBoot,其中要在UBoot中修改网卡驱动;3.配置Linux内核;4.制作ramdisk文件系统,并根据实际系统进行修改;5.移植Busybox;6.JFFS2文件系统的移植。在Linux内核中已经包含了MTD和JFFS2文件系统的驱动程序,但是必须针对具体的系统编写驱动程序。具体步骤如下:1)由于ROM设备和MTDBlock设备的主设备号(major)都是31,所以如果你不想把JFFS2作为根文件系统的话,必须修改他们之一的major。2)编写驱动程序:编写读,写,复制接口(这些接口将被MTD驱动程序调用,提供给上层软件的读写复制功能),定义map_info结构体,以便MTD能够从这个结构体中得到读写函数的指针,最后还要定义FLASH的分区表。根据系统的设计,我们把4M的FLASH分成四个区,第一个分区用来保存UBOOT及其参数;第二个分区用来保存LINUX内核;第三个分区用来保存RAMDISK;最后一个分区用来保存系统参数和用户数据和测试数据。3)修改LINUX的配置文件,把驱动程序加入到内核[4]。 

4.2 LINUX 驱动程序的编写 
我们研究字符型设备的驱动程序的编写,块设备驱动程序跟字符设备驱动程序的编写有一定的相似性。 

驱动程序加载时,内核会调用用户定义的初始化程序。用户用init_moudle(function name)标识初始化程序,其中的function name为编写的初始化函数的函数名。用module_exit(function 
name) 标识释放设备程序,在初始化函数里驱动程序必须向操作系统注册设备,以获得系统资源和操作系统正确的调用驱动程序。在Linux中这个函数是register_chrdev,在fs/devices.h中其定义为:int register_chrdev(unsigned int major,const char* name,struct file_operation *fops)。 

其中major是为设备向系统申请的主设备号,name驱动程序给设备定义的名字,fops是接下来要介绍的一个结构体。在卸载的时候需要告知操作系统注销注册[5]。 

下面简要介绍一下file_operation结构体中几个主要的比较常用的方法。 

1. ssize_t (*read) (struct file *, char *, size_t, loff_t *);用来从设备中读取数据。 
2. ssize_t (*write) (struct file *, const char *, size_t, loff_t *);向设备发送数据。 
3. int (*ioctl) (struct inode *,struct file *,unsigned int,unsigned long);系统调用ioctl提供了一种 
执行设备特定的命令的方法(如格式化软盘某个磁道,这既不是读操作也不是写操作)。 
4. int (*open) (struct inode *, struct file *);始终是对设备文件执行的第一个操作。 
5. int (*release) (struct inode *, struct file *);当file 结构被释放时,将调用这个操作。 

4.3 RFID 程序的编写 
本系统采用的RFID 芯片是SONY 生产的RC-S600,它有自己的通信协议,并支持串口或者USB 口直接连接。这就大大方便了系统的开发与应用。由于本系统采用的是标准串口连接方式,因此针对应用程序的要求,我们首先要提供一套关于串口的API 接口函数。 

1. int PortOpen(pportinfo_t pportinfo); 打开串口,返回文件描述符。pportinfo: 待设置的串口信息。 
2. int PortSet(int fdcom, const pportinfo_t pportinfo);设置串口。fdcom: 串口文件描述符,pportinfo: 待设置的串口信息。 
3. void PortClose(int fdcom);关闭串口。fdcom:串口文件描述符。 
4. int PortSend(int fdcom, char *data, int datalen);发送数据。fdcom:串口描述符,data:待发送数据,datalen:数据长度。返回实际发送长度 。 
5. int PortRecv(int fdcom, char *data, int datalen, int baudrate); 接收数据。fdcom:串口描述符,data:接收缓冲区,datalen.:接收长度, baudrate:波特率。返回实际读入的长度。 

完成了串口通信的基本函数后,可以通过由串口向RFID芯片发送命令字进行控制,以下为RC-S600的Command说明:1. Polling Command。从指定了System Code的卡里,取得制造ID(IDm)和制造Parameter(PMm)的指令。2. Diagnose R/W 。RC-S600系列进行自我诊断,取得诊断结果的指令。3. Turn off RF Power。将RC-S600系列的RF输出置于Off;4. Check Firmware Version。取得RC-S600系列的Software的版本号;5. Control LED。对连接到RC-S600的LED进行On/Off;6.Communication Thru。对卡发送1次host指定Command,根据是否从卡收到Response,向host返回该Card Response Packet;7. Access I/O Register。对RC-S600系列的RF进行初期设定。 

经测试,本系统能对所用RFID芯片的指定命令字进行正确读写和返回。 

5. 结论 

本文给出了一种基于ARM 平台的RFID 系统设计,现已通过实际测试。由于本系统采用的是标准接口设计,这就为以后的多功能开发平台提供了理想的硬件环境。 

参考文献 
[1] 胡晓娜. RFID 的前景.http://products.rfidchina.org . 2007.6。 
[2] Atmel. Datasheet of AT91RM9200.http://www.atmel.com . 2003.8。 
[3] 杜春雷.ARM 体系结构与编程.北京:清华大学出版社.2003.5。 
[4] 马忠梅.AT91 系列ARM 核微控制器结构与开发.北京:北京航空航天大学出版社.2003.5。 
[5] 刘淼.嵌入式系统接口设计与Linux 驱动程序开发.北京:北京航空航天大学出版社.2006.5。