文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2011)08-0030-03
RFID具有讀取速度快、讀取距離遠(yuǎn)、儲(chǔ)存信息量大、標(biāo)簽上數(shù)據(jù)可加密、使用壽命長(zhǎng)、工作環(huán)境適應(yīng)性強(qiáng)等多種優(yōu)點(diǎn),已經(jīng)在各領(lǐng)域廣泛應(yīng)用[1]。
將RFID技術(shù)與嵌入式系統(tǒng)相結(jié)合,將射頻識(shí)別模塊嵌入到嵌入式系統(tǒng)中,在嵌入式Linux下通過(guò)設(shè)計(jì)驅(qū)動(dòng)程序?qū)崿F(xiàn)射頻模塊的收發(fā)功能。嵌入式RFID系統(tǒng)增加了RFID技術(shù)的通用性和可移植性,豐富了嵌入式系統(tǒng)通信接口外設(shè)功能,提升了嵌入式技術(shù)在無(wú)線通信領(lǐng)域的發(fā)展空間。
當(dāng)前的嵌入式系統(tǒng)中并不支持RFID系統(tǒng),所以要進(jìn)行硬件和軟件兩方面的擴(kuò)展。硬件方面主要根據(jù)nRF905無(wú)線收發(fā)器的電氣特性進(jìn)行接口擴(kuò)展,利用基于ARM9嵌入式平臺(tái)的擴(kuò)展口對(duì)nRF905進(jìn)行控制;軟件方面利用Linux內(nèi)核良好的移植性和擴(kuò)展性,編寫驅(qū)動(dòng)程序控制射頻模塊的收發(fā)功能,在底層驅(qū)動(dòng)以收集和分組數(shù)據(jù)并傳遞給上層應(yīng)用程序,由上層應(yīng)用程序與用戶進(jìn)行交互。本文所研究的基于嵌入式系統(tǒng)的RFID驅(qū)動(dòng),將為嵌入式RFID系統(tǒng)提供底層軟硬件接口程序,為嵌入式內(nèi)核增添RFID管理機(jī)制,為上層應(yīng)用程序提供良好服務(wù),降低嵌入式RFID的開發(fā)難度,縮短開發(fā)周期,從而降低其成本,使RFID的應(yīng)用更加普及。
1 硬件電路的實(shí)現(xiàn)
圖1是nRF905無(wú)線收發(fā)器接口擴(kuò)展的硬件電路原理圖,硬件電路的實(shí)現(xiàn)主要基于S3C2440 ARM9微處理器和單片nRF905無(wú)線收發(fā)器的互聯(lián),以及根據(jù)nRF905電氣特性所做的一些外接電路。
S3C2440是一款采用ARM920T內(nèi)核的高性能32 bit處理器,其主頻高達(dá)405 MHz,采用5級(jí)流水線和哈佛結(jié)構(gòu)。S3C2440包括兩個(gè)SPI接口,每個(gè)接口分別有兩個(gè)8 bit數(shù)據(jù)移位寄存器用于發(fā)送和接收。在SPI發(fā)送期間,數(shù)據(jù)同時(shí)發(fā)送(串行移出)和接收(串行移入)[2]。因此,利用處理器的SPI接口,可以很方便地用SPI接口與nRF905無(wú)線收發(fā)模塊進(jìn)行數(shù)據(jù)傳輸。
單片nRF905無(wú)線收發(fā)器工作在433/868/915 MHz的ISM頻段。由一個(gè)完全集成的頻率調(diào)制器、一個(gè)帶解調(diào)器的接收器、一個(gè)功率放大器、一個(gè)晶體振蕩器和一個(gè)調(diào)節(jié)器組成。其所具有的ShockBurst工作模式可以自動(dòng)產(chǎn)生前導(dǎo)碼和CRC??梢酝ㄟ^(guò)SPI接口進(jìn)行編程配置。
nRF905采用Nordic公司的VLSI ShockBurst技術(shù)。ShockBurst技術(shù)使nRF905能夠提供高速的數(shù)據(jù)傳輸而不需要昂貴的高速M(fèi)CU來(lái)進(jìn)行數(shù)據(jù)處理/時(shí)鐘覆蓋。通過(guò)將與RF協(xié)議有關(guān)的高速信號(hào)處理器放到芯片內(nèi),nRF905提供給微控制器一個(gè)SPI接口,速率由專為控制器設(shè)定的接口速度決定。nRF905通過(guò)ShockBurst工作模式在RF以最大速率進(jìn)行連接時(shí),降低數(shù)字應(yīng)用部分的速率來(lái)降低在應(yīng)用中的平均電流消耗。在ShockBurst接收模式中,地址匹配(AM)和數(shù)據(jù)準(zhǔn)備就緒(DR)信號(hào)通知微處理器一個(gè)有效的地址和數(shù)據(jù)包已經(jīng)各自接收完成。在ShockBurst發(fā)送模式中,nRF905自動(dòng)產(chǎn)生前導(dǎo)碼和CRC校驗(yàn)碼,數(shù)據(jù)準(zhǔn)備就緒(DR)信號(hào)通知微處理器數(shù)據(jù)傳輸已經(jīng)完成[3]。
2 RFID驅(qū)動(dòng)程序設(shè)計(jì)
2.1 整體驅(qū)動(dòng)設(shè)計(jì)思想
RFID驅(qū)動(dòng)程序的設(shè)計(jì)采用自底而上(Down-Top)的方法。優(yōu)先設(shè)計(jì)底層部分即SPI接口的驅(qū)動(dòng)程序,然后再設(shè)計(jì)上層RFID驅(qū)動(dòng)。這種自低而上設(shè)計(jì)方法可以把大模塊分散為幾個(gè)小模塊,把大設(shè)計(jì)分為小設(shè)計(jì),便于開發(fā)驗(yàn)證,并且符合Linux模塊化的設(shè)計(jì)思想,是一種高效的設(shè)計(jì)方法。
nRF905采用SPI接口與外界進(jìn)行通信,因此底層SPI驅(qū)動(dòng)主要完成nRF905的SPI和微處理器S3C2440的SPI模塊間的通信。上層RF驅(qū)動(dòng)程序通過(guò)SPI接口向nRF905發(fā)送指令和數(shù)據(jù),最終由nRF905的主機(jī)控制器控制射頻收發(fā)器完成數(shù)據(jù)收發(fā),實(shí)現(xiàn)射頻模塊間的無(wú)線通信。
2.2 SPI驅(qū)動(dòng)程序設(shè)計(jì)
在硬件電路中,微處理器S3C2440的SPI0模塊與nRF905中的SPI接口相連接。SPI驅(qū)動(dòng)的作用即完成主SPI與nRF905中從SPI的數(shù)據(jù)傳輸。為了便于驗(yàn)證功能,提高項(xiàng)目開發(fā)效率,底層SPI驅(qū)動(dòng)設(shè)計(jì)為獨(dú)立的模塊,并且進(jìn)行調(diào)試,在SPI驅(qū)動(dòng)設(shè)計(jì)的基礎(chǔ)上,完成上層RF驅(qū)動(dòng)。
在ARM9嵌入式平臺(tái)的內(nèi)核Linux2.6.12中,不包含SPI驅(qū)動(dòng)程序,而在Linux內(nèi)核之后的版本中包含了SPI驅(qū)動(dòng)。這樣,就可以移植新版本中的SPI驅(qū)動(dòng)到本嵌入式平臺(tái)Linux2.6.12中。雖然這種SPI驅(qū)動(dòng)通用性和功能性都較強(qiáng),但其代碼量大,較多功能并不符合本設(shè)計(jì)的要求。因此,本設(shè)計(jì)選擇重新編寫SPI底層驅(qū)動(dòng),簡(jiǎn)化其功能,建立環(huán)形緩沖區(qū),提高數(shù)據(jù)收發(fā)效率。
SPI驅(qū)動(dòng)程序作為設(shè)備文件,包含write、read、open、release、ioctl等幾個(gè)操作[4],其中關(guān)鍵性的硬件操作為讀寫操作,寫操作的主要作用是把用戶數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū),并控制微控制器中的主SPI發(fā)送數(shù)據(jù)到nRF905中;讀操作與寫操作類似,而過(guò)程相反,即把主SPI接到的數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū),再由內(nèi)核緩沖區(qū)拷貝到用戶空間申請(qǐng)好的數(shù)據(jù)結(jié)構(gòu)中。對(duì)SPI設(shè)備數(shù)據(jù)接收的監(jiān)控,驅(qū)動(dòng)程序采用中斷的方式來(lái)通知系統(tǒng)SPI數(shù)據(jù)是否收發(fā)完畢,在SPI設(shè)備每發(fā)送完一組數(shù)據(jù)或接收到一組數(shù)據(jù)后,就會(huì)觸發(fā)中斷,信號(hào)由IRQ線進(jìn)入,傳入CPU進(jìn)行中斷處理。
SPI驅(qū)動(dòng)程序的寫過(guò)程包括建立數(shù)據(jù)結(jié)構(gòu)、建立環(huán)形緩沖區(qū),從用戶空間把數(shù)據(jù)拷貝到數(shù)據(jù)結(jié)構(gòu)中、調(diào)用write函數(shù)把數(shù)據(jù)拷貝進(jìn)環(huán)形緩沖區(qū)中、寫滿后發(fā)送第一組數(shù)據(jù)到發(fā)送寄存器。當(dāng)SPI發(fā)送寄存器中的數(shù)據(jù)發(fā)送完畢后,會(huì)發(fā)出中斷信號(hào),觸發(fā)微處理器中斷,系統(tǒng)進(jìn)入中斷上下文。為了縮短中斷處理時(shí)間,提高中斷處理效率,驅(qū)動(dòng)程序中采用了頂/底半部的處理方法[5],即中斷處理時(shí)間盡量地短,在中斷處理例程中調(diào)用tasklet調(diào)度函數(shù),將需要較多時(shí)間的中斷處理發(fā)到tasklet(即底半部)中處理。在tasklet中會(huì)把環(huán)形緩沖區(qū)的數(shù)據(jù)寫入發(fā)送寄存器,最終由SPI控制器發(fā)送出去。
SPI驅(qū)動(dòng)程序的讀過(guò)程和寫過(guò)程類似,SPI接收寄存器接到數(shù)據(jù)后觸發(fā)中斷。CPU接到中斷信號(hào)后進(jìn)入中斷處理例程,調(diào)度tasklet進(jìn)入底半部進(jìn)行中斷處理,把接收寄存器中的數(shù)據(jù)拷貝到環(huán)形緩沖區(qū)中,然后喚醒正在休眠的進(jìn)程,由read函數(shù)把環(huán)形緩沖區(qū)中的數(shù)據(jù)拷貝到申請(qǐng)好的數(shù)據(jù)結(jié)構(gòu)中,再拷貝至用戶空間。
2.3 RFID驅(qū)動(dòng)程序設(shè)計(jì)
完成SPI底層驅(qū)動(dòng)后,上層RFID驅(qū)動(dòng)的內(nèi)容主要是對(duì)nRF905配置寄存器進(jìn)行配置,包括發(fā)送接收數(shù)據(jù)的字節(jié)數(shù)、目標(biāo)地址、工作模式、時(shí)鐘頻率等通過(guò)nRF905自定義的SPI指令寫入寄存器中。因此要對(duì)SPI驅(qū)動(dòng)中的write/read函數(shù)進(jìn)行封裝,通過(guò)調(diào)用SPI驅(qū)動(dòng)中的函數(shù)完成整體驅(qū)動(dòng)的寄存器配置和數(shù)據(jù)傳輸功能。
RFID驅(qū)動(dòng)程序作為設(shè)備文件,同樣分為write、read、open、release、ioctl等幾個(gè)操作。RFID驅(qū)動(dòng)程序的寫操作過(guò)程:首先將用戶空間中的數(shù)據(jù)拷貝至數(shù)據(jù)結(jié)構(gòu)中;然后使nRF905進(jìn)入Standby模式,調(diào)用SPIwrite函數(shù)對(duì)數(shù)據(jù)寄存器和地址寄存器進(jìn)行配置,把發(fā)送數(shù)據(jù)和目標(biāo)地址寫入本地nRF905,之后進(jìn)入ShockBurst發(fā)送模式,由本地nRF905向目標(biāo)nRF905發(fā)送數(shù)據(jù);最后進(jìn)程進(jìn)入休眠狀態(tài),等待數(shù)據(jù)準(zhǔn)備信號(hào)DR觸發(fā)中斷,由中斷處理例程喚醒進(jìn)程,完成數(shù)據(jù)發(fā)送。圖2為RFID的發(fā)送流程圖。
RFID的讀操作將判斷緩沖區(qū)是否為空,如果不為空,就把緩沖區(qū)中的數(shù)據(jù)拷貝至數(shù)據(jù)結(jié)構(gòu)中,并拷至用戶空間中;如果為空,進(jìn)程就會(huì)進(jìn)入休眠,等待緩沖區(qū)接收到數(shù)據(jù)后,進(jìn)入中斷喚醒進(jìn)程。在進(jìn)入ShockBurst RX模式后,本地nRF905會(huì)自動(dòng)監(jiān)測(cè)空中的信息,在nRF905發(fā)現(xiàn)和接收頻率相同的載波時(shí),載波檢測(cè)信號(hào)CD被置高,觸發(fā)中斷,在中斷例程中只是延時(shí)一段時(shí)間,等待nRF905接收到有效的目的地址時(shí),地址匹配信號(hào)置高。當(dāng)nRF905接收到有效的數(shù)據(jù)包后,數(shù)據(jù)準(zhǔn)備就緒信號(hào)DR會(huì)觸發(fā)中斷,進(jìn)入中斷例程,進(jìn)入Standby模式,把接收到的數(shù)據(jù)通過(guò)SPI接口讀入緩沖區(qū)內(nèi),而后喚醒進(jìn)程,把緩沖區(qū)中的數(shù)據(jù)拷貝至用戶空間中。當(dāng)所有的數(shù)據(jù)被讀出后,nRF905的AM和DR信號(hào)線會(huì)被置低。nRF905切換到下一狀態(tài)。RFID驅(qū)動(dòng)接收流程如圖3所示。
3 功能測(cè)試
測(cè)試主要分為兩部分,首先對(duì)底層SPI接口部分做調(diào)試,然后在此基礎(chǔ)上,對(duì)RFID驅(qū)動(dòng)進(jìn)行功能測(cè)試。
硬件方面,利用S3C2440開發(fā)板的擴(kuò)展口與nRF905模塊連接,擴(kuò)展口中用到的GPIO資源在驅(qū)動(dòng)程序中設(shè)置。另外,用RS-232串口將開發(fā)板與PC機(jī)相連,利用內(nèi)核的Debug功能[6],通過(guò)PC機(jī)對(duì)開發(fā)板進(jìn)行控制,完成驅(qū)動(dòng)加載和應(yīng)用程序的運(yùn)行。
軟件方面,基于S3C2440的嵌入式平臺(tái)需要完整的嵌入式操作系統(tǒng)資源,包括bootloader、kernel、文件系統(tǒng)。在對(duì)內(nèi)核進(jìn)行剪裁后,將bootloader、kernel、文件系統(tǒng)通過(guò)JTAG燒入NAND Flash中。操作系統(tǒng)要保證內(nèi)核、文件系統(tǒng)以及硬件設(shè)備正常運(yùn)行。
3.1 SPI驅(qū)動(dòng)功能測(cè)試
SPI驅(qū)動(dòng)測(cè)試主要測(cè)試驅(qū)動(dòng)程序的功能,測(cè)試驅(qū)動(dòng)程序是否能夠控制SPI主從設(shè)備正確傳輸數(shù)據(jù)。資源包括S3C2440開發(fā)平臺(tái)、Linux2.6.12內(nèi)核源碼包、示波器。系統(tǒng)運(yùn)行后,加載SPI驅(qū)動(dòng),運(yùn)行編寫的上層應(yīng)用程序進(jìn)行數(shù)據(jù)收發(fā),并用示波器觀察波形。
3.2 RFID驅(qū)動(dòng)程序測(cè)試
在測(cè)試SPI驅(qū)動(dòng)成功后,重新啟動(dòng)系統(tǒng),待系統(tǒng)成功運(yùn)行后,加載RFID驅(qū)動(dòng)程序,運(yùn)行為其編寫的測(cè)試程序,測(cè)試兩nRF905無(wú)線模塊間的通信。S3C2440的GPIO資源與nRF905信號(hào)線對(duì)應(yīng)關(guān)系如下:
Power down模式: PWR GPJ12
載波檢測(cè)輸出: CD GPG6
地址匹配輸出: AM GPB9
數(shù)據(jù)就緒輸出: DR GPG1
SPI主入從出: MISO GPE11
SPI主出從入: MOSI GPE12
SPI時(shí)鐘: SCK GPE13
SPI使能: CSN GPB10
發(fā)送/接收使能: TRX_CE GPG8
發(fā)送/接收模式: TX_EN GPG0
兩個(gè)平臺(tái)分別為:ARM9嵌入式平臺(tái)和MSP430單片機(jī)平臺(tái)。在ARM平臺(tái)運(yùn)行發(fā)送測(cè)試程序,而單片機(jī)平臺(tái)運(yùn)行接收測(cè)試程序,之后交換。接收端將接收到發(fā)送端發(fā)送的數(shù)據(jù),并將數(shù)據(jù)在PC機(jī)終端顯示。
當(dāng)ARM發(fā)送端的應(yīng)用程序中發(fā)送字符串“aaaaaaaa”時(shí),單片機(jī)端的nRF905模塊接收寄存器中收到轉(zhuǎn)換后的ASCII碼“97”;當(dāng)ARM端作為接收端而單片機(jī)作為發(fā)送端時(shí),ARM端運(yùn)行接收程序后,在用戶空間即顯示終端上顯示了接收到的數(shù)據(jù)“abcd…”。表明此RFID驅(qū)動(dòng)程序成功實(shí)現(xiàn)了控制nRF905無(wú)線收發(fā)器進(jìn)行數(shù)據(jù)接收傳輸?shù)墓δ堋?br/>
本文介紹了一種基于ARM9 S3C2440嵌入式平臺(tái)擴(kuò)展RFID驅(qū)動(dòng)的設(shè)計(jì)方案,設(shè)計(jì)了硬件擴(kuò)展電路和相應(yīng)的驅(qū)動(dòng)程序,通過(guò)了并測(cè)試。實(shí)現(xiàn)了嵌入式平臺(tái)間的RFID短距離即時(shí)通信功能。嵌入式RFID驅(qū)動(dòng)將推動(dòng)RFID技術(shù)在應(yīng)用領(lǐng)域中的發(fā)展,將會(huì)支持更多的射頻硬件,根據(jù)此驅(qū)動(dòng)可以開發(fā)更多的應(yīng)用程序,滿足多種需求。
參考文獻(xiàn)
[1] 董麗華.RFID技術(shù)與應(yīng)用[M].北京:電子工業(yè)出版社,2008.
[2] SAMSUNG.S3C2440A user’s manual reltminary[OL]. Revision0,2004.
[3] NORDIC Semiconductor.nRF905_rev1_1[OL].2004:1-36.
[4] 劉淼.嵌入式系統(tǒng)接口設(shè)計(jì)與Linux驅(qū)動(dòng)程序開發(fā)[M]. 北京:北京航空航天大學(xué)出版社,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內(nèi)核(第三版)[M].陳莉君,張瓊聲,張宏偉,譯.北京:中國(guó)電力出版社,2007.