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