在C51單片機(jī)上對(duì)讀寫卡芯片MFRC522編程1 概述 在整個(gè)的射頻識(shí)別系統(tǒng)中。讀寫卡模塊負(fù)責(zé)建立單片機(jī)與電子標(biāo)簽之間的通信,起著非常重要的作用。而整個(gè)讀寫卡模塊的核心,就是讀寫卡芯片MFRC522 file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2A99.tmp.png MFRC522 是NXP 公司專為各種計(jì)量檢測(cè)設(shè)備而設(shè)計(jì)、推出的一款低成本、低功耗的非接觸式讀寫卡芯片。該芯片應(yīng)用于 13.56MHz 非接觸通信,應(yīng)用了較為先進(jìn)的調(diào)制和解調(diào)概念,集成了眾多的通信方式和協(xié)議,其內(nèi)部強(qiáng)大的電路可直接驅(qū)動(dòng)天線無(wú)需其他外接電路,通過(guò)其獨(dú)特的加密算法,更使其具備可較強(qiáng)的安全性。 作為一款較為成功的讀寫卡芯片,MFRC522與主機(jī)間的通信采用的是連線較少的串行通信,而且可根據(jù)不同的用戶需求,從 SPI、I2C、串行 UART三種總線模式中選擇,這樣的設(shè)計(jì)有利于減少連線數(shù)量,縮小 PCB 板體積,降低成本。 目前MFRC522在很多的領(lǐng)域都得到了廣泛應(yīng)用,尤其適用于低成本、小尺寸、低功耗和單電源的非接觸式通信的應(yīng)用場(chǎng)合,是智能儀表、板上單元、便攜式手持設(shè)備的極佳選擇。 目前,全國(guó)各大城市的公共交通終端以及非接觸式公用電話應(yīng)用的正是MFRC522 2 特性 1. 高度集成的模擬電路模塊,應(yīng)用新概念完成調(diào)制和解調(diào)。 2. 支持ISO 14443A與MIFARE通信協(xié)議 3. 驅(qū)動(dòng)優(yōu)化,采用少量外部器件就能輸出驅(qū)動(dòng)級(jí)到天線 4. 支持MIFARE的加密算法 5. 可自由選擇多樣的主機(jī)接口: ①10Mbit/s的SPI接口 ② I2C接口,快速傳輸模式的速率為400kbit/s, 高速模式的速率為3400kbit/s ③串行UART,傳輸速率高達(dá)1228.8kbit/s,幀取決于RS232接口,電壓電平取決于提供的管腳電壓 6. 靈活的中斷模式 7. 64字節(jié)的發(fā)送接收緩沖區(qū) 8. 具備軟件掉電、硬件掉電和發(fā)送器掉電三種低功耗模式,能夠通過(guò)關(guān)閉相應(yīng)的模塊或驅(qū)動(dòng)器達(dá)到節(jié)電的目的。 9. 2.5~3.3V的低電源電壓,低功耗設(shè)計(jì) 10. 內(nèi)部振蕩器,鏈接27.12HZ的晶體 11.可編程定時(shí)器 12.自由編程的I/O管腳 13.內(nèi)置溫度傳感器,當(dāng)芯片溫度過(guò)高時(shí)會(huì)自動(dòng)停止射頻信號(hào)的發(fā)射 14. 體積小,僅有5mm╳5mm╳0.85mm 3 系統(tǒng)結(jié)構(gòu) file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2AA9.tmp.png MFRC522與MCU通過(guò)串口進(jìn)行數(shù)據(jù)交換,其支持3種微控制器接口類型:SPI、I2C以及串行UART。且MFRC522 具備接口復(fù)位功能,能夠自動(dòng)檢測(cè)當(dāng)前執(zhí)行了上電復(fù)位或硬復(fù)位的微控制器的接口類型。 MFRC522的數(shù)據(jù)處理模塊負(fù)責(zé)執(zhí)行數(shù)據(jù)的并行與串行之間的轉(zhuǎn)換和奇偶校驗(yàn),并且集成了多種協(xié)議,支持 ISO14443A 的所有層。 狀態(tài)和控制模塊通過(guò)對(duì)器件進(jìn)行配置來(lái)達(dá)到適應(yīng)環(huán)境和外部影響的目的,從而使芯片性能達(dá)到最佳狀態(tài)。 CRYPTO1 流密碼單元是保障MFRC522通信穩(wěn)定、安全的關(guān)鍵,當(dāng)芯片與MIFARE電子標(biāo)簽建立通信時(shí),高速CRYPTO1 流密碼單元和非易失性密匙存儲(chǔ)器將完成密匙的校驗(yàn)。 模擬電路中包含了一個(gè)功能強(qiáng)大的驅(qū)動(dòng)部分,負(fù)責(zé)信號(hào)的發(fā)送、檢測(cè)合接收。 4 引腳配置 作者利用Protel繪制的原理圖: file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2AAA.tmp.png 如上圖所示,MFRC522芯片為 32 腳 HVQFN 封裝。器件使用了 3 個(gè)獨(dú)立的電源以實(shí)現(xiàn)在電磁兼容方面的要求。 ●天線 MFRC522芯片通過(guò)TX1和TX2這兩個(gè)管腳向外輸出13.56MHz 的能量載波來(lái)驅(qū)動(dòng)天線;當(dāng)電子標(biāo)簽收到天線發(fā)出的激勵(lì)信號(hào)后,就會(huì)發(fā)射出響應(yīng)信號(hào),天線接收到響應(yīng)信號(hào)就會(huì)通過(guò)天線的外部電路將其送給RX管腳進(jìn)行處理。 此外,為了確保驅(qū)動(dòng)模塊的正常工作,MF RC522設(shè)計(jì)了單獨(dú)電源專為驅(qū)動(dòng)部分供電。 ●模擬電源 MFRC522 的模擬部分使用單獨(dú)電源進(jìn)行供電。 ●數(shù)字電源 MFRC522 數(shù)字部分使用單獨(dú)電源進(jìn)行供電。 ●振蕩器 頻率為27.12MHz 的晶振通過(guò)一段緩沖區(qū)被連接到OSCIN管腳和 OSCOUT管腳。如果開發(fā)者需要采用外部晶振作為時(shí)鐘,可從 OSCIN 引入外部時(shí)鐘信號(hào)。 ●電子標(biāo)簽接口 MFRC522 為 MIFARE®有源天線的設(shè)計(jì)提供了相應(yīng)的支持。通過(guò)SIGIN 和SIGOUT就可以對(duì)MIFARE的信號(hào)進(jìn)行處理。 ●串行接口 名稱 | | | | | 不同接口的數(shù)據(jù)線 (測(cè)試腳、I2C、SPI、UART ) | | | | | | | | | |
由于本次設(shè)計(jì)中MFRC522與MCU之間最終選擇了SPI接口,在此特將各引腳在SPI接口模式下的定義列出: 5 MFRC522的功能實(shí)現(xiàn)為了通過(guò)編程實(shí)現(xiàn)MFRC522的讀寫卡功能,我們的第一步就是把要用的命令字和地址進(jìn)行定義。我們通過(guò)查找芯片手冊(cè),得到詳盡的MFRC522命令字、MifareOne卡片命令字以及MFRC522各寄存器的功能與定義。 接下來(lái),打開Keil uVision4并在工程中添加rc522.h文件,用這個(gè)文件定義所有射頻識(shí)別過(guò)程中可能用到的命令字與地址: file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2ABB.tmp.png 通過(guò)上圖大家可以看到,整個(gè)522.h文件中基本全都是#define 我們只需要將芯片手冊(cè)中的信息仔細(xì)錄入,并寫好注釋。而且,為了便于管理,rc522.h里的語(yǔ)句被我分成了四類,分別是:①M(fèi)FRC522命令字 ②MifareOne卡片命令字 ③ MFRC522寄存器 ④MF522通訊錯(cuò)誤的處理代碼 接下來(lái),我們就要開始編程實(shí)現(xiàn)MFRC522的一些具體功能了。在工程中新建rc522.c文件,在該文件中編寫MFRC5222讀寫卡過(guò)程中需要的指令。 file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2AEB.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2AEC.tmp.pngRC522完整的讀寫卡流程框圖: file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2AFD.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2AFE.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2AFF.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B0F.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B10.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B11.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B31.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B32.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B33.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B44.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B45.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B46.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B57.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B58.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B68.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B69.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B6A.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B8B.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B8C.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B8D.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B9D.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2B9E.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2BAF.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2BB0.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2BB1.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2BC1.tmp.pngfile:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2BC2.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2BC3.tmp.png file:///C:\Users\wangpu\AppData\Local\Temp\ksohtml\wps2BD4.tmp.png 根據(jù)上面的讀寫卡流程框圖,我們按照每個(gè)框的內(nèi)容編寫與之相對(duì)應(yīng)的程序。 ●尋卡請(qǐng)求 讀寫卡模塊向外發(fā)射激勵(lì)信號(hào),一旦有Mifare卡進(jìn)入讀寫器天線工作范圍,讀寫模塊發(fā)送命令。Mifare卡收到命令后會(huì)將卡上的儲(chǔ)存單元中的卡片類型號(hào)(TagType)信息即2個(gè)字節(jié)數(shù)據(jù)發(fā)給讀寫器。從而建立Mifare卡與RC522通信的第一步。 尋卡請(qǐng)求函數(shù): char PcdRequest(unsigned char req_code,unsigned char *pTagType) 說(shuō)明: req_code[IN]:尋卡方式 0x52 = 尋感應(yīng)區(qū)內(nèi)所有符合14443A標(biāo)準(zhǔn)的卡 0x26 = 尋未進(jìn)入休眠狀態(tài)的卡 pTagType[OUT]:卡片類型代碼 0x4400 = Mifare_UltraLight 0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire 操作成功返回值為0 即完成整個(gè)的尋卡請(qǐng)求。 ●防沖撞+選定Mifare卡 由于RC522在同一時(shí)間內(nèi)只能與一個(gè)Mifare卡進(jìn)行通信,因此在完成尋卡請(qǐng)求之后,為了防止有多個(gè)Mifare卡同時(shí)處于讀寫卡模塊天線工作范圍而造成沖撞,需進(jìn)行防沖撞操作,即讀寫卡模塊與一張Mifare卡建立聯(lián)絡(luò),取得其全球唯一的序列號(hào)。 防沖撞函數(shù): char PcdAnticoll(unsigned char *pSnr) 說(shuō)明: pSnr[OUT]:用于卡片序列號(hào),4字節(jié) 操作成功時(shí)函數(shù)返回值為0. 在獲得Mifare卡的序列號(hào)之后,我們需要做的就是對(duì)指定的序列號(hào)的Mifare卡進(jìn)行選定,只有被選中的卡才能與RC522建立進(jìn)一步的通信,其它的Mifare卡將全部回到初始狀態(tài)。 選定Mifar卡函數(shù): char PcdSelect(unsigned char *pSnr) 說(shuō)明:pSnr[IN]:之前防沖撞操作中獲得的Mifare卡序列號(hào),4字節(jié) 操作成功時(shí)函數(shù)返回值為0. ●驗(yàn)證Mifare密碼 為了訪問(wèn)Mifare卡中的某個(gè)扇區(qū)里存放的數(shù)據(jù),必須進(jìn)行密碼的驗(yàn)證。用戶首先要通過(guò)編程將已經(jīng)設(shè)定好的密鑰存入RC522內(nèi)部的密鑰存儲(chǔ)區(qū)中,然后再比對(duì)Mifare卡中存放的密鑰與RC522密鑰存儲(chǔ)區(qū)中的密鑰是否相同,只有確認(rèn)二者相同之后才可以對(duì)當(dāng)前Mifare卡的這個(gè)扇區(qū)進(jìn)行下一步操作。 密碼驗(yàn)證函數(shù): char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) 說(shuō)明: auth_mode[IN]: 密碼驗(yàn)證模式 0x60 = 驗(yàn)證A密鑰 0x61 = 驗(yàn)證B密鑰 addr[IN]:塊地址 pKey[IN]:密碼 pSnr[IN]:卡片序列號(hào),4字節(jié) 操作正確時(shí)返回 0. ●讀操作 完成了密碼認(rèn)證,我們就可以從Mifare卡中的扇區(qū)中讀出數(shù)據(jù),每次讀出數(shù)據(jù)的大小為16字節(jié)。 讀操作函數(shù): char PcdRead(unsigned char addr,unsigned char *pData) 說(shuō)明: addr[IN]:塊地址,取值范圍0—63 pData[OUT]:從Mifare卡中讀出的數(shù)據(jù),16字節(jié) 操作成功返回0. ●本次設(shè)計(jì)中使用的程序: void ctrlprocess(void) { unsigned char ii; char status; status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)的卡,返回卡片類型 2字節(jié) if(status!=MI_OK) { return; } status=PcdAnticoll(&RevBuffer[2]);//防沖撞,返回卡的序列號(hào), 4字節(jié)的序列號(hào)被存放在RevBuffer[2]中 if(status!=MI_OK) { return; } memcpy(MLastSelectedSnr,&RevBuffer[2],4);//將RevBuffer[2]中存放的4字節(jié)的序列號(hào)復(fù)制到MLastSelectedSnr變量中存儲(chǔ) for(ii=0;ii<4;ii++) { Show816(0,5+2*ii,(MLastSelectedSnr[ii]>>4)&0x0f); Show816(0,6+2*ii,MLastSelectedSnr[ii]&0x0f); } //將4個(gè)字節(jié)序列號(hào)分別存放到MLastSelectedSnr[0]到MLastSelectedSnr[3],方便后續(xù)的顯示與發(fā)送 2 Mifare One卡 ① Mifare卡的激勵(lì) 首先,通信系統(tǒng)中的讀卡器始終都在通過(guò)天線向周圍發(fā)射一組頻率固定的電磁波,這組電磁波即激勵(lì)信號(hào)。接下來(lái),一旦非接觸式Mifare卡進(jìn)入讀寫器工作范圍內(nèi),即會(huì)被讀寫器的激勵(lì)限號(hào)信號(hào)所激勵(lì)。受到激勵(lì)信號(hào)的影響,Mifare卡內(nèi)部的諧振電路就會(huì)產(chǎn)生共振,從而使卡的內(nèi)部電容中內(nèi)產(chǎn)生了電荷。而在這個(gè)電容的另一端,我們通過(guò)一個(gè)單向?qū)ǖ碾娮颖茫涂梢詫㈦娙輧?nèi)儲(chǔ)存的電荷轉(zhuǎn)移到另一個(gè)電容內(nèi)儲(chǔ)存。然后,整個(gè)共振和電荷轉(zhuǎn)移的過(guò)程周而復(fù)始,當(dāng)電容中存儲(chǔ)的電壓達(dá)到2 V時(shí),此電容就成為Mifare卡的電源,并開始為卡內(nèi)的其他電路提供工作電壓,從而幫助Mifare卡完成應(yīng)答、存儲(chǔ)、通信等一系列功能。 ② ATR模塊的啟動(dòng):Answer To Request(“應(yīng)答讀寫器發(fā)出的請(qǐng)求”) 當(dāng)非接觸式Mifare卡進(jìn)入讀寫器的工作范圍內(nèi)時(shí),我們就可以控制讀寫器向Mifare卡發(fā)出Request all(或Request std)指令,收到指令后的Mifare卡將啟動(dòng)ATR模塊。這時(shí),Mifare卡的內(nèi)部芯片就會(huì)將卡的類型號(hào)(TagType)傳送給讀寫器,從而建立Mifare卡與讀寫器的聯(lián)絡(luò)。 注意,如果不進(jìn)行ATR的啟動(dòng),讀寫器對(duì)卡的進(jìn)一步操作(讀/寫操作等)將不會(huì)進(jìn)行。所以,我們可以將ATR啟動(dòng)理解為Mifare卡與讀寫器之間通信的第一步。 ③ AntiCollision模塊:Mifare卡防沖突 當(dāng)有多張Mifare卡處在讀寫器的天線工作范圍內(nèi)時(shí),AntiCollision模塊,即防沖突功能將被啟動(dòng)。這時(shí),讀寫器首先將逐一地與每一張Mifare卡進(jìn)行通信,從而讀取每一張Mifare卡序列號(hào)(Serial Number)。由于每一張Mifare卡都的序列號(hào)都是獨(dú)一無(wú)二的,因此我們就可以借助讀寫器中的AntiCollision防重疊模塊以及Mifare卡上的防重疊模塊,通過(guò)Mifare卡唯一的序列號(hào)來(lái)選定多張Mifare卡中的一張。被選中的卡就可以暢通無(wú)阻地與讀寫器進(jìn)行數(shù)據(jù)交換,而那些未被選中的卡則處于待命狀態(tài),準(zhǔn)備隨時(shí)與讀寫器進(jìn)行通信聯(lián)絡(luò)。 ④ Select Application 模塊:選中并鎖定Mifare卡片 當(dāng)Mifare卡與讀寫器完成了上面的兩個(gè)步驟之后,若讀寫器要想對(duì)卡進(jìn)行讀/寫操作,還須對(duì)已經(jīng)完成了ATR啟動(dòng)的Mifare卡進(jìn)行“Select”操作,從而使卡真正地被選中。 被選中并鎖定的Mifare卡會(huì)將卡片上存儲(chǔ)的“Size” 字節(jié)傳送給讀寫器。只有當(dāng)讀寫器收到這一字節(jié)之后,才可對(duì)卡進(jìn)行下一步的操作。 ⑤ Authentication & Access Control 模塊:認(rèn)證及存取控制模塊 以上的三個(gè)步驟完成后,我們還必須要對(duì)卡上已經(jīng)設(shè)置了的密碼進(jìn)行認(rèn)證,只有密碼匹配,我們才能被允許進(jìn)一步的讀/寫操作。 Mifare卡上有16個(gè)扇區(qū),每個(gè)扇區(qū)都能夠獨(dú)立設(shè)置各自的密碼,各個(gè)扇區(qū)之間互不干涉,因此我們必須逐一地分別加以認(rèn)證,才能對(duì)密碼匹配的扇區(qū)進(jìn)行下一步的操作。 這種設(shè)計(jì)的優(yōu)點(diǎn)是每個(gè)扇區(qū)都可以獨(dú)立開來(lái),應(yīng)用于一個(gè)特定的場(chǎng)合,從而讓一張Mifare卡實(shí)現(xiàn)多種功能,我們校內(nèi)的“一卡通”就是一個(gè)典型的例子。 Mifare卡的密碼的認(rèn)證采用了三次相互的認(rèn)證的方法,安全性極佳。試圖靠猜測(cè)密碼打開卡某個(gè)扇區(qū)幾乎不可能。 ⑥ Control & Arithmetic Unit:控制及算術(shù)運(yùn)算單元 該單元主要由Mifare卡內(nèi)部的中中央微處理器(MCU)構(gòu)成,它是整個(gè)卡的“大腦”。它對(duì)卡的各個(gè)單元進(jìn)行控制,同時(shí)它還需要完成對(duì)各種數(shù)據(jù)的運(yùn)算處理。 ⑦ RAM/ROM:存儲(chǔ)單元 Mifare卡內(nèi)部的RAM主要起到配合控制及算術(shù)運(yùn)算單元,將運(yùn)算的結(jié)果進(jìn)行暫時(shí)存儲(chǔ)的功能。RAM中的數(shù)據(jù)在卡失掉電源后(卡片離開讀寫器天線的有效工作范圍)將會(huì)丟失。 而ROM中則存儲(chǔ)了一些已經(jīng)固化了的Mifare卡運(yùn)行所必須的程序指令,當(dāng)需要調(diào)用時(shí),由控制及算術(shù)運(yùn)算單元直接從ROM中取出,從而通過(guò)指令對(duì)每個(gè)單元進(jìn)行控制。
|