1 引言 國內(nèi)現(xiàn)有RFlD讀寫器,一般僅支持一種協(xié)議,且功能較為單一。本設計使用最新的RFID芯片。實現(xiàn)了支持多種協(xié)議及協(xié)議自適應功能的RFID讀寫器。該讀寫器易于擴展,可根據(jù)需要實現(xiàn)各種功能。 2 硬件設計 多協(xié)議讀寫器系統(tǒng)硬件框圖如圖1所示.其主要由四部分組成:核心控制模塊、閱讀器模塊、人機接口模塊和通用外設接口。多協(xié)議讀寫器使用Linux嵌入式操作系統(tǒng),闃此核心控制模塊的CPU選擇三星公司基于ARM9內(nèi)核的S3C2410芯片,它與RAM和Flash Rom共同組成核心控制模塊。閱讀器模塊由TRF7960以及外圍的射頻電路和PCB天線組成,考慮到端口資源和布線的岡素,閱讀器與CPU通過SPI和中斷接口相連接。TRF7960是TI最新的高頻RFID讀寫芯片,支持IS014443A/B,ISO15693,IS018000-3和Tag-it等協(xié)議,主要完成各協(xié)議所規(guī)定的組幀/拆幀、調制/解調等功能,以及上下變頻、功放、小信號放大等射頻信號處理。人機接口采用LCD和觸摸屏,另外,由于S3C2410內(nèi)帶液晶和觸摸屏的驅動,因此可省卻這部分電路。為了實現(xiàn)與多種設備的互通,以及擴展無線數(shù)據(jù)傳輸?shù)裙δ埽O計了USB。SD,RS232等多種通用接口。 3 軟件總體設計 本文提出一種基于Linux2.6操作系統(tǒng)的多協(xié)議RFID讀寫器軟件設計方案。主要實現(xiàn)TRF7960設備驅動和讀寫器控制程序,前者完成TRF7960模塊的控制和協(xié)議實現(xiàn),后者通過對前者的調用完成協(xié)議選擇和標簽數(shù)據(jù)的處理。 軟件總體設計框圖如圖2,整個軟件結構分為應用層和驅動層。應用層是基于QT的主程序,主要完成數(shù)據(jù)的收發(fā)、處理、交換和人機界面的實現(xiàn)。驅動層包括TRF7960驅動和多種標準驅動,TRF7960驅動完成數(shù)據(jù)的采集和向應用層的傳遞,其中的設備接口程序通過GPIO操作7FRF7960,并結合中斷處理程序和多協(xié)議控制程序完成數(shù)據(jù)的收發(fā),并通過標準接口程序和讀寫器控制程序連接;標準驅動程序則為應用層提供各種標準硬件設備的操作,為系統(tǒng)的擴展提供了良好的條件。 圖1系統(tǒng)硬件框圖 圖2軟件總體設計框圖 4 軟件設計詳述 4.1設備接口程序設計 設備接口程序是對TRF7960硬件直接操作的程序,主要完成GPIO的配置,并輸出符合TRl'7960工作時序的SPI控制時序,通過該時序對TRF7960寄存器進行讀寫操作。 操作系統(tǒng)已完成GPIO硬件端口與軟件之間的映射,因此只需調用相應的內(nèi)核函數(shù),就能實現(xiàn)對GPIO的控制。設計中使用的內(nèi)核函數(shù)有:GPIO端口配置函數(shù)s3c2410_gpio_cfgpin(),GPIO端口輸出函數(shù)s3c2410_gpio_setpin()和GPIO端口輸入函數(shù)。s3c2410_gpio_getpin(),通過這些內(nèi)核函數(shù)完成各個端口的配置和初始化,并實現(xiàn)TRF7960工作需要的SPI時序。根據(jù)S3C2410 Data Sheet, 將S3C2410_GPG7、S3C2410_GPG6、S3C2410_GPG5、S3C24l0_GPF1的屬性務別配置為輸出、輸出、輸人和外部中斷1,依次對應設計中的SPICLK、SPIMOSI、SPIMISO和中斷。外部中斷觸發(fā)模式使用函數(shù)set_irq_type()設置為上升沿觸發(fā),并通過函數(shù)request_irq()注冊中斷處理程序。 根據(jù)TRF7960串行SPI時序要求,當SCLK(SPICLK)為高電平時,Date_IN(SPIMOSI)出現(xiàn)上升沿表示起始位,DATA_IN(SPIMISO)出現(xiàn)下降沿表示結束位。在起始位和結束位之間傳輸8比特數(shù)據(jù)(可以是地址,數(shù)據(jù)或命令),高位先傳。發(fā)送時,CPU在SCLK為高電平時將數(shù)據(jù)放到DATA_IN上,接收時,TRF7960在SCLK出現(xiàn)上升沿時將數(shù)菇放到DATA_OUT(SPIMISO)上,供CPU采集。 4.2 TRF7960操作方式 基于以上時序的實現(xiàn),CPU可以通過地址模式和命令模式對TRF7960進行操作,在地址模式下,主要完成寄存器的配置和FIFO數(shù)據(jù)的讀取,在命令模式下,完成直接命令的發(fā)送,如初始化,接收使能等。cPu還可以通過連續(xù)方式和非連續(xù)方式進行數(shù)據(jù)的收發(fā),在非連續(xù)方式下,對指定寄存器地址只進行一個字節(jié)的數(shù)據(jù)讀寫,主要用于對單個寄存器的配置,在連續(xù)方式下,從指定起始地址,每字節(jié)收發(fā)后地址自動加l,實現(xiàn)多字節(jié)數(shù)據(jù)的連續(xù)讀寫。基于以上各種操作方式,可以確定發(fā)送和接收數(shù)據(jù)的流程。 連續(xù)發(fā)送數(shù)據(jù)流程的實現(xiàn)在文獻巾有明確的闡述,下面為連續(xù)讀取數(shù)據(jù)的流程:CPU向TRF7960發(fā)送起始位,再發(fā)送連續(xù)讀命令字節(jié)(具體命令表見),隨后CPU采集TRF7960放到DATA_OUT上的串行數(shù)據(jù),讀取指定字節(jié)的數(shù)據(jù),最后CPU發(fā)送結束位。特別的,在串行SPI模式下,中斷狀態(tài)寄存器(地址OxOC)的讀時序是特殊的。必須在讀完0x0C寄存器后,再空讀8個時鐘周期。才能讀取正確的寄存器數(shù)據(jù)。 4.3中斷處理流程 數(shù)據(jù)的發(fā)送和接收都需要結合相應的中斷才能完成。TRF7960硬件上只有一個中斷響應,CPU需要根據(jù)中斷狀態(tài)寄存器(Ox0c)判斷不同的中斷類犁,必要時需要結合FIFO狀態(tài)寄存器(0xlc)進行相應的操作。中斷處理程序的流程為:先讀取中斷標志寄存器和FIFO狀態(tài)寄存器,再置各個標志位,最后根據(jù)不同的標志位執(zhí)行相應的操作。以接收結束標志為例:根據(jù)FIFO寄存器的值,讀取并存儲數(shù)據(jù)后退出中斷。 4.4協(xié)議程序實現(xiàn) 協(xié)議程序實現(xiàn)各協(xié)議規(guī)定的命令格式和算法流程,并通過配置TRF7960相關寄存器選擇協(xié)議,實現(xiàn)多協(xié)議及協(xié)議自適應的功能。下面以IS015693協(xié)議為例,介紹該協(xié)議的多卡識讀命令及算法流程的實現(xiàn)。 多卡識讀算法是一種逐位搜索算法,在多卡識讀狀態(tài)下,讀寫器的一輪查詢分為16個間隙(slot),從1開始依次標記。在每個時隙中,讀寫器通過發(fā)送不同參數(shù)的Inventory命令(獲取系統(tǒng)信息命令)查詢當前磁場范圍內(nèi)標簽的卡號,標簽內(nèi)則采用相對應的比較機制影單,讀寫器通過中斷,處理碰撞或接受卡號,并發(fā)送EOF命令切換到下一個時隙,如果一輪查詢結束后有碰撞發(fā)生,再進行新的一輪查詢。 Inventory命令主要是通過掩碼長度(masklength)和掩碼值(maskvalue)這兩個參數(shù)實現(xiàn)防碰撞算法。下面舉例說明算法的實現(xiàn):設定掩碼長度=0,掩碼值=0,當Inventory命令序列發(fā)送后,掩碼值會被自動與卡的UID的最低位比較,因為0≠2≠8,所以兩張卡均不會打。同樣的命令,如果掩碼值=2,則第一張卡回答;當掩碼值=8時,第二張卡回答。如果兩張卡的卡號是:E00700000158D1D2和E0070000015869E2,則當掩碼長度=0,掩碼值=2時兩張卡均回答,則發(fā)生沖突,解決的方法是:令掩碼長度=4,掩碼值=X2,X從0到F自增,這樣,X2=D2時第一張卡回答,X2=E2時第二張卡回答。依次類推。 T1在文獻中給出了遞歸的防碰撞算法的大致流程,雖然遞歸算法具有結構清晰、程序簡練易讀的特點,但通常需要執(zhí)行大量的過程調用,并在堆棧中保存所有返回過程的局部變量,效率往往較低,尤其是在嵌入式系統(tǒng)中,系統(tǒng)內(nèi)存有限,當進行遞歸調用時,堆棧容易益處,可靠性低。因此我們提出非遞歸的防碰撞方法,具體流程圖如圖3,使程序更高效更可靠。 算法中時隙指針具體處理如下,時隙指針的首地址初值設為O,用來標記無碰撞時隙,退出循環(huán)。當檢測到碰撞中斷,時隙指針先下移1位,記錄碰撞時隙標號,再下移1位,記錄當前掩碼值,最后下移1位,生成新掩碼長度(舊掩碼長度+4)。新掩碼生成規(guī)則為碰撞時隙標號左移新掩碼長度位冉加上舊掩碼值,即掩碼值=(*(時隙指針一2))<<(*(時隙指針))+(*(時隙指針-1)),隨后時隙指針=時隙指針-3,去除已處理掩碼信息。 圖3非遞歸的防碰撞算法流程圖 采用這種逐位搜索算法讀取多張標簽的卡號后,通過指定卡號的命令,可以完成對特定卡的讀寫,實現(xiàn)了防碰撞的多卡識讀。 4.5 TRF7960驅動與應用層接口實現(xiàn) TRF7960驅動與應用層之間的接口是由讀寫器控制程序和標準接口程序共同完成的。讀寫器控制程序包含在主程序中一個自定義類的成員函數(shù)中,它通過一組固定的入口點(open,write,ioctl,read等函數(shù))調用標準接口程序中相應的函數(shù)。當TRF7960已經(jīng)通過insmod注冊到linux系統(tǒng)中,通過調用fd=open("/dev/trf",O_RDWR)打開TRF7960驅動并返回該驅動文件標識符;write函數(shù)根據(jù)文件標識符fd調用trf write,完成對各個端口定義及初始化,具體實現(xiàn)在4.1已介紹;ioctl函數(shù)調用trf_ioctl,選擇TRF7960的工作方式;read函數(shù)調用trf_read,而trf_read通過調用內(nèi)核函數(shù)copy_to_user()實現(xiàn)數(shù)據(jù)從驅動層到應用層的傳遞,當主程序完成ioctl功能時,就需調用read函數(shù)來讀取驅動層的數(shù)據(jù);close函數(shù)負責關閉驅動。 4.6多協(xié)議、協(xié)議自適應功能的實現(xiàn) 讀寫器控制程序中的ioctl函數(shù)調用其在驅動中對應的trf_ioctl甬數(shù)實現(xiàn)多協(xié)議和協(xié)議自適應功能,它通過設置參數(shù)cmd,選擇不同的協(xié)議工作方式。當cmd為0時,選擇在IS014443A協(xié)議下工作,cmd為1時。選擇IS014443B;cmd為2時,選擇IS015693;cmd為3時,選擇IS018000—3;cmd為4時,選擇自適應丁作方式。當選擇協(xié)議自適應的工作方式后,程序先配置主寄存器及相關寄存器,根據(jù)指定協(xié)議進行相應的讀寫操作,在設定時間內(nèi),若有FIFO中斷或發(fā)送結束中斷產(chǎn)生,則采集數(shù)據(jù)并保存,否則切換協(xié)議,直到各個協(xié)議都輪詢一遍,最后退出。這樣就實現(xiàn)了具有多協(xié)議,防碰撞多標簽,協(xié)議自適應RFID讀寫器。 5 結束語 本文設計了一款基于嵌入式CPU和Linux操作系統(tǒng)的RFID讀寫器,對軟硬件設計進行了詳細的描述。該設計的創(chuàng)新點在于實現(xiàn)的濱寫器支持多種協(xié)議和協(xié)議自適應的功能。且和現(xiàn)有的單一功能的讀寫器相比具有更好的擴展性和圖形化的用戶界面,應用更廣泛,如通過移植USB無線網(wǎng)卡,可實現(xiàn)尤線RFID讀寫器,義如通過SD接口與900M RFID讀寫器相連,實現(xiàn)多頻段RHD讀寫器。該讀寫器作為手持終端,可在世博場館、博物館等復雜環(huán)境下,為用戶提供快速,高效、便捷的人性化服務,應用前景廣泛。 本文作者創(chuàng)新點:該設計實現(xiàn)了基于嵌入式CPU和Linux操作系統(tǒng)的RFID讀寫器,具有防碰撞功能,支持多種協(xié)議和協(xié)議自適應的功能。具有多種外設接口,具備良好的擴展性和用戶友好的圖形化界面。 作者:朱臣元,俞暉 來源:《微計算機信息》(嵌入式與SOC)2009年第3-2期 |