基于A(yíng)RM嵌入式系統的RFID驅動(dòng)程序設計
RFID具有讀取速度快、讀取距離遠、儲存信息量大、標簽上數據可加密、使用壽命長(cháng)、工作環(huán)境適應性強等多種優(yōu)點(diǎn),已經(jīng)在各領(lǐng)域廣泛應用[1]。
將RFID技術(shù)與嵌入式系統相結合,將射頻識別模塊嵌入到嵌入式系統中,在嵌入式Linux下通過(guò)設計驅動(dòng)程序實(shí)現射頻模塊的收發(fā)功能。嵌入式RFID系統增加了RFID技術(shù)的通用性和可移植性,豐富了嵌入式系統通信接口外設功能,提升了嵌入式技術(shù)在無(wú)線(xiàn)通信領(lǐng)域的發(fā)展空間。
當前的嵌入式系統中并不支持RFID系統,所以要進(jìn)行硬件和軟件兩方面的擴展。硬件方面主要根據nRF905無(wú)線(xiàn)收發(fā)器的電氣特性進(jìn)行接口擴展,利用基于ARM9嵌入式平臺的擴展口對nRF905進(jìn)行控制;軟件方面利用Linux內核良好的移植性和擴展性,編寫(xiě)驅動(dòng)程序控制射頻模塊的收發(fā)功能,在底層驅動(dòng)以收集和分組數據并傳遞給上層應用程序,由上層應用程序與用戶(hù)進(jìn)行交互。本文所研究的基于嵌入式系統的RFID驅動(dòng),將為嵌入式RFID系統提供底層軟硬件接口程序,為嵌入式內核增添RFID管理機制,為上層應用程序提供良好服務(wù),降低嵌入式RFID的開(kāi)發(fā)難度,縮短開(kāi)發(fā)周期,從而降低其成本,使RFID的應用更加普及。
1 硬件電路的實(shí)現
圖1是nRF905無(wú)線(xiàn)收發(fā)器接口擴展的硬件電路原理圖,硬件電路的實(shí)現主要基于S3C2440 ARM9微處理器和單片nRF905無(wú)線(xiàn)收發(fā)器的互聯(lián),以及根據nRF905電氣特性所做的一些外接電路。
S3C2440是一款采用ARM920T內核的高性能32 bit處理器,其主頻高達405 MHz,采用5級流水線(xiàn)和哈佛結構。S3C2440包括兩個(gè)SPI接口,每個(gè)接口分別有兩個(gè)8 bit數據移位寄存器用于發(fā)送和接收。在SPI發(fā)送期間,數據同時(shí)發(fā)送(串行移出)和接收(串行移入)[2]。因此,利用處理器的SPI接口,可以很方便地用SPI接口與nRF905無(wú)線(xiàn)收發(fā)模塊進(jìn)行數據傳輸。
單片nRF905無(wú)線(xiàn)收發(fā)器工作在433/868/915 MHz的ISM頻段。由一個(gè)完全集成的頻率調制器、一個(gè)帶解調器的接收器、一個(gè)功率放大器、一個(gè)晶體振蕩器和一個(gè)調節器組成。其所具有的ShockBurst工作模式可以自動(dòng)產(chǎn)生前導碼和CRC??梢酝ㄟ^(guò)SPI接口進(jìn)行編程配置。
nRF905采用Nordic公司的VLSI ShockBurst技術(shù)。ShockBurst技術(shù)使nRF905能夠提供高速的數據傳輸而不需要昂貴的高速MCU來(lái)進(jìn)行數據處理/時(shí)鐘覆蓋。通過(guò)將與RF協(xié)議有關(guān)的高速信號處理器放到芯片內,nRF905提供給微控制器一個(gè)SPI接口,速率由專(zhuān)為控制器設定的接口速度決定。nRF905通過(guò)ShockBurst工作模式在RF以最大速率進(jìn)行連接時(shí),降低數字應用部分的速率來(lái)降低在應用中的平均電流消耗。在ShockBurst接收模式中,地址匹配(AM)和數據準備就緒(DR)信號通知微處理器一個(gè)有效的地址和數據包已經(jīng)各自接收完成。在ShockBurst發(fā)送模式中,nRF905自動(dòng)產(chǎn)生前導碼和CRC校驗碼,數據準備就緒(DR)信號通知微處理器數據傳輸已經(jīng)完成[3]。
2 RFID驅動(dòng)程序設計
2.1 整體驅動(dòng)設計思想
RFID驅動(dòng)程序的設計采用自底而上(Down-Top)的方法。優(yōu)先設計底層部分即SPI接口的驅動(dòng)程序,然后再設計上層RFID驅動(dòng)。這種自低而上設計方法可以把大模塊分散為幾個(gè)小模塊,把大設計分為小設計,便于開(kāi)發(fā)驗證,并且符合Linux模塊化的設計思想,是一種高效的設計方法。
nRF905采用SPI接口與外界進(jìn)行通信,因此底層SPI驅動(dòng)主要完成nRF905的SPI和微處理器S3C2440的SPI模塊間的通信。上層RF驅動(dòng)程序通過(guò)SPI接口向nRF905發(fā)送指令和數據,最終由nRF905的主機控制器控制射頻收發(fā)器完成數據收發(fā),實(shí)現射頻模塊間的無(wú)線(xiàn)通信。
2.2 SPI驅動(dòng)程序設計
在硬件電路中,微處理器S3C2440的SPI0模塊與nRF905中的SPI接口相連接。SPI驅動(dòng)的作用即完成主SPI與nRF905中從SPI的數據傳輸。為了便于驗證功能,提高項目開(kāi)發(fā)效率,底層SPI驅動(dòng)設計為獨立的模塊,并且進(jìn)行調試,在SPI驅動(dòng)設計的基礎上,完成上層RF驅動(dòng)。
在A(yíng)RM9嵌入式平臺的內核Linux2.6.12中,不包含SPI驅動(dòng)程序,而在Linux內核之后的版本中包含了SPI驅動(dòng)。這樣,就可以移植新版本中的SPI驅動(dòng)到本嵌入式平臺Linux2.6.12中。雖然這種SPI驅動(dòng)通用性和功能性都較強,但其代碼量大,較多功能并不符合本設計的要求。因此,本設計選擇重新編寫(xiě)SPI底層驅動(dòng),簡(jiǎn)化其功能,建立環(huán)形緩沖區,提高數據收發(fā)效率。
SPI驅動(dòng)程序作為設備文件,包含write、read、open、release、ioctl等幾個(gè)操作[4],其中關(guān)鍵性的硬件操作為讀寫(xiě)操作,寫(xiě)操作的主要作用是把用戶(hù)數據拷貝到內核緩沖區,并控制微控制器中的主SPI發(fā)送數據到nRF905中;讀操作與寫(xiě)操作類(lèi)似,而過(guò)程相反,即把主SPI接到的數據拷貝到內核緩沖區,再由內核緩沖區拷貝到用戶(hù)空間申請好的數據結構中。對SPI設備數據接收的監控,驅動(dòng)程序采用中斷的方式來(lái)通知系統SPI數據是否收發(fā)完畢,在SPI設備每發(fā)送完一組數據或接收到一組數據后,就會(huì )觸發(fā)中斷,信號由IRQ線(xiàn)進(jìn)入,傳入CPU進(jìn)行中斷處理。
SPI驅動(dòng)程序的寫(xiě)過(guò)程包括建立數據結構、建立環(huán)形緩沖區,從用戶(hù)空間把數據拷貝到數據結構中、調用write函數把數據拷貝進(jìn)環(huán)形緩沖區中、寫(xiě)滿(mǎn)后發(fā)送第一組數據到發(fā)送寄存器。當SPI發(fā)送寄存器中的數據發(fā)送完畢后,會(huì )發(fā)出中斷信號,觸發(fā)微處理器中斷,系統進(jìn)入中斷上下文。為了縮短中斷處理時(shí)間,提高中斷處理效率,驅動(dòng)程序中采用了頂/底半部的處理方法[5],即中斷處理時(shí)間盡量地短,在中斷處理例程中調用tasklet調度函數,將需要較多時(shí)間的中斷處理發(fā)到tasklet(即底半部)中處理。在tasklet中會(huì )把環(huán)形緩沖區的數據寫(xiě)入發(fā)送寄存器,最終由SPI控制器發(fā)送出去。
SPI驅動(dòng)程序的讀過(guò)程和寫(xiě)過(guò)程類(lèi)似,SPI接收寄存器接到數據后觸發(fā)中斷。CPU接到中斷信號后進(jìn)入中斷處理例程,調度tasklet進(jìn)入底半部進(jìn)行中斷處理,把接收寄存器中的數據拷貝到環(huán)形緩沖區中,然后喚醒正在休眠的進(jìn)程,由read函數把環(huán)形緩沖區中的數據拷貝到申請好的數據結構中,再拷貝至用戶(hù)空間。
2.3 RFID驅動(dòng)程序設計
完成SPI底層驅動(dòng)后,上層RFID驅動(dòng)的內容主要是對nRF905配置寄存器進(jìn)行配置,包括發(fā)送接收數據的字節數、目標地址、工作模式、時(shí)鐘頻率等通過(guò)nRF905自定義的SPI指令寫(xiě)入寄存器中。因此要對SPI驅動(dòng)中的write/read函數進(jìn)行封裝,通過(guò)調用SPI驅動(dòng)中的函數完成整體驅動(dòng)的寄存器配置和數據傳輸功能。
RFID驅動(dòng)程序作為設備文件,同樣分為write、read、open、release、ioctl等幾個(gè)操作。RFID驅動(dòng)程序的寫(xiě)操作過(guò)程:首先將用戶(hù)空間中的數據拷貝至數據結構中;然后使nRF905進(jìn)入Standby模式,調用SPIwrite函數對數據寄存器和地址寄存器進(jìn)行配置,把發(fā)送數據和目標地址寫(xiě)入本地nRF905,之后進(jìn)入ShockBurst發(fā)送模式,由本地nRF905向目標nRF905發(fā)送數據;最后進(jìn)程進(jìn)入休眠狀態(tài),等待數據準備信號DR觸發(fā)中斷,由中斷處理例程喚醒進(jìn)程,完成數據發(fā)送。圖2為RFID的發(fā)送流程圖。
評論