Step2:了解RC522的接收和發(fā)送數(shù)據(jù)的流程(工作過(guò)程) 相對(duì)于PHILIPS公司生產(chǎn)的其他14443基站芯片(如RC500、RC530等),RC522簡(jiǎn)化了內(nèi)部系統(tǒng)結(jié)構(gòu),去掉了片內(nèi)E2PROM。從而大大縮減了芯片命令集。另外,對(duì)載波調(diào)制電路,發(fā)送電路和解調(diào)、解碼電路的控制也相應(yīng)簡(jiǎn)化,去掉了校準(zhǔn)接收電路I時(shí)鐘、Q時(shí)鐘、校準(zhǔn)發(fā)送與接收時(shí)鐘相位等繁瑣的操作。一般而言,單片機(jī)與RC522的通信流程如圖3所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps889F.tmp.png 工作過(guò)程: 對(duì)卡的操作分成四步:尋卡→防沖突→選卡→讀/寫(xiě)卡; MFRC522發(fā)送與接收卡數(shù)據(jù)暫存于FIFO中; (1) 尋卡 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps88CF.tmp.jpg 向FIFO中寫(xiě)入PICC_REQIDL命令,通過(guò)PCD_TRANSCEIVE命令將FIFO中數(shù)據(jù)通過(guò)天線發(fā)送出去,此時(shí)若有卡在天線作用范圍內(nèi),將識(shí)別命令,并返回卡類(lèi)型; 卡類(lèi)型(TagType): 0x4400 = Mifare_UltraLight 0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire 關(guān)于下面兩條命令的區(qū)別: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps88DF.tmp.jpg 第一條命令讀取完卡后還會(huì)再次讀。 第二條命令讀取完卡后會(huì)等待卡離開(kāi)開(kāi)線作用范圍,直到再次進(jìn)入。 (2) 防沖突 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps88F0.tmp.jpg 向FIFO中寫(xiě)入PICC_ANTICOLL+0x20,通過(guò)PCD_TRANSCEIVE命令將FIFO中數(shù)據(jù)通過(guò)天線發(fā)送出去,卡返回卡序列號(hào)(共5字節(jié),第5字節(jié)是卡序列號(hào)校驗(yàn)碼); 由于是非接觸式的,同一時(shí)間天線作用范圍內(nèi)可能不只一張卡時(shí),即有多于一張的MIFARE 1卡發(fā)回了卡序列號(hào)應(yīng)答,則發(fā)生了沖突。此時(shí),由于每張卡的卡序列號(hào)各不相同,MCM接收到的信息(即卡序列號(hào))至少有1位既是0又是1(即該位的前、后半部都有副載波調(diào)制),MCM找到第1個(gè)沖突位將其置1(排除該位為0的卡),然后查第2個(gè),依次排除,最后不再有沖突的SN即為被選中的卡。 (3) 選卡 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps88F1.tmp.jpg 向FIFO中寫(xiě)入PICC_SElECTTAG+0x70+卡序列號(hào),通過(guò)PCD_TRANSCEIVE命令將FIFO中數(shù)據(jù)通過(guò)天線發(fā)送出去,卡返回卡容量(對(duì)于MIFARE 1卡來(lái)說(shuō),可能為88H或08H); (4) 對(duì)卡EEPROM讀寫(xiě)之前要進(jìn)行認(rèn)證 status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], serNum); //認(rèn)證 向FIFO中寫(xiě)入PICC_AUTHENT1A/PICC_AUTHENT1B+塊地址+扇區(qū)密碼+卡序列號(hào),通過(guò)PCD_TRANSCEIVE命令將FIFO中數(shù)據(jù)通過(guò)天線發(fā)送出去, MIFARE 1 卡的密碼認(rèn)證方式: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps8901.tmp.jpg 三次相互認(rèn)證的令牌原理框圖 (A) 環(huán):由MIFARE 1卡片向讀寫(xiě)器發(fā)送一個(gè)隨機(jī)數(shù)據(jù)RB。 (B) 環(huán):由讀寫(xiě)器收到RB后向MIFARE 1卡片發(fā)送一個(gè)令牌數(shù)據(jù)TOKEN AB,其中包含了用讀寫(xiě)器中存放的密碼加密后的RB及讀寫(xiě)器發(fā)出的一個(gè)隨機(jī)數(shù)據(jù)RA。 (C) 環(huán):MIFARE 1卡片收到 TOKEN AB 后,用卡中的密碼對(duì)TOKEN AB的加密的部分進(jìn)行解密得到RB',并校驗(yàn)第一次由(A)環(huán)中MIFARE 1卡片發(fā)出去的隨機(jī)數(shù)RB是否與(B)環(huán)中接收到的TOKEN AB中的RB'相一致;若讀寫(xiě)器與卡中的密碼及加密/解密算法一致,將會(huì)有RB=RB',校驗(yàn)正確,否則將無(wú)法通過(guò)校驗(yàn)。 (D) 環(huán):如果(C)環(huán)校驗(yàn)是正確的,則MIFARE 1卡片用卡中存放的密碼對(duì)RA加密后發(fā)送令牌TOKEN BA給讀寫(xiě)器。 (E) 環(huán):讀寫(xiě)器收到令牌TOKEN BA后,用讀寫(xiě)器中存放的密碼對(duì)令牌TOKEN BA中的RA(隨機(jī)數(shù))進(jìn)行解密得到RA';并校驗(yàn)第一次由(B)環(huán)中讀寫(xiě)器發(fā)出去的隨機(jī)數(shù)RA是否與(D)環(huán)中接收到的TOKEN BA中的RA' 相一致;同樣,若讀寫(xiě)器與卡中的密碼及加密/解密算法一致,將會(huì)有RA=RA',校驗(yàn)正確,否則將無(wú)法通過(guò)校驗(yàn)。 如果上述的每一個(gè)環(huán)都為“真”,且都能正確通過(guò)驗(yàn)證,則整個(gè)的認(rèn)證過(guò)程將成功。讀寫(xiě)器將允許對(duì)剛剛認(rèn)證通過(guò)的卡片上的這個(gè)扇區(qū)進(jìn)入下一步的操作(讀/寫(xiě)等操作)。 (5) 寫(xiě)數(shù)據(jù) file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps8951.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps8952.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps8962.tmp.jpg 向FIFO中寫(xiě)入PICC_WRITE+塊地址,通過(guò)PCD_TRANSCEIVE命令將FIFO中數(shù)據(jù)通過(guò)天線發(fā)送出去。 要注意寫(xiě)塊3數(shù)據(jù),因?yàn)閴K3包含了所在扇區(qū)在密鑰及訪問(wèn)條件,如果操作不當(dāng),將導(dǎo)致扇區(qū)無(wú)法正常使用。 (6) 讀數(shù)據(jù) file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps8963.tmp.jpg file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps8964.tmp.jpg 向FIFO中寫(xiě)入PICC_READ+塊地址,通過(guò)PCD_TRANSCEIVE命令將FIFO中數(shù)據(jù)通過(guò)天線發(fā)送出去。
|