我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1463|回复: 1

多标签多协议RFID读写器设计 - 通信/网络 - 电子工程师俱乐

[复制链接]

该用户从未签到

1万

主题

1292

回帖

936

积分

管理员

积分
936

社区居民最爱沙发原创达人社区明星终身成就奖优秀斑竹奖宣传大使奖特殊贡献奖

QQ
发表于 2013-3-30 00:35:53 | 显示全部楼层 |阅读模式
<strong>1 引言</strong>

国内现有RFlD读写器,一般仅支持一种协议,且功能较为单一。本设计使用最新的RFID芯片。实现了支持多种协议及协议自适应功能的RFID读写器。该读写器易于扩展,可根据需要实现各种功能。

<strong>2 硬件设计</strong>

多协议读写器系统硬件框图如图1所示.其主要由四部分组成:核心控制模块、阅读器模块、人机接口模块和通用外设接口。多协议读写器使用Linux嵌入式操作系统,阒此核心控制模块的CPU选择三星公司基于ARM9内核的S3C2410芯片,它与RAM和Flash Rom共同组成核心控制模块。阅读器模块由TRF7960以及外围的射频电路和PCB天线组成,考虑到端口资源和布线的冈素,阅读器与CPU通过SPI和中断接口相连接。TRF7960是TI最新的高频RFID读写芯片,支持IS014443A/B,ISO15693,IS018000-3和Tag-it等协议,主要完成各协议所规定的组帧/拆帧、调制/解调等功能,以及上下变频、功放、小信号放大等射频信号处理。人机接口采用LCD和触摸屏,另外,由于S3C2410内带液晶和触摸屏的驱动,因此可省却这部分电路。为了实现与多种设备的互通,以及扩展无线数据传输等功能,设计了USB。SD,RS232等多种通用接口。

<strong>3 软件总体设计</strong>

本文提出一种基于Linux2.6操作系统的多协议RFID读写器软件设计方案。主要实现TRF7960设备驱动和读写器控制程序,前者完成TRF7960模块的控制和协议实现,后者通过对前者的调用完成协议选择和标签数据的处理。

软件总体设计框图如图2,整个软件结构分为应用层和驱动层。应用层是基于QT的主程序,主要完成数据的收发、处理、交换和人机界面的实现。驱动层包括TRF7960驱动和多种标准驱动,TRF7960驱动完成数据的采集和向应用层的传递,其中的设备接口程序通过GPIO操作7FRF7960,并结合中断处理程序和多协议控制程序完成数据的收发,并通过标准接口程序和读写器控制程序连接;标准驱动程序则为应用层提供各种标准硬件设备的操作,为系统的扩展提供了良好的条件。


<ignore_js_op>





2010-3-30 12:15:35 上传
<strong>下载附件</strong> (3.02 KB)




</ignore_js_op>

图1系统硬件框图


<ignore_js_op>





2010-3-30 12:15:35 上传
<strong>下载附件</strong> (6.37 KB)




</ignore_js_op>

图2软件总体设计框图

<strong>4 软件设计详述</strong>

4.1设备接口程序设计

设备接口程序是对TRF7960硬件直接操作的程序,主要完成GPIO的配置,并输出符合TRl'7960工作时序的SPI控制时序,通过该时序对TRF7960寄存器进行读写操作。

操作系统已完成GPIO硬件端口与软件之间的映射,因此只需调用相应的内核函数,就能实现对GPIO的控制。设计中使用的内核函数有:GPIO端口配置函数s3c2410_gpio_cfgpin(),GPIO端口输出函数s3c2410_gpio_setpin()和GPIO端口输入函数。s3c2410_gpio_getpin(),通过这些内核函数完成各个端口的配置和初始化,并实现TRF7960工作需要的SPI时序。根据S3C2410 Data Sheet, 将S3C2410_GPG7、S3C2410_GPG6、S3C2410_GPG5、S3C24l0_GPF1的属性务别配置为输出、输出、输人和外部中断1,依次对应设计中的SPICLK、SPIMOSI、SPIMISO和中断。外部中断触发模式使用函数set_irq_type()设置为上升沿触发,并通过函数request_irq()注册中断处理程序。

