摘要:RFID 應用系統(tǒng)種類繁多,開發(fā)工作上具有一定的重復性,為此通過分析RFID 系統(tǒng)的一般模型,提出了基于構件化封裝設計思想的RFID 系統(tǒng)通用開發(fā)平臺軟、硬件模型,利用飛思卡爾公司的32 位ColdFire 系列微控制器MCF52235 設計了RFID 通用開發(fā)平臺,給出了軟、硬件構件設計方案,并在此平臺上成功進行了二次開發(fā),實現(xiàn)了學生機房上機刷卡系統(tǒng)。 實踐結果表明,這種構件化的平臺開發(fā)方法有效地提高了軟硬件的可重用性和可移植性,使用該RFID 系統(tǒng)通用開發(fā)平臺進行各種二次應用開發(fā)縮短了開發(fā)周期。
概述
射頻識別(RFID,Radio Frequency Identification)是一種非接觸式的自動識別技術,通過射頻信號在空間上的耦合實現(xiàn)非接觸式數(shù)據(jù)傳輸,達到自動識別對象并獲取相關信息的目的。 目前市場上有大量的、面向眾多領域的RFID 應用系統(tǒng)。 在開發(fā)這些RFID 系統(tǒng)時, 若因不同的應用需求和應用環(huán)境,而將每個RFID 系統(tǒng)孤立看待,無疑會增加開發(fā)成本和延長開發(fā)周期。 因此,文中基于構件化的封裝設計思想設計了一個RFID 系統(tǒng)通用的軟硬件平臺,對軟硬件進行封裝,提高軟硬件的可重用性和可移植性,在保證系統(tǒng)性能的前提下,避免重復勞動,縮短開發(fā)周期。
1 總體設計方案
1.1 RFID 射頻識別系統(tǒng)一般模型
RFID 射頻識別系統(tǒng)因具體應用不同其組成會有所不同,但是通過分析它們的共性可以建立一個一般的模型, 如圖1 所示。 該模型主要由電子標簽、射頻識別裝置即讀卡器、PC 主機組成。 電子標簽與射頻識別裝置之間通過耦合元件實現(xiàn)射頻信號的空間耦合。 在耦合通道內, 根據(jù)時序關系,實現(xiàn)能量的傳遞、數(shù)據(jù)的交換。
一個通用的RFID 系統(tǒng)開發(fā)平臺是指:此平臺以RFID 射頻識別系統(tǒng)一般模型為基礎,提供開發(fā)RFID 射頻識別系統(tǒng)通用的硬件和軟件構件。 在設計思路上須遵循構件化設計、可二次開發(fā)性和平臺化設計原則。
1.2 RFID 通用開發(fā)平臺硬件構件模型
在一般模型中,電子標簽根據(jù)自身是否帶電源可分為有源標簽、無源標簽,根據(jù)存儲方式分為只讀標簽、讀寫標簽,根據(jù)工作距離分為密耦合型標簽識別距離1cm 內、近耦合型標簽識別距離10 cm內、鄰近型標簽識別距離100 cm 內。 不同的電子標簽識別技術不一樣。
文中的通用開發(fā)平臺主要面向無源的近耦合型RFID 應用, 參照ISO/IEC 14443 協(xié)議操作13.56 MHz 讀寫標簽(Type A 卡) 或者只讀標簽(Type B 卡), 并配備各種常用接口和外設如通用I/O口、網(wǎng)絡、串口、SPI、USB、LCD、語音以適應不同的應用。 RFID 通用開發(fā)平臺硬件構件模型如圖2 所示。 在單芯片解決方案中, 通常MCU 內部包含有通用I/O 口和一些內置的功能模塊如串口、網(wǎng)絡等,因此相對于核心構件MCU 而言,通用I/O 口、SPI、串口、網(wǎng)絡是MCU 內部構件,LCD、語音、USB、射頻可以看成是其外設構件。
1.3 RFID 通用開發(fā)平臺軟件構件模型
RFID 通用開發(fā)平臺軟件設計分為兩大部分:
底層軟件構件層和高層構件層。 其中底層軟件構件層針對硬件構件編程, 是硬件驅動程序的封裝,高層構件層根據(jù)用戶的實際應用需求調用底層軟件構件層封裝好的功能函數(shù)。 通用平臺的軟件構件層次模型如圖3 所示。 將通用I/O 口的驅動封裝為GPIO 構件,各內置功能模塊的驅動程序封裝為功能構件,合稱為內部軟件構件。 外設的驅動程序封裝為外設軟件構件。
原則上開發(fā)基于此平臺的各種應用只需要設計PC 端的應用軟件,其余軟、硬件構件不需要進行改動,這就是RFID 通用開發(fā)平臺的構件化封裝設計的思想。 高層構件層提供了訪問各個構件的網(wǎng)絡命令,PC 端主機操作網(wǎng)絡、射頻、LCD、USB、語音等構件時,只需發(fā)送相應的網(wǎng)絡命令即可。
2 RFID 通用開發(fā)平臺設計
2.1 硬件設計
硬件構件模型中首先是主控制器MCU 的選型。 由于RFID 應用廣泛, 很多場合要求控制器有較快的處理速度, 有多種控制模塊如A/D 控制模塊、CAN 總線模塊、以太網(wǎng)控制模塊等。 綜合分析,文中選擇了飛思卡爾單芯片解決方案MCF52235處理器。 該處理器采用Coldfire V2 內核和精簡指令集(RISC),頻率為60 MHz,通過設置鎖相環(huán)( PLL ),MCF52235 能夠穩(wěn)定工作在80 MHz. 內部集成了10/100M 快速以太網(wǎng)控制器(FEC)、以太網(wǎng)物理收發(fā)器(EPHY)等模塊,還有UART,I2C、QSPI、PWM 、快速ADC 等模塊,實現(xiàn)了單芯片解決方案。
由于MCF52235 處理器中集成的以太網(wǎng)模塊已經(jīng)包括了以太網(wǎng)控制器和物理層收發(fā)器,因此網(wǎng)絡硬件構件僅需添加少量的元件便可。 MCF52235處理器的PHY_RXP、PHY_RXN 引腳用于接收數(shù)據(jù),PHY_TXP、PHY_TXN 引腳用于發(fā)送數(shù)據(jù)。 這兩對收、發(fā)引腳分別接50 Ω 的上拉電阻。 SPDLED 引腳接網(wǎng)速LED 燈指示當前的連接速度是10 Mbps還是100 Mbps,LNKLED 引腳接的LED 燈則指示當前是否已經(jīng)與另一個網(wǎng)絡設備連接。 如果RFID射頻系統(tǒng)中讀卡器終端并不多,可以不采用網(wǎng)絡而是通過USB 接口與PC 機進行通信。 USB 構件采用飛思卡爾的單芯片MC9S12UF32, 它提供了高速USB2.0 接口, 即插即用。 此處使用USB 接口不是為了獲得更高的速度而是為了使用方便,所以選擇通過MCF52235 的一個串口與UF32 通信。
射頻芯片選用的是飛利浦RC531 芯片,工作頻率為13.56 MHz, 在不外加功率放大器時讀寫距離可達10 cm,它通過SPI 接口與MCF52235 通信。
LCD 構件采用耀宇科技的YM12864 圖形點陣液晶。 該液晶顯示器可以顯示4 行、每行8 個漢字或者16 個字母。 它有兩種常用的連接方式:并行和串行。 并行連接需要11 根引腳線, 串行連接僅用3 根引腳線,因此與MCU 的連接采用串行的連接方式。 另外還需一個引腳控制背光燈電源的正極LEDA開關。 語音模塊和LCD 模塊的功能一樣,都是為了增強人機交互, 它采用上海奔流公司的BMP5008語音芯片。 狀態(tài)指示燈用于觀察系統(tǒng)的運行狀態(tài)和用戶的操作,通過GPIO 口連接,幾乎所有的MCF52235 引腳都可以作為GPIO 引腳。 主控制器MCF52235 與各模塊的引腳連接如圖4 所示。
2.2 軟件設計
根據(jù)平臺的軟件構件層次模型,先將各個模塊的驅動程序封裝成構件。 底層軟件構件是與硬件直接打交道的,它由頭文件和源程序文件兩部分組成。 編程思想是分析構件的共性和個性,抽取出構件的屬性和對外接口函,用戶使用該構件時只需了解其接口函數(shù), 而不必去了解內部具體如何實現(xiàn)。
頭文件部分給出構件屬性的宏定義和對外接口函數(shù)的原型說明,源程序部分是函數(shù)的實現(xiàn)。
以太網(wǎng)構件主要包括以太網(wǎng)物理收發(fā)器(EPHY)和快速以太網(wǎng)控制器(FEC) 的初始化、TCP/IP 協(xié)議棧實現(xiàn)。 它的接口函數(shù)原型說明如下:
//==================================
uint8 hw_ephy_init (uint16 sysclk,uint8 ratemode,
uint8 dupmode,uint8 autoneg); //EPHY 初始化
void hw_fec_init (uint8 mac_addr_fec [6];//FEC初始化
int8 hw_fec_sendframe (uint8 ch [], uint8destAdd[6], uint8 srcAdd[6], uint16 lenType, uint16len);//發(fā)送單個以太網(wǎng)幀
uint8 hw_fec_receiveframe(uint8 ch[], uint16 *len);//接收單個以太網(wǎng)幀
uint hw_icmp_handle(PACKET p);//處理接收到的ICMP 包,響應ping 請求
int hw_udp_send (unshort fport, unshort lport,
PACKET p);//發(fā)送UDP 包
//==================================
RC531 射頻模塊與MCF52235 通信嚴格按照串行通信時序要求。 RC531 與ISO/IEC 14443 TypeA 和Type B 卡通信,則按照A、B 卡調制和編碼的方式設置相關的寄存器,并根據(jù)ISO/IEC 14443 協(xié)議來設計軟件即可。 讀卡器與A、B 卡之間的通信是按照應答方式來進行的,非接觸式的卡有很多工作狀態(tài),各個狀態(tài)的轉化可通過讀卡器向卡發(fā)送一系列命令完成。 射頻構件的接口函數(shù)說明如下所示:
// ==操作Type A 卡的部分主要函數(shù)======
void pcdinit();//R 初始化
char pcdreset();//RC531 復位
char pcdrequest(uint8 req_code);//尋卡
char pcdanticoll(uint8 *snr);//防碰撞
char pcdselect(uint8 *snr);//選定一張卡
// =========操作Type B 卡的函數(shù)========
void pcdinitB();//B 卡初始化
char pcdrequestB(uint8 *pupi);//尋B 卡
char pcdattrib(uint8 *pupi);// 發(fā)送attrib 命令
char pcdhaltB(uint8 *pupi);// B 卡掛起
char pcdgetUID (uint8 *snr, uint8 *len); //獲得B 卡的ID
//==================================
MCF52235 與LCD 構件的通信同樣采用串行方式。 串行通信的一次數(shù)據(jù)分3 個字節(jié)傳輸。 第一個字節(jié)數(shù)據(jù)格式為11111AB0,表示串行控制,A 是選擇數(shù)據(jù)方向,1 表示LCD 到MCF52235,0 表示MCF52235 到LCD. B 是選擇數(shù)據(jù)類型,1 表示數(shù)據(jù)為顯示數(shù)據(jù),0 表示數(shù)據(jù)為控制命令。 第二個字節(jié)格式為DDDD0000, 表示8 位數(shù)據(jù)的高4 位。 第三個字節(jié)格式為0000DDDD 表示8 位數(shù)據(jù)的低4 位。
LCD 構件接口函數(shù)說明如下所示:
//==================================
void lcd_init();//初始化
void lcd_display (const char* buf, int line);//在第line 行顯示buf,line>=0 && line<= 3
//==================================
USB 軟件構件比較簡單,只需對MC9S12UF32的USB 模塊進行初始化,UF32 便可以和MCF52235 進行交互了。 由于MCF52235 與UF32采用串口連接, 因此只要在串口中斷程序中調用USB 構件,UF32 便可從串口接收數(shù)據(jù), 然后通過USB 傳送給上位機。 上位機通過USB 接口發(fā)送數(shù)據(jù)給UF32 也產生一個中斷,在中斷程序把數(shù)據(jù)緩存起來再調用USB 構件, 通過串口發(fā)送給MCF52235. USB 構件接口函數(shù)說明如下所示:
//==================================
void uf32_uart_init(void);//uf32 模塊初始化
void uf32_uart_send(uint8 ch[],uint32 n); //發(fā)送數(shù)據(jù)
uint32 uf32_uart_rev (uint8 ch [],uint32 n); //接收數(shù)據(jù)
//==================================
語音構件相對比較簡單,接口函數(shù)說明如下所示:
//==================================
void audio_init();//語音模塊初始化
void audio_play(int i);//語音播放
void audio_stop();//語音停止
//==================================
串口構件接口函數(shù)說明如下所示:
//==================================
uint8 hw_uart_init(uint8 uartNo, uint32 baud);//串口初始化
uint8 hw_uart_rev_one (uint8 uartNo, uint8 *fp); //串口接收一個字節(jié)到fp
uint8 hw_uart_send_one(uint8 uartNo, unit8 ch);
//串口發(fā)送一個字節(jié)
//==================================
SPI 構件接口函數(shù)說明如下所示:
//==================================
uint8 hw_spi_init (uint8 spiNo,uint8 master);//SPI 初始化
uint8 hw_spi_send (uint8 spiNo,uint8 data [],uint8 len);//SPI 發(fā)送數(shù)據(jù)
uint8 hw_spi_re(uint8 spiNo,uint8 data[]); //SPI接收數(shù)據(jù)
uint8 hw_spi_enable_re_int (uint8 spiNo); //開SPI 接收中斷
uint8 hw_spi_disable_re_int (uint8 spiNo); //關SPI 接收中斷
//==================================
GPIO 構件接口函數(shù)說明如下所示:
//==================================
uint8 hw_gpio_init (uint8 port,uint8 pin,uint8dir,uint8 state);//初始化端口為GPIO 引腳
uint8 hw_gpio_set (uint8 port,uint8 pin, uint8state); //設置指定引腳狀態(tài)
uint8 hw_gpio_get(uint8 port,uint8 pin);//獲取指定引腳狀態(tài)
uint8 hw_gpio_reverse(uint8 port,uint8 pin);//反轉指定引腳狀態(tài)
//==================================
高層構件包括三個部分:FreeRTOS 操作系統(tǒng)在MCF52235 上的移植[13-14],Shell 的實現(xiàn),網(wǎng)絡命令和信息的封裝。 將FreeRTOS 移植到MCF52235主要是實現(xiàn)3 個底層匯編級的支持函數(shù),tk_frame(task *tk, int (*entry)(), int arg)函數(shù)為tk 進程創(chuàng)建堆棧幀保存進程的各種狀態(tài);tk_switch (task *tk)函數(shù)用于把當前進程切換到tk 進程;tk_getsp()函數(shù)返回當前堆棧指針。 另外,在FreeRTOS 中運行一個Shell 進程,進程函數(shù)為int keyboard (int param),可調試或查看系統(tǒng)狀態(tài)信息,比如各個進程的運行狀態(tài)、ARP 表、IP 地址、MAC 地址、連接狀態(tài)等。
Shell 實現(xiàn)的效果如圖5 所示。
在實際應用中,通常一臺PC 主機管理若干讀卡器, 一個讀卡器可以為若干PC 主機服務。 每個PC 主機和讀卡器都具有不同的IP 地址, 一臺PC主機可以控制讀寫器1 讀寫每個Type A 卡的某個塊數(shù)據(jù), 還可以同時控制讀寫器2 讀寫每個TypeA 卡的另一個塊數(shù)據(jù), 或者請求讀取Type B 卡的UID, 整個網(wǎng)絡關系比較復雜。 因此采用將主機發(fā)送的命令、網(wǎng)絡信息、卡信息封裝在如下所示的若干個數(shù)據(jù)結構中。
//==================================
struct invite_info //PC 主機發(fā)送的讀卡請求
{ char del_or_add; //主機離開或加入
uint8 type; //卡的類型
uint8 block; //要訪問的數(shù)據(jù)塊
uint8 password[6]; //塊的密碼
};
struct ip_arrays_B //讀Type B 卡信息
{ ip_addr ipaddress; //IP 地址
int port; //UDP 端口號
};
struct send_data_type //發(fā)送到主機的數(shù)據(jù)
{ uint8 sn[4]; //序列號
uint8 block; //塊號
uint8 data[16]; //16 個字節(jié)塊數(shù)據(jù)
uint8 ret; //返回值
};
struct IC_ope //用于消費用途的RFID 應用
{
uint8 block; //總的金額數(shù)
float fsub; //每次刷卡扣除的金額數(shù)量
uint8 *pass;
};
struct record_info //記錄卡信息
{ //此塊引用計數(shù),0 表示沒有請求讀這塊數(shù)據(jù)
uint8 ref; //引用計數(shù)
uint8 block; //塊號
uint8 password[6]; //塊的訪問密碼
};
struct ip_arrays_A //讀Type A 卡信息
{ ip_addr ipaddress; //IP 地址
int port; // UDP 端口號
uint8 block [num_of_rf_structs]; //這個UDP連接要讀取的所有塊
};
struct net_cmd //發(fā)送到板子的命令
{ uint8 lenth; //請求數(shù)據(jù)長度
uint8 cmdope; //操作碼
uint8 data[1]; //數(shù)據(jù)
};//=================================
3 RFID 通用開發(fā)平臺應用
基于此平臺文中開發(fā)了學生機房上機刷卡系統(tǒng)。 在每個機房安裝一臺讀卡器,PC 主機的數(shù)據(jù)庫中存儲了每個機房的課表、任課教師和學生的信息。 學生持卡到各個機房的讀卡器上刷卡,讀卡器將讀到的信息通過網(wǎng)絡傳輸?shù)絇C 主機上,統(tǒng)計學生人數(shù)和上、下課時間等情況, 相關信息顯示在LCD 上并進行語音提示。 PC 端軟件實現(xiàn)了網(wǎng)絡通信功能和學生機房上機刷卡管理系統(tǒng)。 網(wǎng)絡通信通過CManagerDlg:: m_skInfo 和CManagerDlg::
m_skCmd 這2 個sokcet 接口完成。 學生機房上機刷卡管理系統(tǒng)開發(fā)軟件采用VC++2012 和SQLServer 2012 關系型數(shù)據(jù)庫管理系統(tǒng)。 學生機房上機刷卡管理系統(tǒng)界面如圖6 所示。
4 結語
現(xiàn)有RFID 系統(tǒng)開發(fā)基本是根據(jù)具體應用需求進行單獨設計的。 而這些不同的應用系統(tǒng)在軟、硬件部分具有很大的重復性,為提高軟、硬件的可重用性,文中通過分析RFID 射頻識別系統(tǒng)一般模型,提出了一種基于MCF52235 的RFID 通用開發(fā)平臺軟、硬件構件化設計方案,設計了集成多種接口的具備通用功能的RFID 開發(fā)平臺,并將該平臺應用于學生機房上機管理系統(tǒng)中。 實踐證明它為RFID 系統(tǒng)開發(fā)提供了一個快速、通用的軟、硬件模型。
評論