基于MCS-51的Mifare智能IC卡讀卡器軟件設計
文章出處:http://psychicreadingswithdeb.com 作者:林芊 ,朱延釗 人氣: 發(fā)表時(shí)間:2011年10月07日
0 引言
非接觸式Ic卡根據電磁感應原理,讀寫(xiě)操作只需將卡片放在讀寫(xiě)器附近一定的距離之內就能實(shí)現數據交換,無(wú)需任何接觸,使用非常方便、快捷,不易損壞。因此,在電子錢(qián)包、公路收費、公共汽車(chē)自動(dòng)售票、門(mén)禁系統等方面有著(zhù)廣泛的應用前景。目前,Philips公司的Mifare卡是該領(lǐng)域的主流產(chǎn)品,其較為成熟的型號為Mifarel IC$70(簡(jiǎn)稱(chēng)MF1 IC$70),遵從ISO/IEC14443A標準,支持一卡多用,具有極高的可靠性和保密性。
為配合Mifare卡工作,必須有相應的讀卡芯片,其中MF RC500就是典型的代表作。目前,由讀卡芯片制成的讀卡模塊以及外圍硬件電路已經(jīng)相當成熟,而對軟件的開(kāi)發(fā)卻相對滯后。本文正是以此為出發(fā)點(diǎn),在典型的硬件電路上進(jìn)行讀卡器的軟件設計,力求提高軟件的通用性和保證數據的穩定性。
1 MF1 ICS70卡的主要性能特點(diǎn)
a)工作頻率13.56 MHz,傳輸速率106 kbit/s,讀寫(xiě)距離最大1 00mm(取決于天線(xiàn)),工作溫度范圍一20℃ 一+50℃ ,具有防沖突機制,支持多卡操作。b)4 kB的EEPROM分為40個(gè)扇區:前2 kB分32個(gè)扇區,每個(gè)扇區分4塊;后2 kB分8個(gè)扇區,每個(gè)扇區分16塊(如表1所示)。IC卡以塊(Block)為存儲單位,每塊16 B,共256個(gè)塊,從扇區0的第0塊到扇區39的第15塊依次編號為塊0~255。
c)所有扇區各自獨立,每個(gè)扇區最后一塊為該扇區的控制塊,含有存取控制字節和兩組6B的密碼(Key A和Key B);其他塊為數據塊。扇區0的塊0用于存儲該Ic卡的序列號(32位)和廠(chǎng)商信息,這部分內容在Ic卡出廠(chǎng)時(shí)已被固化,因此這塊是寫(xiě)保護的。
表1 MF1 IC$70的存儲結構
2 SPI接口通信
2.1 硬件描述
本電路采用性?xún)r(jià)比很高的ZLGS00A串行讀卡模塊來(lái)配合MF1 IC$70工作,其中集成了MF RC500讀卡芯片。采用三線(xiàn)SPI接口,半雙工通信方式,能夠與MCU直接連接。軟件設計的核心是針對SCLK、SDA—TA和ss這3個(gè)引腳。引腳說(shuō)明及接口規范如表2所示。
表2 ZLG5OOA讀卡模塊SPI接口引腳說(shuō)明
接口空閑時(shí)主機SS=1,SCLK=0,SDATA=0,從機SS=1,SCLK=1,SDATA:0。其中,SCLK為單向時(shí)鐘線(xiàn),時(shí)鐘信號必須由MCU產(chǎn)生,由讀卡模塊接收,ss為雙向數據發(fā)送使能端,SDATA為雙向數據傳輸線(xiàn),都由數據發(fā)送端控制,數據接收端必須釋放該線(xiàn)。
2.2 SPI信號波形
SPI信號必須嚴格遵守時(shí)序規范,否則將出現通信錯誤。無(wú)論數據傳輸的方向如何,SPI線(xiàn)上信號的波形總是如圖1所示。
由圖中可以看出,在ss為低電平時(shí),時(shí)鐘和數據線(xiàn)上的信號才有效,且在SCLK為低時(shí)SDATA變化,SCLK為高時(shí)SDATA應保持穩定。
MCU必須根據數據傳輸的方向嚴格控制以下幾個(gè)時(shí)間,以確保數據傳輸無(wú)誤。
a)t1:數據接收器響應至MCU產(chǎn)生第1個(gè)SCLK上升沿的時(shí)間;
b)t2:兩個(gè)字節傳輸之間,SCLK低電平的持續時(shí)間;
c)t3:傳輸最后一個(gè)字節最后一位的SCLK信號的升沿至ss上升沿的時(shí)間;
d)tH:SCLK信號的高電平持續時(shí)間;
e)tL:SCLK信號的低電平持續時(shí)間。
2.3 SPI底層程序設計
2.3.1 寫(xiě)數據
MCU一讀卡模塊。除響應信號外,3根線(xiàn)上的信號全由MCU產(chǎn)生。如表3所示。
表3 MCU向讀卡模塊寫(xiě)數據動(dòng)作流程
2.3.2 讀數據
讀卡模塊-MCU。響應信號和SCLK信號由MCU產(chǎn)生,ss信號和SDATA信號由讀卡模塊產(chǎn)生。如表4所示。
表4 MCU從讀卡模塊讀數據動(dòng)作流程
3 存儲模式
由于實(shí)際應用中讀卡環(huán)境的隨意性,對卡的操作可能會(huì )造成數據丟失,例如在數據寫(xiě)入的過(guò)程中Ic卡離開(kāi)感應區等。因此,必須采取必要的措施來(lái)防止數據的丟失以及對丟失的數據進(jìn)行恢復。為確保數據的穩定性,筆者對存儲模式和存取操作兩方面進(jìn)行設計,在此先論述存儲模式的設計,而對于存取操作的設計將在第4節闡述。
3.1 存儲模式設計
為防止數據的丟失以及為已丟失的數據提供恢復的藍本,在數據的存儲模式上采用兩層冗余存儲模式。第1層是塊內冗余存儲。寫(xiě)入數據時(shí)按表5列出的格式,對塊值和塊地址進(jìn)行冗余備份。數據(0—3號字節的Value或12號字節的Adr)讀出后,將其與備份值相對比,無(wú)誤后方可確認為真值;若有誤,則視為該塊數據出現“部分丟失”現象,須進(jìn)行恢復。
表5 塊內冗余存儲模式
第2層是塊間冗余存儲。如表1所示,將4 kB的存儲空間分配給72個(gè)邏輯地址(LgeAdr),編號0—71,每個(gè)邏輯地址指向同一扇區內的3個(gè)數據塊(起始地址是扇區內的塊0)。為防止對控制塊的誤操作,每個(gè)扇區的控制塊不映射到邏輯地址中。如表6所示,邏輯地址中的第1個(gè)塊是數據區,用于正常存儲數據;第2個(gè)塊是備份區,用于備份數據區的內容,當數據區的內容發(fā)生“完全丟失”現象時(shí),可以此作為恢復的藍本(具體操作在4.2節討論);第3塊為預留區,可在實(shí)際應用中記錄其他信息。
表6 邏輯地址的單元映射
3.2 地址變換函數
對Ic卡存儲空間的實(shí)際物理操作,僅僅通過(guò)邏輯地址是不可行的,所以必須進(jìn)行地址變換,將邏輯地址變?yōu)橄鄳纳葏^號(sector)和塊號(block,指向低位塊)。具體函數如下:
uehar AdrTrans(uehar—LgeAdr,uehar 一sector,uehar 一block)
{if(-LgcAdr>’=72)return DATA_E111; //超出邏輯塊地址范圍,返回錯誤
else if(_LgcAdr<32) 一sector=一LgcAdr; //0—31號扇區
else -sector=(-LgeAdr一32)/5+32; //32—39扇區
block = _ LgcAdr 3 + 一sector; //轉換物理塊號
return DATA-OK;}
4 存取操作
對MF1 ICS70有讀、寫(xiě)、加值、減值、存儲、傳輸共6種基本操作,它們在讀卡模塊自帶的函數庫中都有相應的實(shí)現函數。但是,這些函數并未考慮到數據穩定性的問(wèn)題,所以?xún)H僅調用它們是不夠的,必須在存儲的過(guò)程中加入保證數據穩定性的算法。讀和寫(xiě)是上述6種基本操作中最基本的兩種操作,其他操作均可間接地通過(guò)它們來(lái)實(shí)現。下面在存儲模式的基礎上對存儲操作進(jìn)行設計。
4.1 寫(xiě)操作
數據的丟失往往發(fā)生在寫(xiě)操作的過(guò)程中,寫(xiě)入的不成功會(huì )導致數據丟失。根據存儲模式的設計,每一個(gè)邏輯地址可存放一個(gè)4字節的數據和1字節的地址,所以定義該數據為長(cháng)整型(1ong),在讀、寫(xiě)操作時(shí)須用單字節指針來(lái)對其進(jìn)行轉存。具體操作是:先將long型操作數轉存人buf[0...3]位,將邏輯地址Lg-cAdr存人buf[12]位;再依據塊內冗余存儲模式對數據進(jìn)行備份;最后將數據進(jìn)行兩次發(fā)送,先發(fā)送到塊間冗余存儲模式的備份區,再發(fā)送到數據區,只要有一次發(fā)送成功則視為整個(gè)發(fā)送過(guò)程成功。程序如下:
uehar DamWrite(1ong 一Value,uehar—LgeAdr,uchar—block,
uchar idam _ bur)
{uehar temp=(uehar )_Value; //轉存指針
uehar writecheck:DATA— ERR; //寫(xiě)入狀態(tài)標記,用于返回值
— buf[0]= (temp+3);-buf[1]= (temp+2);-buf[2]
= (temp+1);-buf[3]: temp; //數據轉存到緩沖區
_ buf[4]: 一buf[0];bull5]: 一—buf[1];—buf[6]= 一一
buf[2];_buf[7]=一_buf[3]; //值備份
_ buf[8]=一bur[0];一buf[9]=一buf[1];一buf[10]= 一buf
[2];_buf[11]=-buf[3];
_ buf[12]=一LgeAdr;_bull13]: 一一LgcAdr;_bull14]=一Lg·
cAdr;buf[15]=一一LgcAdr; //轉存地址,并備份
writecheck= writeeheck& mils_
write(一block+1,一bur); //
將數據寫(xiě)入備份塊
writecheck= writecheck& mils— write(一block,一bur); //將
數據寫(xiě)入數據塊
retum writecheck; //返回最終發(fā)送狀態(tài)}
4.2 讀操作
讀操作是不會(huì )引起數據丟失的,但在讀出數據后有必要對所讀出的內容進(jìn)行校驗,確認其完整性后方可認定為真值,否則須予以修正。依據兩層冗余存儲模式,修正亦分為兩種:部分丟失恢復和完全丟失恢復。部分丟失恢復利用塊內冗余備份,真值的依據是:相同的數據為真值,即應有2份Value相同以及3份Adr相同,對出錯的那一份數據進(jìn)行修正。由于寫(xiě)操作中進(jìn)行了兩次發(fā)送,卡內數據是安全的,當數據區內容“完全丟失”時(shí),從備份區讀出數據來(lái)恢復數據區的內容。
具體的讀操作是:先從卡中讀出數據區內容,進(jìn)行塊內數據正確性檢查及糾錯;然后判斷數據是否“完全丟失”,若否,則可確認為真值,若是,則從備份區讀出數據;最后根據存儲模式的格式對讀出內容進(jìn)行轉換。程序如下:
uchar DataRead(1ong -Value,uchar$~LgcAdr,uchar—block,
uchar idata $一buf)
{uchar$temp=(uchar$)-Value;//轉存指引‘
if(mifs_read(一block,一buf)!=0)return DATA~ERR; //讀卡
DataCheck(一buf); //數據正確性檢查及糾錯
//若數據為全0,視為數據丟失;此時(shí)從備份塊中濱取數據
if(-buf[0]==0&&-buf[1]==0&&-buf[2]==0&&-
buf[3]==0) mifs—read(_block+1,buf);
(temp+3)=_bufEo];$(temp+2)=—buf[1];$(temp+1 1)
= -bull2];$temp=一buf[3];//值轉換
LgcAdr=~ buf[12];//讀出邏輯地址
return DATA— OK;}
5 主程序流程
6 結束語(yǔ)
本文在Mifare智能Ic卡應用的典型電路上進(jìn)行軟件設計,程序的讀寫(xiě)效率和數據穩定性都達到很高的要求。算法及程序的通用性好,可移植到不同的電路系統中,根據實(shí)際應用稍加修改即可滿(mǎn)足要求。本文主要從通用的角度進(jìn)行設計,在實(shí)際具體應用中應根據需要添加必要的輔助程序,如存儲器擴展、LCD顯示、語(yǔ)音提示等。非接觸式Ic卡讀卡系統具備迅速、方便、安全、可靠、穩定等優(yōu)點(diǎn),目前正逐步取代傳統磁卡和接觸式IC卡,具有巨大的市場(chǎng)競爭力和廣闊的發(fā)展前景。
(作者單位:華南理工大學(xué)物理科學(xué)與技術(shù)學(xué)院,華南理工大學(xué)計算中心)