引言
物联网产业的兴起为RFID技术的发展和广泛应用带来了契机。超高频(UHF)读写系统凭借其读取距离远、读写速度快、并发读取标签数多、标签价格低廉等优点,将成为RFID领域未来研究和发展的热点。但目前国内市场上UHF读写器种类较少,接口单一,使用时难以摒弃传统的读写器加PC机操作模式。这些缺点限制了UHF读写器的大量使用,尤其是在物流这类需要远程物品识别和信息获取的场合。本文以射频识别芯片AS3990为基础,描述了基于网卡芯片ENC28J60的网络读写器的硬件和软件设计方案,使得读写器可以直接连入因特网,进行远程数据获取和参数配置,增强了UHF读写器的实用性。
1 硬件设计
读写器总体设计框架如图1所示。主控制器采用基于ARM7TDMIS内核的控制器LPC2138,该芯片具有32 KB的片内SRAM和512 KB的片内Flash存储器。外部接口丰富,能够很好地满足读写器设计的要求。采用射频芯片AS3990实现了ISO180006C(即EPC GEN2)协议中要求的标签交互,并为外部控制器提供两种接口访问方式。控制器只需发送简单的控制和配置命令,AS3990即可完成与电子标签的交互过程。ENC28J60是兼容IEEE802.3的10M以太网网卡芯片,它通过SPI口与控制芯片实现数据交换。电源模块采用电源芯片EZ10853.3为各个模块提供稳定的3.3 V直流供电。
图1 读写器总体设计框架
1.1 射频芯片接口电路
AS3990是Microsystems公司研制的一款用于超高频RFID读写器的符合ISO180006C标准的专用射频芯片。其内部集成了接收电路、发送电路、协议转换单元、控制接口等部分,用户只需外接少量的射频电路即可完成读写模块的功能设计。
AS3990可以通过并行接口或串行SPI接口与主控制器LPC2138进行交互。射频芯片接口电路如图2所示。IO0~IO7用于并行接口,其中IO6和IO7也可用于SPI口的数据发送;引脚CLK作为SPI接口的时钟线使用;EN引脚为AS3990的使能引脚;IRQ为AS3990中断引脚。
图2 射频芯片接口电路
为了降低相位噪声对读写性能的影响,电路中使用了外部压控振荡器(VCO)。VCO的输出连接在EXT_IN引脚上。另一方面,AS3990通过CP脚控制压控振荡器。20 MHz的温度补偿型石英晶体谐振器TCXO连接在OSCO引脚上,作为基准振荡器,这样可以进一步提高芯片的稳定性。
由于AS3990内部未集成功率放大器,所以需要外接功率放大器PA.当使用外接PA模式时,经AS3990调制后的射频信号在RFONX和RFOPX输出,两路射频信号经过平衡/不平衡变换器转换为单路射频信号后进入PA进行功率放大。AS3990的模拟输出引脚DAC用于控制PA的增益。环形器用于将发送通路和接收通路隔离。同样,接收到的射频信号经过平衡/不平衡变换器转换为两路差分信号,AS3990内部解调电路对两路信号解调得到数据。
1.2 网卡芯片接口电路
ENC28J60是Microchip公司生产的28引脚独立以太网控制器,它内置了10 Mbps以太网物理层器件和介质访问控制器,符合IEEE 802.3标准,特别适合于嵌入式设备的入网解决方案。ENC28J60通过SPI接口与控制器LPC2138交互,网卡芯片接口电路如图3所示。SO、SI、SCK为SPI接口的3条总线,CS为ENC28J60的片选信号,中断信号INT和WOL分别连接到主控制器的EINT3和EINT1上。芯片ENC28J60的2条差分接收引脚TPIN和2条差分发送引脚TPOUT外接在一个1:1脉冲变压器上,脉冲变压器输出接至网口座上。
图3 网卡芯片接口电路
2 软件设计
网络读写器软件设计包括μC/OSII移植、LwIP协议栈移植、网卡驱动程序和上层应用程序的编写4个部分。软件设计整体框架如图4所示。
2.1 μC/OSII移植
操作系统移植是LwIP协议栈移植和应用程序编写的基础[3],其在LPC2138上的移植内容包括:
① 完成操作系统所需的基本配置和数据类型定义、开关中断函数文件OS_CPU.H的编写。
② 在文件OS_CPU.C完成堆栈初始化函数OSTaskStkInit()函数,并根据自身需求编写相关Hook函数。
③ 利用文件OS_CPU_A.S完成启动最高优先级任务的函数OSStartHighRdy、任务切换函数OSCtxSw、中断级任务切换函数OSIntCtxSw、系统时钟中断服务函数OSTickISR的编写。
④ 初始化定时器0,为系统提供时钟。
2.2 LwIP协议栈移植
① 完成LwIP协议内部使用的数据类型的定义,如u8_t、s8_t、u16_t、u32_t等。这样使得协议栈内部使用的数据类型不再受移植平台处理器和编译器的影响,增强了协议栈的可移植性。移植时,根据编译器和移植平台事先定义好这些数据类型,定义如下:
typedef unsignedcharu8_t;//定义8位无符号整数
typedef signedchars8_t;//定义8位带符号整数
typedef unsignedshortu16_t;//定义16位无符号整数
typedef signedshorts16_t;//定义16位带符号整数
typedef unsignedintu32_t;//定义32位无符号整数
typedef signedints32_t;//定义32位带符号整数
② 定义临界区保护函数用于开关中断,定义结构体封装宏以避免编译器地址自动对齐。LwIP的实现基于这样一种机制,即上层协议已经明确知道了下层所传上来的数据的结构特点,上层直接使用地址计算得到想要的数据,而避免了数据递交时的复制与缓冲。所以需定义结构体封装宏,禁止编译器的地址自动对齐以防止数据结构被打乱。
③ 实现与信号量和邮箱操作相关的函数[5],比如建立、删除、等待、释放等。LwIP使用邮箱和信号量来实现上层应用程序与协议栈间、下层硬件驱动与协议栈间的信息交互。这些函数可以通过调用μC/OSII提供的信号量、邮箱函数来实现。
④ 实现一个与等待超时相关的函数sys_arch_timeouts.该函数能够返回当前协议栈超时事件链表的首地址。在初始化LwIP进程时,会同时初始化一些超时事件,如ARP超时、TCP超时等,当某些事件等待超时后,协议栈会自动调用一些超时处理函数作相关处理,以满足TCP/IP协议栈的需求。
⑤ 实现创建一个进程的函数,可以通过操作系统提供的OSTaskCreate函数完成。
2.3 网卡驱动程序编写
网卡芯片生产厂商一般都提供了丰富的驱动函数,对这些接口函数进行相应的封装,将接收到的数据包封装为LwIP协议栈熟悉的数据结构,将发送的数据包封装为芯片熟悉的数据结构。发送数据包和接收数据包的函数需要被实现。芯片与控制器LPC2138接口定义如下:
#defineSPI_SCK(0x01﹤﹤4) //P0.4
#defineSPI_MISO(0x01﹤﹤5) //P0.5
#defineSPI_MOSI(0x01﹤﹤6) //P0.6
#defineENC28J60_CS(0x01﹤﹤8) //P0.8
#defineENC28J60_INT(0x01﹤﹤9) //P0.9
2.4 应用程序编写
基于多任务环境,在读写器上创建两个任务:一个为HTTP服务器任务,此时读写器可看作是一个网络服务器,它可以响应远程的浏览器连接请求,并返回Html数据至浏览器上,这样就可以远程获取读写器状态;另一个为读写器的读写任务,此时读写器作为一个客户端使用,它需要连接到远程的控制服务器,接收服务器的配置或控制命令,以响应并进行相关操作,最后返回操作结果或数据给服务器端。应用程序流程如图5所示。
图5 应用程序流程
结语
诸如电子商务、智能物流等需要大量使用电子标签的领域的兴起,使得超高频读写器在物联网及RFID领域发挥出日趋重要的作用。目前国内市场上出现了部分UHF读写器,这些读写器大都采用USB接口或串口实现与上位机的通信。由于上位机与读写器的距离有限,这就限制了UHF读写器的自由安装,在某些远程控制读写场合不再适用。另外,由于上位机硬件资源的限制,不可能实现对大量读写器的同时实时控制。本文基于射频芯片AS3990和网卡芯片ENJ28C60提出的网络UHF读写器能够很好地解决上述问题,满足目前RFID市场的需求。