基于ARM嵌入式系统的RFID驱动程序设计
2.3 RFID驱动程序设计 RFID的读操作将判断缓冲区是否为空,如果不为空,就把缓冲区中的数据拷贝至数据结构中,并拷至用户空间中;如果为空,进程就会进入休眠,等待缓冲区接收到数据后,进入中断唤醒进程。在进入ShockBurst RX模式后,本地nRF905会自动监测空中的信息,在nRF905发现和接收频率相同的载波时,载波检测信号CD被置高,触发中断,在中断例程中只是延时一段时间,等待nRF905接收到有效的目的地址时,地址匹配信号置高。当nRF905接收到有效的数据包后,数据准备就绪信号DR会触发中断,进入中断例程,进入Standby模式,把接收到的数据通过SPI接口读入缓冲区内,而后唤醒进程,把缓冲区中的数据拷贝至用户空间中。当所有的数据被读出后,nRF905的AM和DR信号线会被置低。nRF905切换到下一状态。RFID驱动接收流程如图3所示。 3 功能测试
完成SPI底层驱动后,上层RFID驱动的内容主要是对nRF905配置寄存器进行配置,包括发送接收数据的字节数、目标地址、工作模式、时钟频率等通过nRF905自定义的SPI指令写入寄存器中。因此要对SPI驱动中的write/read函数进行封装,通过调用SPI驱动中的函数完成整体驱动的寄存器配置和数据传输功能。
RFID驱动程序作为设备文件,同样分为write、read、open、release、ioctl等几个操作。RFID驱动程序的写操作过程:首先将用户空间中的数据拷贝至数据结构中;然后使nRF905进入Standby模式,调用SPIwrite函数对数据寄存器和地址寄存器进行配置,把发送数据和目标地址写入本地nRF905,之后进入ShockBurst发送模式,由本地nRF905向目标nRF905发送数据;最后进程进入休眠状态,等待数据准备信号DR触发中断,由中断处理例程唤醒进程,完成数据发送。图2为RFID的发送流程图。
测试主要分为两部分,首先对底层SPI接口部分做调试,然后在此基础上,对RFID驱动进行功能测试。
硬件方面,利用S3C2440开发板的扩展口与nRF905模块连接,扩展口中用到的GPIO资源在驱动程序中设置。另外,用RS-232串口将开发板与PC机相连,利用内核的Debug功能[6],通过PC机对开发板进行控制,完成驱动加载和应用程序的运行。
软件方面,基于S3C2440的嵌入式平台需要完整的嵌入式操作系统资源,包括bootloader、kernel、文件系统。在对内核进行剪裁后,将bootloader、kernel、文件系统通过JTAG烧入NAND Flash中。操作系统要保证内核、文件系统以及硬件设备正常运行。
3.1 SPI驱动功能测试
SPI驱动测试主要测试驱动程序的功能,测试驱动程序是否能够控制SPI主从设备正确传输数据。资源包括S3C2440开发平台、Linux2.6.12内核源码包、示波器。系统运行后,加载SPI驱动,运行编写的上层应用程序进行数据收发,并用示波器观察波形。
3.2 RFID驱动程序测试
在测试SPI驱动成功后,重新启动系统,待系统成功运行后,加载RFID驱动程序,运行为其编写的测试程序,测试两nRF905无线模块间的通信。S3C2440的GPIO资源与nRF905信号线对应关系如下:
Power down模式: PWR GPJ12
载波检测输出: CD GPG6
地址匹配输出: AM GPB9
数据就绪输出: DR GPG1
SPI主入从出: MISO GPE11
SPI主出从入: MOSI GPE12
SPI时钟: SCK GPE13
SPI使能: CSN GPB10
发送/接收使能: TRX_CE GPG8
发送/接收模式: TX_EN GPG0
两个平台分别为:ARM9嵌入式平台和MSP430单片机平台。在ARM平台运行发送测试程序,而单片机平台运行接收测试程序,之后交换。接收端将接收到发送端发送的数据,并将数据在PC机终端显示。
当ARM发送端的应用程序中发送字符串“aaaaaaaa”时,单片机端的nRF905模块接收寄存器中收到转换后的ASCII码“97”;当ARM端作为接收端而单片机作为发送端时,ARM端运行接收程序后,在用户空间即显示终端上显示了接收到的数据“abcd…”。表明此RFID驱动程序成功实现了控制nRF905无线收发器进行数据接收传输的功能。
本文介绍了一种基于ARM9 S3C2440嵌入式平台扩展RFID驱动的设计方案,设计了硬件扩展电路和相应的驱动程序,通过了并测试。实现了嵌入式平台间的RFID短距离即时通信功能。嵌入式RFID驱动将推动RFID技术在应用领域中的发展,将会支持更多的射频硬件,根据此驱动可以开发更多的应用程序,满足多种需求。
参考文献
[1] 董丽华.RFID技术与应用[M].北京:电子工业出版社,2008.
[2] SAMSUNG.S3C2440A user’s manual reltminary[OL]. Revision0,2004.
[3] NORDIC Semiconductor.nRF905_rev1_1[OL].2004:1-36.
[4] 刘淼.嵌入式系统接口设计与Linux驱动程序开发[M]. 北京:北京航空航天大学出版社,2006.
[5] Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman. Linux device drivers[M].Sebastopol:O’Reilly Media,2005.
[6] BOVERT D P,MARCO C著.深入理解Linux内核(第三版)[M].陈莉君,张琼声,张宏伟,译.北京:中国电力出版社,2007.
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)