歡迎您訪問鄭州興邦電子股份有限公司官方網(wǎng)站!
阿里巴巴誠信通企業(yè)
全國咨詢熱線:40000-63966
興邦電子,中國水控機(jī)第一品牌

聯(lián)系興邦電子

全國咨詢熱線:40000-63966

售后:0371-55132951/55132952

工廠:河南省 鄭州市 高新區(qū)蓮花街電子電器產(chǎn)業(yè)園

基于MCS-51的Mifare智能IC卡讀卡器軟件設(shè)計(jì)

文章出處:http://m.compasssalessolutions.com 作者:林芊 ,朱延釗   人氣: 發(fā)表時(shí)間:2011年10月07日

[文章內(nèi)容簡介]:Philips公司的Mifare技術(shù)是當(dāng)今非接觸式IC智能射頻卡的主流技術(shù)。Mifare智能IC卡具有高度安全、高可靠性及分區(qū)的存儲結(jié)構(gòu)特點(diǎn),支持一卡多用,結(jié)合以單片機(jī)和讀卡模塊為核心的系統(tǒng),可應(yīng)用于廣泛領(lǐng)域。本文主要著眼于讀卡器軟件系統(tǒng)的開發(fā),介紹了智能Ic卡及其讀卡器的工作原理,詳細(xì)分析單片機(jī)使用SPI方式與Ic卡通訊的原理與時(shí)序算法,詳細(xì)分析針對數(shù)據(jù)穩(wěn)定性的數(shù)據(jù)存儲模式和讀寫算法,并給出主體程序流程及代碼。本軟件系統(tǒng)主要從通用性的角度進(jìn)行設(shè)計(jì),實(shí)現(xiàn)基本的、穩(wěn)定性高的讀寫功能,在此基礎(chǔ)上針對具體應(yīng)用添加若干輔助程序,即可滿足多種應(yīng)用需求,具有很好的可移植性。

    0 引言

    非接觸式Ic卡根據(jù)電磁感應(yīng)原理,讀寫操作只需將卡片放在讀寫器附近一定的距離之內(nèi)就能實(shí)現(xiàn)數(shù)據(jù)交換,無需任何接觸,使用非常方便、快捷,不易損壞。因此,在電子錢包、公路收費(fèi)、公共汽車自動售票、門禁系統(tǒng)等方面有著廣泛的應(yīng)用前景。目前,Philips公司的Mifare卡是該領(lǐng)域的主流產(chǎn)品,其較為成熟的型號為Mifarel IC$70(簡稱MF1 IC$70),遵從ISO/IEC14443A標(biāo)準(zhǔn),支持一卡多用,具有極高的可靠性和保密性。

    為配合Mifare卡工作,必須有相應(yīng)的讀卡芯片,其中MF RC500就是典型的代表作。目前,由讀卡芯片制成的讀卡模塊以及外圍硬件電路已經(jīng)相當(dāng)成熟,而對軟件的開發(fā)卻相對滯后。本文正是以此為出發(fā)點(diǎn),在典型的硬件電路上進(jìn)行讀卡器的軟件設(shè)計(jì),力求提高軟件的通用性和保證數(shù)據(jù)的穩(wěn)定性。

    1 MF1 ICS70卡的主要性能特點(diǎn)

    a)工作頻率13.56 MHz,傳輸速率106 kbit/s,讀寫距離最大1 00mm(取決于天線),工作溫度范圍一20℃ 一+50℃ ,具有防沖突機(jī)制,支持多卡操作。b)4 kB的EEPROM分為40個(gè)扇區(qū):前2 kB分32個(gè)扇區(qū),每個(gè)扇區(qū)分4塊;后2 kB分8個(gè)扇區(qū),每個(gè)扇區(qū)分16塊(如表1所示)。IC卡以塊(Block)為存儲單位,每塊16 B,共256個(gè)塊,從扇區(qū)0的第0塊到扇區(qū)39的第15塊依次編號為塊0~255。

    c)所有扇區(qū)各自獨(dú)立,每個(gè)扇區(qū)最后一塊為該扇區(qū)的控制塊,含有存取控制字節(jié)和兩組6B的密碼(Key A和Key B);其他塊為數(shù)據(jù)塊。扇區(qū)0的塊0用于存儲該Ic卡的序列號(32位)和廠商信息,這部分內(nèi)容在Ic卡出廠時(shí)已被固化,因此這塊是寫保護(hù)的。

    表1 MF1 IC$70的存儲結(jié)構(gòu) 

    2 SPI接口通信

    2.1 硬件描述

    本電路采用性價(jià)比很高的ZLGS00A串行讀卡模塊來配合MF1 IC$70工作,其中集成了MF RC500讀卡芯片。采用三線SPI接口,半雙工通信方式,能夠與MCU直接連接。軟件設(shè)計(jì)的核心是針對SCLK、SDA—TA和ss這3個(gè)引腳。引腳說明及接口規(guī)范如表2所示。

    表2 ZLG5OOA讀卡模塊SPI接口引腳說明 

    接口空閑時(shí)主機(jī)SS=1,SCLK=0,SDATA=0,從機(jī)SS=1,SCLK=1,SDATA:0。其中,SCLK為單向時(shí)鐘線,時(shí)鐘信號必須由MCU產(chǎn)生,由讀卡模塊接收,ss為雙向數(shù)據(jù)發(fā)送使能端,SDATA為雙向數(shù)據(jù)傳輸線,都由數(shù)據(jù)發(fā)送端控制,數(shù)據(jù)接收端必須釋放該線。

    2.2 SPI信號波形

    SPI信號必須嚴(yán)格遵守時(shí)序規(guī)范,否則將出現(xiàn)通信錯(cuò)誤。無論數(shù)據(jù)傳輸?shù)姆较蛉绾?,SPI線上信號的波形總是如圖1所示。

    由圖中可以看出,在ss為低電平時(shí),時(shí)鐘和數(shù)據(jù)線上的信號才有效,且在SCLK為低時(shí)SDATA變化,SCLK為高時(shí)SDATA應(yīng)保持穩(wěn)定。 

    MCU必須根據(jù)數(shù)據(jù)傳輸?shù)姆较驀?yán)格控制以下幾個(gè)時(shí)間,以確保數(shù)據(jù)傳輸無誤。

    a)t1:數(shù)據(jù)接收器響應(yīng)至MCU產(chǎn)生第1個(gè)SCLK上升沿的時(shí)間;
    b)t2:兩個(gè)字節(jié)傳輸之間,SCLK低電平的持續(xù)時(shí)間;
    c)t3:傳輸最后一個(gè)字節(jié)最后一位的SCLK信號的升沿至ss上升沿的時(shí)間;
    d)tH:SCLK信號的高電平持續(xù)時(shí)間;
    e)tL:SCLK信號的低電平持續(xù)時(shí)間。

    2.3 SPI底層程序設(shè)計(jì)

    2.3.1 寫數(shù)據(jù) 

    MCU一讀卡模塊。除響應(yīng)信號外,3根線上的信號全由MCU產(chǎn)生。如表3所示。

    表3 MCU向讀卡模塊寫數(shù)據(jù)動作流程 

    2.3.2 讀數(shù)據(jù)

    讀卡模塊-MCU。響應(yīng)信號和SCLK信號由MCU產(chǎn)生,ss信號和SDATA信號由讀卡模塊產(chǎn)生。如表4所示。

    表4 MCU從讀卡模塊讀數(shù)據(jù)動作流程 

    3 存儲模式

    由于實(shí)際應(yīng)用中讀卡環(huán)境的隨意性,對卡的操作可能會造成數(shù)據(jù)丟失,例如在數(shù)據(jù)寫入的過程中Ic卡離開感應(yīng)區(qū)等。因此,必須采取必要的措施來防止數(shù)據(jù)的丟失以及對丟失的數(shù)據(jù)進(jìn)行恢復(fù)。為確保數(shù)據(jù)的穩(wěn)定性,筆者對存儲模式和存取操作兩方面進(jìn)行設(shè)計(jì),在此先論述存儲模式的設(shè)計(jì),而對于存取操作的設(shè)計(jì)將在第4節(jié)闡述。

    3.1 存儲模式設(shè)計(jì)

    為防止數(shù)據(jù)的丟失以及為已丟失的數(shù)據(jù)提供恢復(fù)的藍(lán)本,在數(shù)據(jù)的存儲模式上采用兩層冗余存儲模式。第1層是塊內(nèi)冗余存儲。寫入數(shù)據(jù)時(shí)按表5列出的格式,對塊值和塊地址進(jìn)行冗余備份。數(shù)據(jù)(0—3號字節(jié)的Value或12號字節(jié)的Adr)讀出后,將其與備份值相對比,無誤后方可確認(rèn)為真值;若有誤,則視為該塊數(shù)據(jù)出現(xiàn)“部分丟失”現(xiàn)象,須進(jìn)行恢復(fù)。

    表5 塊內(nèi)冗余存儲模式 

    第2層是塊間冗余存儲。如表1所示,將4 kB的存儲空間分配給72個(gè)邏輯地址(LgeAdr),編號0—71,每個(gè)邏輯地址指向同一扇區(qū)內(nèi)的3個(gè)數(shù)據(jù)塊(起始地址是扇區(qū)內(nèi)的塊0)。為防止對控制塊的誤操作,每個(gè)扇區(qū)的控制塊不映射到邏輯地址中。如表6所示,邏輯地址中的第1個(gè)塊是數(shù)據(jù)區(qū),用于正常存儲數(shù)據(jù);第2個(gè)塊是備份區(qū),用于備份數(shù)據(jù)區(qū)的內(nèi)容,當(dāng)數(shù)據(jù)區(qū)的內(nèi)容發(fā)生“完全丟失”現(xiàn)象時(shí),可以此作為恢復(fù)的藍(lán)本(具體操作在4.2節(jié)討論);第3塊為預(yù)留區(qū),可在實(shí)際應(yīng)用中記錄其他信息。

    表6 邏輯地址的單元映射 


    3.2 地址變換函數(shù)

    對Ic卡存儲空間的實(shí)際物理操作,僅僅通過邏輯地址是不可行的,所以必須進(jìn)行地址變換,將邏輯地址變?yōu)橄鄳?yīng)的扇區(qū)號(sector)和塊號(block,指向低位塊)。具體函數(shù)如下:
    uehar AdrTrans(uehar—LgeAdr,uehar 一sector,uehar 一block)
    {if(-LgcAdr>’=72)return DATA_E111; //超出邏輯塊地址范圍,返回錯(cuò)誤
    else if(_LgcAdr<32) 一sector=一LgcAdr; //0—31號扇區(qū)
    else -sector=(-LgeAdr一32)/5+32; //32—39扇區(qū)
    block = _ LgcAdr 3 + 一sector; //轉(zhuǎn)換物理塊號
    return DATA-OK;}

    4 存取操作

    對MF1 ICS70有讀、寫、加值、減值、存儲、傳輸共6種基本操作,它們在讀卡模塊自帶的函數(shù)庫中都有相應(yīng)的實(shí)現(xiàn)函數(shù)。但是,這些函數(shù)并未考慮到數(shù)據(jù)穩(wěn)定性的問題,所以僅僅調(diào)用它們是不夠的,必須在存儲的過程中加入保證數(shù)據(jù)穩(wěn)定性的算法。讀和寫是上述6種基本操作中最基本的兩種操作,其他操作均可間接地通過它們來實(shí)現(xiàn)。下面在存儲模式的基礎(chǔ)上對存儲操作進(jìn)行設(shè)計(jì)。

    4.1 寫操作

    數(shù)據(jù)的丟失往往發(fā)生在寫操作的過程中,寫入的不成功會導(dǎo)致數(shù)據(jù)丟失。根據(jù)存儲模式的設(shè)計(jì),每一個(gè)邏輯地址可存放一個(gè)4字節(jié)的數(shù)據(jù)和1字節(jié)的地址,所以定義該數(shù)據(jù)為長整型(1ong),在讀、寫操作時(shí)須用單字節(jié)指針來對其進(jìn)行轉(zhuǎn)存。具體操作是:先將long型操作數(shù)轉(zhuǎn)存人buf[0...3]位,將邏輯地址Lg-cAdr存人buf[12]位;再依據(jù)塊內(nèi)冗余存儲模式對數(shù)據(jù)進(jìn)行備份;最后將數(shù)據(jù)進(jìn)行兩次發(fā)送,先發(fā)送到塊間冗余存儲模式的備份區(qū),再發(fā)送到數(shù)據(jù)區(qū),只要有一次發(fā)送成功則視為整個(gè)發(fā)送過程成功。程序如下:

    uehar DamWrite(1ong 一Value,uehar—LgeAdr,uchar—block,
    uchar idam _ bur)
    {uehar temp=(uehar )_Value; //轉(zhuǎn)存指針
    uehar writecheck:DATA— ERR; //寫入狀態(tài)標(biāo)記,用于返回值
    — buf[0]= (temp+3);-buf[1]= (temp+2);-buf[2]
    = (temp+1);-buf[3]: temp; //數(shù)據(jù)轉(zhuǎn)存到緩沖區(qū)
    _ 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; //轉(zhuǎn)存地址,并備份
    writecheck= writeeheck& mils_
    write(一block+1,一bur); //
    將數(shù)據(jù)寫入備份塊
    writecheck= writecheck& mils— write(一block,一bur); //將
    數(shù)據(jù)寫入數(shù)據(jù)塊
    retum writecheck; //返回最終發(fā)送狀態(tài)}

4.2 讀操作

    讀操作是不會引起數(shù)據(jù)丟失的,但在讀出數(shù)據(jù)后有必要對所讀出的內(nèi)容進(jìn)行校驗(yàn),確認(rèn)其完整性后方可認(rèn)定為真值,否則須予以修正。依據(jù)兩層冗余存儲模式,修正亦分為兩種:部分丟失恢復(fù)和完全丟失恢復(fù)。部分丟失恢復(fù)利用塊內(nèi)冗余備份,真值的依據(jù)是:相同的數(shù)據(jù)為真值,即應(yīng)有2份Value相同以及3份Adr相同,對出錯(cuò)的那一份數(shù)據(jù)進(jìn)行修正。由于寫操作中進(jìn)行了兩次發(fā)送,卡內(nèi)數(shù)據(jù)是安全的,當(dāng)數(shù)據(jù)區(qū)內(nèi)容“完全丟失”時(shí),從備份區(qū)讀出數(shù)據(jù)來恢復(fù)數(shù)據(jù)區(qū)的內(nèi)容。

    具體的讀操作是:先從卡中讀出數(shù)據(jù)區(qū)內(nèi)容,進(jìn)行塊內(nèi)數(shù)據(jù)正確性檢查及糾錯(cuò);然后判斷數(shù)據(jù)是否“完全丟失”,若否,則可確認(rèn)為真值,若是,則從備份區(qū)讀出數(shù)據(jù);最后根據(jù)存儲模式的格式對讀出內(nèi)容進(jìn)行轉(zhuǎn)換。程序如下:

    uchar DataRead(1ong -Value,uchar$~LgcAdr,uchar—block,
    uchar idata $一buf)
    {uchar$temp=(uchar$)-Value;//轉(zhuǎn)存指引‘
    if(mifs_read(一block,一buf)!=0)return DATA~ERR; //讀卡
    DataCheck(一buf); //數(shù)據(jù)正確性檢查及糾錯(cuò)
    //若數(shù)據(jù)為全0,視為數(shù)據(jù)丟失;此時(shí)從備份塊中濱取數(shù)據(jù)
    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];//值轉(zhuǎn)換
    LgcAdr=~ buf[12];//讀出邏輯地址
    return DATA— OK;}

    5 主程序流程 

    6 結(jié)束語 

    本文在Mifare智能Ic卡應(yīng)用的典型電路上進(jìn)行軟件設(shè)計(jì),程序的讀寫效率和數(shù)據(jù)穩(wěn)定性都達(dá)到很高的要求。算法及程序的通用性好,可移植到不同的電路系統(tǒng)中,根據(jù)實(shí)際應(yīng)用稍加修改即可滿足要求。本文主要從通用的角度進(jìn)行設(shè)計(jì),在實(shí)際具體應(yīng)用中應(yīng)根據(jù)需要添加必要的輔助程序,如存儲器擴(kuò)展、LCD顯示、語音提示等。非接觸式Ic卡讀卡系統(tǒng)具備迅速、方便、安全、可靠、穩(wěn)定等優(yōu)點(diǎn),目前正逐步取代傳統(tǒng)磁卡和接觸式IC卡,具有巨大的市場競爭力和廣闊的發(fā)展前景。

    (作者單位:華南理工大學(xué)物理科學(xué)與技術(shù)學(xué)院,華南理工大學(xué)計(jì)算中心)

本文關(guān)鍵詞:單片機(jī),Mifare智能卡,讀卡器,MC,片機(jī),Mifare智能卡,讀卡器,MCU
回到頂部