基于STM32的Mifare IC卡讀寫(xiě)卡器設計
摘要:本文設計了一款符合14443A標準的Mifare IC卡讀寫(xiě)器。系統以STM32F103C8T6為主控芯片,讀寫(xiě)卡芯片采用MFRC522芯片(支持14443A協(xié)議,其頻率為13.56MHz),采用SPI通訊方式實(shí)現與Mifare IC卡的通訊;利用雙線(xiàn)并繞的方式設計PCB天線(xiàn),大幅提高了讀寫(xiě)卡器的天線(xiàn)信號強度和生產(chǎn)成品率。上位機軟件基于VC6.0底層代碼編寫(xiě),方便地實(shí)現了對Mifare IC卡的讀寫(xiě)。
本文引用地址:http://dyxdggzs.com/article/201603/288904.htm引言
Mifare類(lèi)型的非接觸式智能IC卡作為符合14443A標準的IC卡,廣泛應用在電子錢(qián)包、各類(lèi)場(chǎng)所的門(mén)禁系統中。MFRC522作為支持該標準的射頻讀寫(xiě)卡芯片,擁有多種通訊接口(例如UART、SPI、I2C),可以通過(guò)單片機方便地讀寫(xiě)MFRC522射頻芯片內部的寄存器,配合天線(xiàn)對Mifare IC卡片進(jìn)行讀寫(xiě)。
本文設計的讀寫(xiě)卡器以STM32F103C8T6為主控芯片,通過(guò)SPI通訊方式,選用支持14443A協(xié)議的頻率為13.56MHz的讀卡芯片MFRC522與Mifare卡通訊,并利用雙線(xiàn)并繞的方式設計PCB天線(xiàn),可大幅提高讀寫(xiě)卡器的天線(xiàn)信號強度和生產(chǎn)成品率。配合上位機軟件可以便捷地對Mifare IC卡片進(jìn)行讀寫(xiě)以作為儲值卡、會(huì )員卡和物品管理卡片使用。
1 硬件系統設計
本讀寫(xiě)卡器的硬件設計框圖如圖1所示。
本設計以STM32F103C8T6為主控芯片,采用USB供電方式,可以通過(guò)虛擬串口進(jìn)行開(kāi)發(fā)調試并且與上位機進(jìn)行通信。主控芯片通過(guò)SPI接口方式與RC522進(jìn)行通訊,RC522則利用電磁感應的原理與無(wú)源Mifare IC卡進(jìn)行數據交換,上位機軟件用于對卡片進(jìn)行配置與讀寫(xiě)操作,同時(shí)STM32驅動(dòng)蜂鳴器和貼片LED發(fā)光二極管以告知用戶(hù)系統運行狀態(tài)。
1.1 相關(guān)芯片及Mifare IC卡片介紹
STM32F103C8T6為 ST (意法半導體)公司生產(chǎn)的一款入門(mén)級低功耗32位ARM芯片,擁有64Kb片內Flash,以及包括UART、USB、CAN、SPI、I2C等在內的豐富的硬件接口,結合keil或者IAR開(kāi)發(fā)環(huán)境及其標準固件庫可方便的進(jìn)行產(chǎn)品開(kāi)發(fā)。
MFRC522為NXP公司生產(chǎn)的一款支持ISO/IEC 14443A標準的讀寫(xiě)芯片,根據天線(xiàn)尺寸和調校效果讀寫(xiě)距離可達50mm,其多樣化的硬件接口可方便的與單片機或PLC進(jìn)行通訊,其QFN32的小型封裝,有利于集成到緊湊型產(chǎn)品之中。
Mifare S50非接觸式智能IC卡片擁有1Kb存儲空間,存儲于16個(gè)扇區內,每個(gè)扇區分為0-3塊,共64塊,每個(gè)數據塊包含16個(gè)字節。其操作頻率為13.56MHz,根據天線(xiàn)設計最高讀寫(xiě)距離為100mm,數據可存儲10年,寫(xiě)次數可達10萬(wàn)次。
1.2 原理圖設計
考慮到各芯片電源電壓與使用場(chǎng)景,設置系統的輸入電壓為5V直流,經(jīng)過(guò)L1117-3.3穩壓芯片輸出3.3V直流電壓供電,為保證直流電源波形噪聲小,可在5V輸入端和3.3V輸出端并聯(lián)2個(gè)100uf鉭電容進(jìn)行濾波。同樣的,可在每個(gè)電源管腳附近布一顆100nf電容用作退耦電容穩定輸入電源。主芯片JTAG接口加10k上拉電阻進(jìn)行連接,方便使用Ulink等調試器進(jìn)行在線(xiàn)調試及仿真。采用SI2301的MOS管芯片驅動(dòng)發(fā)光二極管與蜂鳴器。將主控芯片與MFRC522芯片按照SPI接口連接,并按要求,將MFRC522芯片1腳I2C引腳接地,將32腳EA引腳拉高以使其硬件運行于SPI模式下。
SPI串行外設接口作為單片機與外設進(jìn)行通信的一種高速、全雙工的總線(xiàn)模式,因其僅需SPI_SCK(SPI時(shí)鐘)、SPI_MISO(主輸入從輸出)的SPI_MOSI(主輸出從輸入)以及一根SPI_NSS(SPI片選)信號線(xiàn)即可完成主芯片與MFRC522的通訊接口。利于PCB布局布線(xiàn),由于MFRC522與STM32均有SPI接口,并且SPI時(shí)序較為簡(jiǎn)潔易于調試,故在本設計中可以直接通過(guò)STM32F103的SPI總線(xiàn)讀寫(xiě)MFRC522芯片的寄存器來(lái)進(jìn)行芯片的設置與配置。SPI硬件接口如圖2所示。
1.3 天線(xiàn)設計
由于MFRC522與Mifare卡通信是利用電磁感應,在卡片與天線(xiàn)匹配時(shí)產(chǎn)生電荷進(jìn)行數據交換,故天線(xiàn)的設計顯得尤為重要,天線(xiàn)部分原理圖如圖3所示。
根據官方天線(xiàn)設計指導手冊可得:
分析可知優(yōu)化前的天線(xiàn)中點(diǎn)接地,其整體也為GND的一部分,故在天線(xiàn)繞制時(shí)相鄰的兩根線(xiàn)在生產(chǎn)的時(shí)候極易發(fā)生短路的情況,導致天線(xiàn)強度大大減小。為保證PCB在制板生產(chǎn)中的合格率,本設計采用雙線(xiàn)并繞的方式直接在板上繪制RC522的天線(xiàn)部分。PCB如圖5所示。
具體設計方法是在天線(xiàn)的匹配網(wǎng)絡(luò )中串入2個(gè)歐姆的電阻(R4與R10),在PCB繪制時(shí)將天線(xiàn)兩端同時(shí)開(kāi)始走線(xiàn),使得天線(xiàn)的相鄰兩根線(xiàn)在物理上隔離,這樣制板時(shí)機器可以檢測出相鄰的天線(xiàn)部分是否有短路情況。通過(guò)這種設計,可將產(chǎn)品的天線(xiàn)合格率由優(yōu)化之前的95%提高到近100%,大大降級了天線(xiàn)短路所帶來(lái)的卡片感應距離低,合格率低的問(wèn)題。
通過(guò)對MFRC522讀卡芯片天線(xiàn)部分的改進(jìn)與優(yōu)化,使得天線(xiàn)短路情況發(fā)生情況大大減少,產(chǎn)品良品率有較大提高,讀卡距離可達70mm,配合嵌入式軟件與上位機軟件,讀寫(xiě)Mifare IC卡片效率較高。
2 軟件設計與實(shí)現
通過(guò)STM32的SPI對MFRC522的內部寄存器進(jìn)行讀寫(xiě),配置所需寄存器以達到設置芯片的目的來(lái)驅動(dòng)電線(xiàn)部分,通過(guò)芯片的RX、TX引腳發(fā)送和接收信號對Mifare卡片進(jìn)行數據傳輸,接收到的數據則存儲在RC522芯片內部FIFO中,stm32 讀取FIFO即可取出相應的數據。
STM32軟件內采用串口中斷方式查看是否有數據接收,主程序的while(1)死循環(huán)內輪詢(xún)查詢(xún)從串口接收的數據是否為上位機下發(fā)來(lái)的符合通訊協(xié)議的指令,并對數據進(jìn)行CRC校驗查看是否有數據遺失和錯誤。若收到上位機指令并數據完整正確,則執行相應的通訊協(xié)議中的Command,并返回執行狀態(tài)。具體軟件設計框圖如圖6所示。
2.1 系統初始化函數
利用STM32的標準庫函數可以快速對芯片的SPI進(jìn)行初始化,其中需要注意的是根據MFRC522的數據手冊中芯片的SPI時(shí)序圖,其CPOL極性為低電平,即時(shí)鐘空閑時(shí)候的電平是低電平,所以當SCLK有效的時(shí)候,就是高電平;相位CPHA為第一個(gè)邊沿,即在CPOL為0時(shí),時(shí)鐘空閑時(shí)是低電平,第一個(gè)邊沿從低變到高,為上升沿。
在STM32的main函數中上電后主要完成相應的時(shí)鐘、GPIO以及SPI之后,通過(guò)讀寫(xiě)寄存器配置MFRC522芯片,完成設置芯片工作模式、天線(xiàn)增益、使能天線(xiàn)收發(fā)信號等操作,之后使能USB時(shí)鐘、配置USB相關(guān)GPIO管腳、USB接收中斷、初始化波特率等。
2.2 硬件與上位機通訊
當程序運行至while(1)循環(huán)時(shí),循環(huán)檢查是串口是否收到數據,若收到則繼續檢查數據是否為上位機命令并進(jìn)行CRC校驗,解析出具體的命令號,即m_nProtocol,根據該值執行相關(guān)命令并返回執行結果,以檢查串口連接為例:
if(Received() != 0)
{
if(GetUsbReceived((u8 *)&m_NetComm,sizeof(m_NetComm)))
{
if(!VerifyCRC(&m_NetComm)) continue;
}
}
其中Received(void)函數判斷串口中斷是否有數據接收,GetUsbReceived(u8 *pdata, u32 num)函數用于接收數據到pdata指針中,實(shí)際中將這些數據放置于m_NetComm結構體中,通過(guò)比對結構體的m_Header成員中的m_nProtocol來(lái)啟動(dòng)相應的處理程序。
switch(m_NetComm.m_Header.m_nProtocol)
{
case CMD_FindDevice:
if(m_NetComm.m_Header.m_nOperation == 0) //請求
{
strcpy((char *)m_NetComm.myunion.m_FindDeviceAck.DeviceIdentify,"Greenpow Usb IC card reader");
m_NetComm.m_Header.m_nOperation = 1;
m_NetComm.m_Header.m_Err = ERR_OK;
SendPacket(&m_NetComm);
}
break;
}
當串口收到數據包時(shí),通過(guò)判斷是FindDevice指令,執行if內部語(yǔ)句,通過(guò)USB虛擬串口SendPacket(NetComm_Struct *p_net)函數發(fā)送特定字符,通過(guò)上位機驗證即可連接成功。
軟件使用MFC底層CSerialCom類(lèi)中的OpenPort函數打開(kāi)指定串口,ConfigurePort函數配置串口,使用ClosePort函數關(guān)閉串口。與下位機的程序恰恰相反,上位機通過(guò)發(fā)送請求命令,接收應答信息來(lái)執行相關(guān)指令。通過(guò)發(fā)送NetComm_Struct結構體,根據串口收到的數據執行相應函數。按照協(xié)議,如果USB有回應則確認連接成功,可以進(jìn)行使用。在遵循操作Mifare卡的時(shí)序的基礎上,依次進(jìn)行防沖突、選卡、驗證和讀寫(xiě)的順序進(jìn)行卡片的操作。每次不同操作之后都在軟件的右下角EditBox控件內有提示信息,結合蜂鳴器以及LED燈可以方便的了解操作結果。
3 結論
論文以STM32F103C8T6為主控芯片,以 MFRC522為讀寫(xiě)卡芯片,采用SPI通訊方式與Mifare IC卡的通訊;通過(guò)對MFRC522讀卡芯片天線(xiàn)部分的改進(jìn)與優(yōu)化,使得天線(xiàn)短路情況大大減少,讀卡距離可達70mm,配合嵌入式軟件和上位機軟件,方便地實(shí)現了對Mifare IC卡的讀寫(xiě),讀寫(xiě)效率較高。為非接觸式IC卡讀寫(xiě)器的設計提供了一種有效方案。
參考文獻:
[1] 劉火良.STM32庫開(kāi)發(fā)實(shí)戰指南[M].北京:機械工業(yè)出版社,2013
[2] 王愛(ài)英. 智能卡技術(shù):IC卡、RFID標簽與物聯(lián)網(wǎng)[M].北京:清華大學(xué)出版社,2015
[3] 李志明. STM32嵌入式系統開(kāi)發(fā)實(shí)戰指南[M].北京:機械工業(yè)出版社,2015
[4] 李令偉. 嵌入式C語(yǔ)言實(shí)戰教程[M].北京:電子工業(yè)出版社,2014
[5] 張淑清. 嵌入式單片機STM32設計及應用技術(shù) [M].北京:國防工業(yè)出版社,2015
本文來(lái)源于中國科技期刊《電子產(chǎn)品世界》2016年第3期第31頁(yè),歡迎您寫(xiě)論文時(shí)引用,并注明出處。
評論