2 RFID 通用開發(fā)平臺(tái)設(shè)計(jì)
2.1 硬件設(shè)計(jì)
硬件構(gòu)件模型中首先是主控制器MCU 的選型。 由于RFID 應(yīng)用廣泛, 很多場(chǎng)合要求控制器有較快的處理速度, 有多種控制模塊如A/D 控制模塊、CAN 總線模塊、以太網(wǎng)控制模塊等。 綜合分析,文中選擇了飛思卡爾單芯片解決方案MCF52235處理器。 該處理器采用Coldfire V2 內(nèi)核和精簡(jiǎn)指令集(RISC),頻率為60 MHz,通過設(shè)置鎖相環(huán)( PLL ),MCF52235 能夠穩(wěn)定工作在80 MHz. 內(nèi)部集成了10/100M 快速以太網(wǎng)控制器(FEC)、以太網(wǎng)物理收發(fā)器(EPHY)等模塊,還有UART,I2C、QSPI、PWM 、快速ADC 等模塊,實(shí)現(xiàn)了單芯片解決方案。
由于MCF52235 處理器中集成的以太網(wǎng)模塊已經(jīng)包括了以太網(wǎng)控制器和物理層收發(fā)器,因此網(wǎng)絡(luò)硬件構(gòu)件僅需添加少量的元件便可。 MCF52235處理器的PHY_RXP、PHY_RXN 引腳用于接收數(shù)據(jù),PHY_TXP、PHY_TXN 引腳用于發(fā)送數(shù)據(jù)。 這兩對(duì)收、發(fā)引腳分別接50 Ω 的上拉電阻。 SPDLED 引腳接網(wǎng)速LED 燈指示當(dāng)前的連接速度是10 Mbps還是100 Mbps,LNKLED 引腳接的LED 燈則指示當(dāng)前是否已經(jīng)與另一個(gè)網(wǎng)絡(luò)設(shè)備連接。 如果RFID射頻系統(tǒng)中讀卡器終端并不多,可以不采用網(wǎng)絡(luò)而是通過USB 接口與PC 機(jī)進(jìn)行通信。 USB 構(gòu)件采用飛思卡爾的單芯片MC9S12UF32, 它提供了高速USB2.0 接口, 即插即用。 此處使用USB 接口不是為了獲得更高的速度而是為了使用方便,所以選擇通過MCF52235 的一個(gè)串口與UF32 通信。
射頻芯片選用的是飛利浦RC531 芯片,工作頻率為13.56 MHz, 在不外加功率放大器時(shí)讀寫距離可達(dá)10 cm,它通過SPI 接口與MCF52235 通信。
LCD 構(gòu)件采用耀宇科技的YM12864 圖形點(diǎn)陣液晶。 該液晶顯示器可以顯示4 行、每行8 個(gè)漢字或者16 個(gè)字母。 它有兩種常用的連接方式:并行和串行。 并行連接需要11 根引腳線, 串行連接僅用3 根引腳線,因此與MCU 的連接采用串行的連接方式。 另外還需一個(gè)引腳控制背光燈電源的正極LEDA開關(guān)。 語音模塊和LCD 模塊的功能一樣,都是為了增強(qiáng)人機(jī)交互, 它采用上海奔流公司的BMP5008語音芯片。 狀態(tài)指示燈用于觀察系統(tǒng)的運(yùn)行狀態(tài)和用戶的操作,通過GPIO 口連接,幾乎所有的MCF52235 引腳都可以作為GPIO 引腳。 主控制器MCF52235 與各模塊的引腳連接如圖4 所示。
2.2 軟件設(shè)計(jì)
根據(jù)平臺(tái)的軟件構(gòu)件層次模型,先將各個(gè)模塊的驅(qū)動(dòng)程序封裝成構(gòu)件。 底層軟件構(gòu)件是與硬件直接打交道的,它由頭文件和源程序文件兩部分組成。 編程思想是分析構(gòu)件的共性和個(gè)性,抽取出構(gòu)件的屬性和對(duì)外接口函,用戶使用該構(gòu)件時(shí)只需了解其接口函數(shù), 而不必去了解內(nèi)部具體如何實(shí)現(xiàn)。
頭文件部分給出構(gòu)件屬性的宏定義和對(duì)外接口函數(shù)的原型說明,源程序部分是函數(shù)的實(shí)現(xiàn)。
以太網(wǎng)構(gòu)件主要包括以太網(wǎng)物理收發(fā)器(EPHY)和快速以太網(wǎng)控制器(FEC) 的初始化、TCP/IP 協(xié)議棧實(shí)現(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ā)送單個(gè)以太網(wǎng)幀
uint8 hw_fec_receiveframe(uint8 ch[], uint16 *len);//接收單個(gè)以太網(wǎng)幀
uint hw_icmp_handle(PACKET p);//處理接收到的ICMP 包,響應(yīng)ping 請(qǐng)求
int hw_udp_send (unshort fport, unshort lport,
PACKET p);//發(fā)送UDP 包
//==================================
RC531 射頻模塊與MCF52235 通信嚴(yán)格按照串行通信時(shí)序要求。 RC531 與ISO/IEC 14443 TypeA 和Type B 卡通信,則按照A、B 卡調(diào)制和編碼的方式設(shè)置相關(guān)的寄存器,并根據(jù)ISO/IEC 14443 協(xié)議來設(shè)計(jì)軟件即可。 讀卡器與A、B 卡之間的通信是按照應(yīng)答方式來進(jìn)行的,非接觸式的卡有很多工作狀態(tài),各個(gè)狀態(tài)的轉(zhuǎn)化可通過讀卡器向卡發(fā)送一系列命令完成。 射頻構(gòu)件的接口函數(shù)說明如下所示:
// ==操作Type A 卡的部分主要函數(shù)======
void pcdinit();//R 初始化
char pcdreset();//RC531 復(fù)位
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 構(gòu)件的通信同樣采用串行方式。 串行通信的一次數(shù)據(jù)分3 個(gè)字節(jié)傳輸。 第一個(gè)字節(jié)數(shù)據(jù)格式為11111AB0,表示串行控制,A 是選擇數(shù)據(jù)方向,1 表示LCD 到MCF52235,0 表示MCF52235 到LCD. B 是選擇數(shù)據(jù)類型,1 表示數(shù)據(jù)為顯示數(shù)據(jù),0 表示數(shù)據(jù)為控制命令。 第二個(gè)字節(jié)格式為DDDD0000, 表示8 位數(shù)據(jù)的高4 位。 第三個(gè)字節(jié)格式為0000DDDD 表示8 位數(shù)據(jù)的低4 位。
LCD 構(gòu)件接口函數(shù)說明如下所示:
//==================================
void lcd_init();//初始化
void lcd_display (const char* buf, int line);//在第line 行顯示buf,line>=0 && line<= 3
//==================================
USB 軟件構(gòu)件比較簡(jiǎn)單,只需對(duì)MC9S12UF32的USB 模塊進(jìn)行初始化,UF32 便可以和MCF52235 進(jìn)行交互了。 由于MCF52235 與UF32采用串口連接, 因此只要在串口中斷程序中調(diào)用USB 構(gòu)件,UF32 便可從串口接收數(shù)據(jù), 然后通過USB 傳送給上位機(jī)。 上位機(jī)通過USB 接口發(fā)送數(shù)據(jù)給UF32 也產(chǎn)生一個(gè)中斷,在中斷程序把數(shù)據(jù)緩存起來再調(diào)用USB 構(gòu)件, 通過串口發(fā)送給MCF52235. USB 構(gòu)件接口函數(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ù)
//==================================
語音構(gòu)件相對(duì)比較簡(jiǎn)單,接口函數(shù)說明如下所示:
//==================================
void audio_init();//語音模塊初始化
void audio_play(int i);//語音播放
void audio_stop();//語音停止
//==================================
串口構(gòu)件接口函數(shù)說明如下所示:
//==================================
uint8 hw_uart_init(uint8 uartNo, uint32 baud);//串口初始化
uint8 hw_uart_rev_one (uint8 uartNo, uint8 *fp); //串口接收一個(gè)字節(jié)到fp
uint8 hw_uart_send_one(uint8 uartNo, unit8 ch);
//串口發(fā)送一個(gè)字節(jié)
//==================================
SPI 構(gòu)件接口函數(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); //關(guān)SPI 接收中斷
//==================================
GPIO 構(gòu)件接口函數(shù)說明如下所示:
//==================================
uint8 hw_gpio_init (uint8 port,uint8 pin,uint8dir,uint8 state);//初始化端口為GPIO 引腳
uint8 hw_gpio_set (uint8 port,uint8 pin, uint8state); //設(shè)置指定引腳狀態(tài)
uint8 hw_gpio_get(uint8 port,uint8 pin);//獲取指定引腳狀態(tài)
uint8 hw_gpio_reverse(uint8 port,uint8 pin);//反轉(zhuǎn)指定引腳狀態(tài)
//==================================
高層構(gòu)件包括三個(gè)部分:FreeRTOS 操作系統(tǒng)在MCF52235 上的移植[13-14],Shell 的實(shí)現(xiàn),網(wǎng)絡(luò)命令和信息的封裝。 將FreeRTOS 移植到MCF52235主要是實(shí)現(xiàn)3 個(gè)底層匯編級(jí)的支持函數(shù),tk_frame(task *tk, int (*entry)(), int arg)函數(shù)為tk 進(jìn)程創(chuàng)建堆棧幀保存進(jìn)程的各種狀態(tài);tk_switch (task *tk)函數(shù)用于把當(dāng)前進(jìn)程切換到tk 進(jìn)程;tk_getsp()函數(shù)返回當(dāng)前堆棧指針。 另外,在FreeRTOS 中運(yùn)行一個(gè)Shell 進(jìn)程,進(jìn)程函數(shù)為int keyboard (int param),可調(diào)試或查看系統(tǒng)狀態(tài)信息,比如各個(gè)進(jìn)程的運(yùn)行狀態(tài)、ARP 表、IP 地址、MAC 地址、連接狀態(tài)等。
評(píng)論
查看更多