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 地址、連接狀態等。
評論