介紹了Philips公司的Mifare 1非接觸IC卡讀寫(xiě)器芯片MCM200的主要特性、引腳功能、內部的物理功能寄存器和基本指令集。重點(diǎn)介紹了Mifare 1非接觸IC卡和MCM200數據通信的一些重要模塊的編程思路和編程方法,給出了兩個(gè)編程實(shí)例。 Mifare 1 IC智能(射頻)卡的核心是Philips 公司的Mifare 1 IC S50(-01,-02,-03,-04)系列微模塊(微晶片)。其相應的讀寫(xiě)器模塊為Philips公司的MCM200和MCM500。其中,MCM200模塊主要應用于操作距離在 25mm的卡片讀寫(xiě)器中;MCM500模塊主要應用于操作距離在100mm的卡片讀寫(xiě)器中。1 MCM200模塊的主要特性 MCM200讀寫(xiě)器模塊的主要特性如下: ●采用標準的雙列直插式32引腳封裝; ●工作頻率為13.56MHz,采用標準的+5V電源供電,典型電流消耗為40mA; ●讀寫(xiě)卡片距離可達25mm以上; ●與卡片的通信速率可達106kbps; ●每個(gè)扇區均包含有3套密碼,同時(shí)包含有認證密碼用的存儲器; ●有防卡片重疊功能; ●帶有16字節的FIFO(先進(jìn)先出)隊列接收/發(fā)送緩沖寄存器; ●在模塊與卡片通信時(shí)可自動(dòng)偵查錯誤,對數據流可自動(dòng)分析; ●可對RF(射頻)通道進(jìn)行自動(dòng)監控; ●有內建8位/16位CRC協(xié)處理器,可提供CRC、 ![]() ●支持多種方式的活動(dòng)天線(xiàn),并且不需天線(xiàn)調節系統即可對天線(xiàn)進(jìn)行補償調節; ●帶有標準的Mifare 并行接口?可直接由標準的MCU接口信號控制。 2 MCM200模塊的引腳說(shuō)明 MCM200的引腳排列如圖1所示。各引腳的功能如下: D0~D7:8位雙向數據總線(xiàn); A0~A3:4位地址線(xiàn); BP:后備電池輸入端,用于保護MCM內部密碼RAM; NPAUSE1:串行數據輸出,用于驅動(dòng)RF單元,該引腳必須連到RF單元的TP端。 NWR:寫(xiě)信號使能端; NRD:讀信號使能端; NCS:該腳為低電平時(shí)選中MCM; KOMP1:RF的比較器輸入端,使用時(shí)必須連到RF單元的RX端; NIRQ:MCU數據處理控制端。當該端為低時(shí),MCU將用MCM狀態(tài)寄存器中的內容來(lái)對MCM中的數據進(jìn)行處理; ALE:地址鎖存使能端; USEALE:選擇從內部地址鎖存器或A0~A3引腳取地址; DGND:數字電路接地端; DVDD:+5V電源端。 MODE:并行協(xié)議模式選擇引腳,可用高電平驅動(dòng)。 AVDD:+5V模擬電源輸入引腳,用于RF射頻單元; AGND:RF射頻單元(模擬電路)接地端; NANT、ANT:天線(xiàn)連接端。 3 MCM200內部特殊功能寄存器 MCM200器件內部共有16個(gè)特殊功能寄存器,表1所列是這16種特殊功能寄存器的地址和讀寫(xiě)情況。實(shí)際上,MCU主要通過(guò)對MCM寄存器的讀寫(xiě)來(lái)控制MCM的工作。MCM是MCU與非接觸式IC卡之間進(jìn)行信息交換的接口,系統對卡片上的數據進(jìn)行任何讀寫(xiě)均須通過(guò)MCM 來(lái)傳遞。 表1 MCU200中的物理功能寄存器 寄存器名 地 址 讀(READ) 寫(xiě)(WRITE) DATA 00H READ-BYTE WRITE-BYTE STACON 01H DV TE PE CE BE AE - - - - SOR RFS - - - - 1 1 NRF AC ENABLE 02H N/A 1 PR CE CR - - - - - - - - BCNTS 03H N/A BIT-COUNT-SEND BCNTR 04H N/A BIT-COUNT-RECEIVE BAUDRATE 05H N/A - - - - - - - - 1 1 1 BR TOC 06H N/A TIMEOUT-COUNTER MODE 07H N/A 1 1 0 0 0 P2 P1 P0 P0 CRCDATA 08H CRC-BYTE-READ CRC-BYTE-WRITE CRCSTACON 09H CV - - - - - - - - - - - - CZ C8 - - - - - - - - - - - - CR KEYDATA 0AH N/A KEY-BYTE-WRITE KEYSTACON 0BH - - - - - - - - - - - - - - - - AL 0 - - - - - - - - KS1 KS0 KEYADDR 0CH N/A AL AB A5 A4 A3 A2 A1 A0 0DH RCODE 0EH N/A - - - - - - - - 0 0 RC1 RC0 表2 MCM2000的基本指令集 指 令 指令代碼(hex) 相關(guān)的出錯標志 接收卡片上數據 Answer to Request(Request的應答) TE,BE Tagtype Request std 26 Request all 52 AntiCollision(防重疊) 93 TE,BE Serial Number Select Tag(選卡片) 93 TE,BE,PE,CE Size Authentication(認證) TE,BE,PE,CE / Auth-1a 60 Auth-1b 61 Load KEY(存取密碼) / AE Read(讀) 30 TE,BE,PE,CE Data Write(寫(xiě)) A0 TE,BE / Increment(增值) C1 TE,BE / Decrement(減值) C0 TE,BE / Restore(重儲) C2 TE,BE / Transfer(傳送) B0 TE,BE / Halt(停機) 50 TE,BE / 4 MCM200的指令和軟件設計 MCU通過(guò)特殊指令來(lái)啟動(dòng)MCM200并運行,同時(shí)將這些指令傳輸到Mifare 1卡片上。MCM200的基本指令集如表2所列。Mifare 1 IC卡與MCM200之間的通信使用握手式半雙工通信協(xié)議,卡片帶有高速CRC協(xié)處理器,符合CCITT標準。卡片的ROM中固化了其運行所需的必要程序指令,它能使卡片有條不紊地與卡片讀寫(xiě)器進(jìn)行數據通信。但MCU對MCM200的指令操作通常不是簡(jiǎn)單的一條指令,而是用一個(gè)程序序列來(lái)完成,其中包括對MCM200硬件內核寄存器的設置。MCM對IC卡的操作流程如圖2所示。現將其中各主要子程序模塊的編程方法作以說(shuō)明。 4.1 Request操作子程序 Request 指令用于通知MCM200在天線(xiàn)有效的工作距離內尋找Mifare 1卡片。如果 Mifare 1卡片存在,就和Mifare 1通信,并讀取卡片類(lèi)型號TAGTYPE(2個(gè)字節),然后由MCU根據TAGTYPE區別不同類(lèi)型的卡片。Request 指令分為Request std指令和Re-quest all指令。Request std指令是連續性的讀卡指令。Request all指令是非連續性的讀卡指令,只讀一次。Request all指令在成功地讀取一張卡片之后,會(huì )一直等待使用者拿走這一張卡片,直到有新一張卡片進(jìn)入MCM的天線(xiàn)有效工作范圍之內。Request操作的匯編語(yǔ)言程序如下: Request: MOV A,#0CH ?;設置MCM中的STACON 寄存器為0CH MOV R0,#01H MOVX @R0,A MOV A,#0EH ?;設置MCM中的BAU-DRATE寄存器為0EH MOV R0,#05H MOVX @R0,A MOV A,#0C0H ;設置MCM中的ENABLE寄存器為0C0H MOV R0,#02H MOVX @R0,A MOV A,#0C6H ?;設置MCM中的MODE寄存器為0C6H MOV R0?#07H MOVX @R0?A MOV A?#02H ;設置MCM中的RCODE 寄存器為02H MOV R0?#0EH MOVX @R0?A MOV A?#07H ;設置MCM中的BCNT S 寄存器為07H MOV R0?#03H MOVX @R0?A MOV A?#10H ;設置MCM中的BCNTR 寄存器為?10H MOV R0?#04H MOVX @R0?A JB F0, RSTD ;根據F0標志判斷是執 行Request std操作還是 Request all操作 REQALL? MOV A?#52H ;Request all指令代碼→A AJMP RQTMCM RSTD: MOV A?#26H ;Request std 指令代碼→A RQTMCM?MOV R0?#00H MOVX @R0?A ;Request all指令或Request std 指令寫(xiě)入DATA MOV A? #0AH ?TOC = 0AH MOV R0?#06H MOVX @R0?A MOV R0?#01H ;讀STACON狀態(tài) MOVX A?@R0 JNB ACC.7?RD STACON ? TAGTYPE沒(méi) 有到FIFO(DV=0)?重新讀STACON狀態(tài) MOV R7,A ? stacon值暫存在R7中 MOV A, #00H ?TOC=00H MOV R0,#06H MOVX @R0,A MOV A,R7 ;取暫存在R7中stacon值到A JB ACC.6?TE_ERR ?; 定時(shí)計數器溢出錯轉TE_ERR JB ACC.3,BE_ERR ?; 位計數器錯轉BE_ERR MOV R0,#00H ;讀卡片的卡片類(lèi)型號TAGTYPE 0存入45H單元 MOVX A,@R0 MOV 45H?A MOV R0,#00H MOVX A,@R0 ;讀卡片上的卡片類(lèi)型號TAGTYPE1存入46H單元 MOV 46H,A RET ?; RET TE_ERR: ?;“TE” 錯誤處理 RET BE_ERR: ?; “BE”錯誤處理 RET 4.2 “AntiCollision”?防卡片重疊 操作子程序 如果有多張Mifare 1卡片處在卡片讀寫(xiě)器的天線(xiàn)工作范圍之內,AntiCollision指令將啟動(dòng)AntiColli-sion模塊的防重疊功能,同時(shí)MCM200將有序地讀所有處在其天線(xiàn)有效工作距離內的Mifare 1卡片的40bit長(cháng)的序列號SN。MCU接收到這5個(gè)字節的SN后,會(huì )進(jìn)行校驗。其校驗、計算卡片序列號的方法是:采用相鄰兩個(gè)字節相互異或得出的結果與下一個(gè)字節再異或,前四個(gè)字節異或的結果與第5個(gè)字節應該相同,否則認為MCU讀到的卡片的序列號有錯,因此卡片的序列號的前四個(gè)字節是有意義的,第5個(gè)字節僅僅用于校驗之用。這五個(gè)字節被存儲在IC卡片的第0扇區的第0塊中,它由卡片的生產(chǎn)商制定并固化,不得更改,所以在市面上流通的Mifare 1 S50系列的非接觸式IC射頻卡中,每一張卡片的序列號都是唯一的。“AntiCollision”?防卡片重疊 操作子程序清單如下: anti? NOP MOV A? #10H ?BCNTS = 10H,控制 MCU向DATA寄存器 發(fā)送 2個(gè)字節數據 MOV R0?#03H MOVX @R0?A MOV A? #0CH ;設置MCM中的 STACON寄存器 SETB ACC.0 ?AC =“1”,啟動(dòng)防重 疊狀態(tài)機 MOV R0?#01H MOVX @R0?A ACALL D1000US ?DELAY 1000US MOV A? #93H ;AntiCollision?防卡片 重疊 指令碼寫(xiě)入DATA MOV R0?#00H MOVX @R0?A MOV A? #20H MOV R0?#00H MOVX @R0?A MOV A? #28H MOV R0?#04H MOVX @R0?A ?BCNTR = 28H ,接 收5個(gè)字節的數據 MOV A? #0AH MOV R0?#06H MOVX @R0?A ?TOC = 0AH MOV R0?#01H AGAIN: MOVX A?@R0 ? 讀STACON狀態(tài) JNB ACC.7? AGAIN ?如果 DV=“0”重 讀STACON MOV R7,A MOV A? #00H MOV R0?#06H MOVX @R0?A ?TOC = 00H MOV A,R7 JB ACC.6? TE ERR ? 定時(shí)計數器溢出 錯轉TE ERR JB ACC.3? BE ERR ?位計數器錯轉 BE ERR MOV R7?#04H ?讀4個(gè)字節的SN值 存入40H~43H單元, 前四個(gè)字節進(jìn)行異或 MOV B?#00H MOV R1?#40H MOV R0?#00H LOOP? MOVX A?@R0 MOV @R1?A ?存SN的前四個(gè)字節在 單片機內部RAM的 40H?41H?42H?43H單元 XRL B?A ?相鄰字節相互異或 INC R1 DJNZ R7? LOOP MOVX A?@R0 ?前四個(gè)字節異或的結 果和接收的第5個(gè)字 節進(jìn)行比較,若不等則 XRL A?B 轉錯誤處理 JNZ ANTIERR RET TE ERR? RET BE ERR? RET ANTIERR: RET 4.3 “Select”?選卡片 操作子程序 該程序用于MCM200與卡片的真正聯(lián)絡(luò )。選擇一張卡片通常由MCU向MCM200發(fā)送“SELECT”命令來(lái)完成。MCU發(fā)送“SELECT”命令后,會(huì )同時(shí)在“AntiCollision” 操作中得到Mifare 1卡片的40bit長(cháng)的序列號的前四個(gè)字節以及前四個(gè)字節的異或結果,同時(shí)再重新發(fā)送給Mifare 1卡,只有本身的序列號和接收的序列號相同的卡片才被真正地選中。Select指令成功執行后,MCU將得到MCM DATA寄存器傳來(lái)的一個(gè)字節長(cháng)的卡片容量信息(SIZE字節)。SIZE字節被存儲在Mifare 1卡片上的第00H扇區中的第00h 塊中。 4.4 “Authentication”認證操作子程序 Mifare 1卡的每個(gè)扇區的塊3包含該扇區的密碼A?6個(gè)字節 、存取控制?4個(gè)字節 、密碼B?6個(gè)字節 ,它是一個(gè)特殊的塊。在確認了上述三個(gè)步驟后,就表示已經(jīng)選擇了一張卡片,在對卡片進(jìn)行讀寫(xiě)操作之前,還必須對卡片上已經(jīng)設置的密碼進(jìn)行認證,如果匹配,則允許進(jìn)一步的Read/Write操作。也可以通過(guò)選擇存儲在MCM的RAM密碼集中的一組密碼來(lái)進(jìn)行認證操作。MCM能夠存儲3個(gè)密碼集KEYSET0、KEYSET1和KEYSET2。每一個(gè)KEYSET又包含了KEYA及KEYB 等。在"Authentication"指令發(fā)出之前,必須設置密碼控制寄存器KEYSTACON,使AL=1,然后設置KS0和KS1以指定一套密碼集。同時(shí),還必須設置密碼地址寄存器KEYADDR,當AB為“1”時(shí),選擇KEYA,AB為“0”時(shí)選擇KEYB,A5~A0用于選擇MCM-RAM中存放密碼的扇區地址(0~63), KEYADDR寄存器中的“AB”設置必須匹配"Authentication"命令,因為在"Authentication"命令中,60h代碼用于認證KEYA;61h代碼用于認證KEYB。正確地設置KEYSTACON 和KEYADDR寄存器之后,通過(guò)寫(xiě)"Authentication" 認證命令代碼和寫(xiě)“地址”(Mifare 卡要認證的扇區地址是0~15)到DATA寄存器?認證密碼操作的模塊便開(kāi)始啟動(dòng)執行。如果三遍認證的每一個(gè)環(huán)都為“真”,且都能正確通過(guò)驗證,則整個(gè)認證成功。這時(shí)讀寫(xiě)器即可對剛剛認證通過(guò)的卡片上的這個(gè)扇區進(jìn)行下一步READ/WRITE 等操作。 4.5 “Read"或“Write"操作子程序 Read指令允許MCU通過(guò)MCM來(lái)讀取Mifare 1卡片上完整的16個(gè)Bytes的數據塊。Read指令操作只能一個(gè)塊(Block)一個(gè)塊地讀,即一次只能讀取16個(gè)字節。如果只要求讀取某Block中的幾個(gè)字節的數據,也只能一個(gè)整塊16個(gè)字節一起讀取,再由程序員選取指定的字節。從卡片上讀到的數據必須由MCU進(jìn)行校驗,以確保數據的有效。 “Write” 寫(xiě)指令允許用戶(hù)寫(xiě)數據到MIFARE卡片上(完整的16 個(gè)BYTEs的數據塊)。只有在“Authentication” 認證指令完成后,才允許對數據扇區或數據塊進(jìn)行“Write”寫(xiě)指令操作。寫(xiě)入的數據塊的數據結構如下: 15 14 13 12 11 10 9 8 address address address address V A L UE 7 6 5 4 3 2 1 0 V A L UE V A L UE 通過(guò)一個(gè)寫(xiě)操作可將存儲的數據在每一個(gè)block塊中寫(xiě)3次并反寫(xiě)1次,從而完成數據塊的初始化。塊的地址必須寫(xiě)4次,其中2次為反向寫(xiě)入。正/負數據值將以標準的二進(jìn)制補碼格式來(lái)表示。 4.6 “Increment”或 “Decrement”增值或減值子程序 通過(guò)Mifare 1內部電路能夠執行“Increment” &“Decrement”增值/減值操作,在根據KEY A 和KEY B 進(jìn)行“Increment”&“Decrement”增值/減值操作時(shí); “Increment”增值表示將指定的值加到卡片的存儲器中;“Decrement”減值則表示從卡片的存儲器中減去指定的值。每一個(gè)“Increment”& “Decrement”增值/減值操作都必須跟隨一條“Transfer” 傳送指令,這樣才能真正地將數據結果傳送到卡片上。如果沒(méi)有傳送指令,數據結果仍將保持在數據緩沖寄存器中。 |