根据TRF7960串行SPI时序要求,当SCLK(SPICLK)为高电平时,Date_IN(SPIMOSI)出现上升沿表示起始位,DATA_IN(SPIMISO)出现下降沿表示结束位。在起始位和结束位之间传输8比特数据(可以是地址,数据或命令),高位先传。发送时,CPU在SCLK为高电平时将数据放到DATA_IN上,接收时,TRF7960在SCLK出现上升沿时将数菇放到DATA_OUT(SPIMISO)上,供CPU采集。

4.2 TRF7960操作方式

基于以上时序的实现,CPU可以通过地址模式和命令模式对TRF7960进行操作,在地址模式下,主要完成寄存器的配置和FIFO数据的读取,在命令模式下,完成直接命令的发送,如初始化,接收使能等。cPu还可以通过连续方式和非连续方式进行数据的收发,在非连续方式下,对指定寄存器地址只进行一个字节的数据读写,主要用于对单个寄存器的配置,在连续方式下,从指定起始地址,每字节收发后地址自动加l,实现多字节数据的连续读写。基于以上各种操作方式,可以确定发送和接收数据的流程。

连续发送数据流程的实现在文献巾有明确的阐述,下面为连续读取数据的流程:CPU向TRF7960发送起始位,再发送连续读命令字节(具体命令表见),随后CPU采集TRF7960放到DATA_OUT上的串行数据,读取指定字节的数据,最后CPU发送结束位。特别的,在串行SPI模式下,中断状态寄存器(地址OxOC)的读时序是特殊的。必须在读完0x0C寄存器后,再空读8个时钟周期。才能读取正确的寄存器数据。

4.3中断处理流程

数据的发送和接收都需要结合相应的中断才能完成。TRF7960硬件上只有一个中断响应,CPU需要根据中断状态寄存器(Ox0c)判断不同的中断类犁,必要时需要结合FIFO状态寄存器(0xlc)进行相应的操作。中断处理程序的流程为:先读取中断标志寄存器和FIFO状态寄存器,再置各个标志位,最后根据不同的标志位执行相应的操作。以接收结束标志为例:根据FIFO寄存器的值,读取并存储数据后退出中断。

4.4协议程序实现

协议程序实现各协议规定的命令格式和算法流程,并通过配置TRF7960相关寄存器选择协议,实现多协议及协议自适应的功能。下面以IS015693协议为例,介绍该协议的多卡识读命令及算法流程的实现。

多卡识读算法是一种逐位搜索算法,在多卡识读状态下,读写器的一轮查询分为16个间隙(slot),从1开始依次标记。在每个时隙中,读写器通过发送不同参数的Inventory命令(获取系统信息命令)查询当前磁场范围内标签的卡号,标签内则采用相对应的比较机制影单,读写器通过中断,处理碰撞或接受卡号,并发送EOF命令切换到下一个时隙,如果一轮查询结束后有碰撞发生,再进行新的一轮查询。

Inventory命令主要是通过掩码长度(masklength)和掩码值(maskvalue)这两个参数实现防碰撞算法。下面举例说明算法的实现:设定掩码长度=0,掩码值=0,当Inventory命令序列发送后,掩码值会被自动与卡的UID的最低位比较,因为0≠2≠8,所以两张卡均不会打。同样的命令,如果掩码值=2,则第一张卡回答;当掩码值=8时,第二张卡回答。如果两张卡的卡号是:E00700000158D1D2和E0070000015869E2,则当掩码长度=0,掩码值=2时两张卡均回答,则发生冲突,解决的方法是:令掩码长度=4,掩码值=X2,X从0到F自增,这样,X2=D2时第一张卡回答,X2=E2时第二张卡回答。依次类推。

T1在文献中给出了递归的防碰撞算法的大致流程,虽然递归算法具有结构清晰、程序简练易读的特点,但通常需要执行大量的过程调用,并在堆栈中保存所有返回过程的局部变量,效率往往较低,尤其是在嵌入式系统中,系统内存有限,当进行递归调用时,堆栈容易益处,可靠性低。因此我们提出非递归的防碰撞方法,具体流程图如图3,使程序更高效更可靠。

算法中时隙指针具体处理如下,时隙指针的首地址初值设为O,用来标记无碰撞时隙,退出循环。当检测到碰撞中断,时隙指针先下移1位,记录碰撞时隙标号,再下移1位,记录当前掩码值,最后下移1位,生成新掩码长度(旧掩码长度+4)。新掩码生成规则为碰撞时隙标号左移新掩码长度位冉加上旧掩码值,即掩码值=(*(时隙指针一2))<<(*(时隙指针))+(*(时隙指针-1)),随后时隙指针=时隙指针-3,去除已处理掩码信息。


<ignore_js_op>





2010-3-30 12:15:35 上传
<strong>下载附件</strong> (10.26 KB)




</ignore_js_op>

图3非递归的防碰撞算法流程图

采用这种逐位搜索算法读取多张标签的卡号后,通过指定卡号的命令,可以完成对特定卡的读写,实现了防碰撞的多卡识读。

4.5 TRF7960驱动与应用层接口实现

TRF7960驱动与应用层之间的接口是由读写器控制程序和标准接口程序共同完成的。读写器控制程序包含在主程序中一个自定义类的成员函数中,它通过一组固定的入口点(open,write,ioctl,read等函数)调用标准接口程序中相应的函数。当TRF7960已经通过insmod注册到linux系统中,通过调用fd=open("/dev/trf",O_RDWR)打开TRF7960驱动并返回该驱动文件标识符;write函数根据文件标识符fd调用trf write,完成对各个端口定义及初始化,具体实现在4.1已介绍;ioctl函数调用trf_ioctl,选择TRF7960的工作方式;read函数调用trf_read,而trf_read通过调用内核函数copy_to_user()实现数据从驱动层到应用层的传递,当主程序完成ioctl功能时,就需调用read函数来读取驱动层的数据;close函数负责关闭驱动。

4.6多协议、协议自适应功能的实现

读写器控制程序中的ioctl函数调用其在驱动中对应的trf_ioctl甬数实现多协议和协议自适应功能,它通过设置参数cmd,选择不同的协议工作方式。当cmd为0时,选择在IS014443A协议下工作,cmd为1时。选择IS014443B;cmd为2时,选择IS015693;cmd为3时,选择IS018000—3;cmd为4时,选择自适应丁作方式。当选择协议自适应的工作方式后,程序先配置主寄存器及相关寄存器,根据指定协议进行相应的读写操作,在设定时间内,若有FIFO中断或发送结束中断产生,则采集数据并保存,否则切换协议,直到各个协议都轮询一遍,最后退出。这样就实现了具有多协议,防碰撞多标签,协议自适应RFID读写器。

<strong>5 结束语</strong>

本文设计了一款基于嵌入式CPU和Linux操作系统的RFID读写器,对软硬件设计进行了详细的描述。该设计的创新点在于实现的滨写器支持多种协议和协议自适应的功能。且和现有的单一功能的读写器相比具有更好的扩展性和图形化的用户界面,应用更广泛,如通过移植USB无线网卡,可实现尤线RFID读写器,义如通过SD接口与900M RFID读写器相连,实现多频段RHD读写器。该读写器作为手持终端,可在世博场馆、博物馆等复杂环境下,为用户提供快速,高效、便捷的人性化服务,应用前景广泛。

本文作者创新点:该设计实现了基于嵌入式CPU和Linux操作系统的RFID读写器,具有防碰撞功能,支持多种协议和协议自适应的功能。具有多种外设接口,具备良好的扩展性和用户友好的图形化界面。


作者:朱臣元,俞晖  来源:《微计算机信息》(嵌入式与SOC)2009年第3-2期
回复

使用道具 举报

该用户从未签到

0

主题

509

回帖

671

积分

二级逆天

积分
671

终身成就奖社区居民宣传大使奖

发表于 2014-9-10 16:18:51 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表