《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 基于MCU實(shí)現(xiàn)CPU卡讀寫(xiě)驅(qū)動(dòng)接口的設(shè)計(jì)
基于MCU實(shí)現(xiàn)CPU卡讀寫(xiě)驅(qū)動(dòng)接口的設(shè)計(jì)
2016年微型機(jī)與應(yīng)用第08期
高柱榮1,2,蔡國(guó)永1
(1.桂林電子科技大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院,廣西 桂林 541004; 2.桂林市利通電子科技有限責(zé)任公司,廣西 桂林 541004
摘要: 提出了一種CPU卡低層讀寫(xiě)驅(qū)動(dòng)接口的設(shè)計(jì)方案,該方案采用MCU的通用I/O引腳直接驅(qū)動(dòng)CPU卡的方式實(shí)現(xiàn)。首先分析了CPU卡的接口特性及傳輸協(xié)議,介紹了方案設(shè)計(jì)時(shí)對(duì)MCU選型的注意事項(xiàng)和ESAM安全模塊的功能及作用;接著基于Microchip公司的PIC16LF1946芯片,完成了方案中硬件接口設(shè)計(jì)和軟件接口函數(shù)設(shè)計(jì);最后對(duì)方案中給出的設(shè)計(jì)進(jìn)行實(shí)現(xiàn)和接口驗(yàn)證測(cè)試。測(cè)試結(jié)果表明,該設(shè)計(jì)方案符合ISO7816標(biāo)準(zhǔn)的要求,能高效實(shí)現(xiàn)CPU卡的讀寫(xiě)。
Abstract:
Key words :

  高柱榮1,2,蔡國(guó)永1

 ?。?.桂林電子科技大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院,廣西 桂林 541004;2.桂林市利通電子科技有限責(zé)任公司,廣西 桂林 541004)

  摘要:提出了一種CPU卡低層讀寫(xiě)驅(qū)動(dòng)接口的設(shè)計(jì)方案,該方案采用MCU的通用I/O引腳直接驅(qū)動(dòng)CPU卡的方式實(shí)現(xiàn)。首先分析了CPU卡的接口特性及傳輸協(xié)議,介紹了方案設(shè)計(jì)時(shí)對(duì)MCU選型的注意事項(xiàng)和ESAM安全模塊的功能及作用;接著基于Microchip公司的PIC16LF1946芯片,完成了方案中硬件接口設(shè)計(jì)和軟件接口函數(shù)設(shè)計(jì);最后對(duì)方案中給出的設(shè)計(jì)進(jìn)行實(shí)現(xiàn)和接口驗(yàn)證測(cè)試。測(cè)試結(jié)果表明,該設(shè)計(jì)方案符合ISO7816標(biāo)準(zhǔn)的要求,能高效實(shí)現(xiàn)CPU卡的讀寫(xiě)。

  關(guān)鍵詞: CPU卡;ESAM模塊讀寫(xiě)接口;傳輸協(xié)議;ISO7816

0引言

  當(dāng)今,各類(lèi)IC卡(如居民身份證、社???、水電氣充值卡等)已成為人們?nèi)粘I钪胁豢扇鄙俚囊徊糠?,并為人們的生活帶?lái)了極大的便利。IC卡技術(shù)也已從最初的存儲(chǔ)卡、邏輯加密卡發(fā)展到今天的CPU卡。與之相應(yīng)的是需要配備大量的IC卡智能終端設(shè)備。目前開(kāi)發(fā)的IC卡智能終端設(shè)備中的讀寫(xiě)接口部分大多采用專(zhuān)用的接口芯片來(lái)實(shí)現(xiàn),如TDA8007等,這使得產(chǎn)品的成本較高,體積也較大。本文提出一種基于設(shè)備產(chǎn)品的主控MCU通用引腳,直接模擬通信協(xié)議實(shí)現(xiàn)接觸式CPU卡讀寫(xiě)接口的低成本實(shí)用方案。

1CPU卡的接口特性及傳輸協(xié)議

  CPU卡也稱(chēng)智能卡(Smart Card),卡中的集成電路包括微處理器、EEPROM、隨機(jī)存儲(chǔ)器RAM、程序存儲(chǔ)器ROM(Flash)以及片內(nèi)操作系統(tǒng)(COS)。裝有COS的CPU卡相當(dāng)于一臺(tái)微型計(jì)算機(jī),不僅具有數(shù)據(jù)存儲(chǔ)功能,同時(shí)具有命令處理和數(shù)據(jù)安全保護(hù)等功能。按卡與外界數(shù)據(jù)傳送的形式來(lái)劃分,可將CPU卡分為接觸式卡、非接觸式卡和雙界面卡。

  1.1CPU卡的觸點(diǎn)分配

  CPU卡觸點(diǎn)的分配遵循ISO78162的規(guī)定[1],如圖1所示,表1為觸點(diǎn)的功能及工作參數(shù)說(shuō)明?! ?/p>

001.jpg

  1.2CPU卡使用過(guò)程

  正常的用卡過(guò)程可劃分為如下4個(gè)階段[2]:

  (1)把IC卡插入終端接口設(shè)備,并接通各觸點(diǎn);

 ?。?)使IC卡復(fù)位并在終端和IC卡間建立通信;

 ?。?)執(zhí)行交易;

 ?。?)釋放觸點(diǎn)并取出IC卡。

  1.3傳輸協(xié)議

  根據(jù)ISO7816-4的規(guī)定,CPU卡必須支持異步半雙工字符傳輸協(xié)議(T=0)或異步半雙工塊傳輸協(xié)議(T=1)中的一種,且僅支持一種。讀卡終端則必須同時(shí)支持T=0和T=1的兩種協(xié)議[3]。目前T=0通信協(xié)議的應(yīng)用最為廣泛,大多數(shù)CPU卡都支持該協(xié)議,在金融交易中也采用這種通信協(xié)議,基于此,本文僅討論T=0協(xié)議。

  1.3.1協(xié)議命令

  協(xié)議的命令格式如下[4]:

       H074L5_%C76_CM859%USB4F.png其中CLA表示命令類(lèi)別;INS表示指令代碼;P1、P2為INS的參數(shù)字節(jié);Lc為發(fā)送數(shù)據(jù)長(zhǎng)度, 可選字段,長(zhǎng)度為0、1 B或3 B;Data為命令數(shù)據(jù)字段,可選字段,長(zhǎng)度為0~N B;Le為接收數(shù)據(jù)長(zhǎng)度,可選字段,長(zhǎng)度為0、1 B、2 B或3 B,指出命令響應(yīng)中預(yù)期的數(shù)據(jù)最大字節(jié)數(shù);命令頭由命令的前5 B組成,其中第5個(gè)字節(jié)(P3)由INS的編碼而定,或是表示命令中送給CPU卡的數(shù)據(jù),或是等待從CPU卡響應(yīng)的最大數(shù)據(jù)長(zhǎng)度?! f(xié)議響應(yīng)的格式如下:

        ~QZV}4B2T~1HK16SDC[T_(Q.png

2其中Data為返回?cái)?shù)據(jù)字段,可選字段,長(zhǎng)度為0~N B;SW1、SW2為響應(yīng)狀態(tài)字節(jié)。

  1.3.2過(guò)程字節(jié)

  CPU卡在收到命令頭后,回送一個(gè)過(guò)程字節(jié)給傳輸層(TTL),向TTL指明下一步必須采取的措施[2],如表2所示。

007.jpg

  在情況Ⅰ或Ⅱ時(shí),當(dāng)TTL采取的措施實(shí)行后,它就等待著另一個(gè)過(guò)程字節(jié)。當(dāng)情況為Ⅲ時(shí),在收到第2個(gè)狀態(tài)字節(jié)SW2之后,TTL必須處理如下:

  (1)如果過(guò)程字節(jié)為"61",則TTL送出一條GET RESPONSE命令給IC卡,其中的最大長(zhǎng)度為XX,XX為SW2的值。

  (2)如果過(guò)程字節(jié)為"6C",則TTL立即重發(fā)前一個(gè)命令的命令頭給IC卡,其長(zhǎng)度為XX,XX是SW2之值。

 ?。?)如果過(guò)程字節(jié)為"6X"(除了"60"、"61"和"6C")或"9X",TTL將通過(guò)命令響應(yīng)返回狀態(tài)碼給應(yīng)用層(TAL),由TAL處理,并等待下一個(gè)命令。

2硬件接口設(shè)計(jì)

  能對(duì)CPU卡進(jìn)行讀寫(xiě)操作的MCU,第一,需要有時(shí)鐘輸出CLKOUT功能,能輸出1~5 MHz的某一頻率時(shí)鐘;第二,需要有一個(gè)外部中斷口,用于檢測(cè)插卡動(dòng)作。當(dāng)然,開(kāi)發(fā)一個(gè)項(xiàng)目,比如卡式水表或燃?xì)獗恚€需要考慮低功耗、LCD驅(qū)動(dòng)、A/D轉(zhuǎn)換、內(nèi)部存儲(chǔ)器和內(nèi)部振蕩器等,盡量用一顆MCU完成項(xiàng)目的所有功能以節(jié)約成本。

  在本案中,選用了Microchip公司的8位CMOS閃存單片機(jī)PIC16LF1946芯片[5]。該芯片內(nèi)置高精度振蕩器,可選32 MHz、16 MHz(TYP)、8 MHz、4 MHz、2 MHz、1 MHz作為系統(tǒng)時(shí)鐘;內(nèi)置16K×14 B的閃存程序存儲(chǔ)器,1 024 B的數(shù)據(jù)存儲(chǔ)器(RAM),256 B數(shù)據(jù)EEPROM;自帶LCD驅(qū)動(dòng)器,最多能驅(qū)動(dòng)4×46位段的面板;一個(gè)時(shí)鐘輸出引腳,輸出頻率為Fosc/4;還有17個(gè)10 bit分辨率的AD采樣口,8個(gè)外部中斷口,5個(gè)定時(shí)/計(jì)數(shù)器等功能部件;超低功耗設(shè)計(jì),已采用該芯片開(kāi)發(fā)完成的卡式燃?xì)獗?,其平均電流小? μA。這些資源和特性滿足控制系統(tǒng)的需求。

  2.1ESAM

  嵌入式安全控制模塊(Embedded Secure Access Module,ESAM)其實(shí)質(zhì)為DIP或者SOP芯片封裝的CPU卡芯片,最早被用于IC卡電表作為錢(qián)包使用,存儲(chǔ)充值及消費(fèi)金額以及其他一些重要的參數(shù),同時(shí)具有身份識(shí)別功能,與外部卡片進(jìn)行雙向身份認(rèn)證。隨著終端安全的日益被重視,目前ESAM被廣泛應(yīng)用于各種智能終端設(shè)備中,實(shí)現(xiàn)文件和密鑰的安全存儲(chǔ)、數(shù)字簽名、數(shù)據(jù)加密解密、雙向身份認(rèn)證、內(nèi)部分散密鑰、電子錢(qián)包等多種功能[6]。ESAM的讀寫(xiě)接口與CPU卡的讀寫(xiě)接口完全一致。

  2.2電路設(shè)計(jì)

  本方案包括CPU卡接口電路和ESAM接口電路,可實(shí)現(xiàn)對(duì)CPU卡讀寫(xiě)、密鑰認(rèn)證和數(shù)據(jù)存儲(chǔ)等功能。原理圖如圖2所示。

002.jpg

  RG1和RG3端口分別連接CPU卡的數(shù)據(jù)IO和RST,RF6和RF5端口分別連接ESAM模塊的數(shù)據(jù)IO和RST。

  CPU卡的工作時(shí)鐘直接使用MCU的引腳輸出時(shí)鐘,這樣就可以很好地實(shí)現(xiàn)雙方的通信時(shí)鐘同步問(wèn)題。因PIC16LF1946單片機(jī)只有一個(gè)時(shí)鐘輸出端口(RA6),只能使用此端口同時(shí)給CPU卡和ESAM提供工作時(shí)鐘,時(shí)鐘工作頻率設(shè)置為4 MHz,以充分利用CPU卡的高速性能。

  從降低功耗和安全性方面考慮,CPU卡和ESAM的電圖2電路原理圖源和時(shí)鐘應(yīng)該由MCU來(lái)控制,RG2端口控制給卡座供電,RF7端口控制給ESAM卡供電,RG0端口控制時(shí)鐘輸出。使用具有中斷功能的RB0端口檢測(cè)卡片的插入與拔出,當(dāng)有卡片插入卡座時(shí),給卡座供電,同時(shí)輸出時(shí)鐘信號(hào);當(dāng)卡片拔出后應(yīng)立即停止供電和關(guān)閉時(shí)鐘輸出。ESAM也一樣,其電源和時(shí)鐘在需要訪問(wèn)時(shí)才打開(kāi),訪問(wèn)結(jié)束后關(guān)閉。

3軟件函數(shù)設(shè)計(jì)

  實(shí)現(xiàn)整個(gè)接口驅(qū)動(dòng),可設(shè)計(jì)成6個(gè)函數(shù)來(lái)完成,應(yīng)用層一般只需調(diào)用上電復(fù)位函數(shù)、卡命令處理函數(shù)和下電關(guān)閉函數(shù)。

  void delayETU(x):位持續(xù)時(shí)間延時(shí)函數(shù);

  void cpu_deactivation(void):下電關(guān)閉函數(shù);

  static unsigned char cpu_receivebyte(unsigned char *c):接收字符幀函數(shù);

  static unsigned char cpu_sendbyte(unsigned char c):發(fā)送字符幀函數(shù);

  unsigned char cpu_reset(unsigned char len,unsigned char *data_buffer):上電復(fù)位函數(shù);

  unsigned char cpu_protocol(unsigned char len, const unsigned char *send_cmd, unsigned char *lenr, unsigned char *receive_data, unsigned char bRespondAuto):卡命令處理函數(shù)。

  3.1位持續(xù)時(shí)間的計(jì)算

  終端與CPU卡之間通過(guò)改變I/O傳輸線上的電平來(lái)交換信息,在數(shù)據(jù)傳輸中每一位的持續(xù)時(shí)間稱(chēng)為基本時(shí)間單元(Elementary Time Unit,ETU),ETU的值由時(shí)鐘頻率f決定,其計(jì)算公式為:

  1 ETU=372/f(1)

  其中,f的單位為Hz,在卡的整個(gè)交易過(guò)程中,f的值應(yīng)在1~5 MHz之間[2]。當(dāng)時(shí)鐘頻率f選擇4 MHz時(shí),1 ETU=93 μs,這只是一個(gè)理論值,在實(shí)際應(yīng)用中,受到編程語(yǔ)言及編譯器的影響會(huì)有小幅變化,需調(diào)測(cè)出最小值和最大值,選擇中間值使用。

  3.2上電復(fù)位

  CPU卡插入卡座前,必須確保終端的所有觸點(diǎn)都處于低電平狀態(tài)。當(dāng)MCU的外部中斷檢測(cè)到有卡片插入卡座時(shí),在做必要的防抖動(dòng)處理后,開(kāi)始進(jìn)入對(duì)CPU的上電復(fù)位操作,步驟如下:

 ?。?)給Vcc上電,延時(shí)20 μs左右等待Vcc穩(wěn)定;

  (2)加上CLK時(shí)鐘信號(hào);

 ?。?)把I/O線置為接收方式;

 ?。?)延時(shí)40 000~45 000個(gè)CLK周期,之后把RST置為高電平狀態(tài);

 ?。?)循環(huán)檢測(cè)CPU卡上I/O的復(fù)位應(yīng)答信號(hào),正常情況下,400多個(gè)CLK周期之后便能開(kāi)始收到應(yīng)答,如應(yīng)答字節(jié)符合ISO78163的要求,則復(fù)位成功;如在40 000個(gè)CLK周期內(nèi)沒(méi)有收到應(yīng)答,表明復(fù)位失敗,需對(duì)CPU卡執(zhí)行下電操作,釋放各個(gè)觸點(diǎn)。

  3.3下電關(guān)閉

  下電是用卡過(guò)程的最后一個(gè)步驟,在交易結(jié)束后(包括異常結(jié)束),必須按以下步驟釋放各觸點(diǎn):

 ?。?)置RST為低電平狀態(tài);

 ?。?)在RST置為低電平之后,且Vcc置為低電平之前,將CLK關(guān)閉,I/O置為低電平;

 ?。?)置Vcc為低電平去電。

  3.4接收字符幀

  每一個(gè)字符幀包含10個(gè)相連的數(shù)位:1位為低電平的起始位、8位數(shù)據(jù)字節(jié)和1位偶校驗(yàn)位。首先循環(huán)查詢(xún)起始位,如果在40 000個(gè)CLK周期內(nèi)沒(méi)有收到低電平起始位,表明接收字符幀失敗,返回接收超時(shí)失敗;否則,如收到圖3接收字符幀流程低電平起始位,則繼續(xù)接收后續(xù)的8位數(shù)據(jù)字節(jié)和1位偶校驗(yàn)位。之后,比較校驗(yàn)位是否正確,若校驗(yàn)位正確則表明接收字符幀成功;若校驗(yàn)位錯(cuò)誤,請(qǐng)求CPU卡重發(fā)字符幀,最多請(qǐng)求重發(fā)2次。若2次重新接收的字符幀都不正確,則返回接收失敗。圖3是接收字符幀的函數(shù)流程圖。

003.jpg

  3.5發(fā)送字符幀

  根據(jù)ISO7816標(biāo)準(zhǔn)的規(guī)定,要發(fā)送一個(gè)字符幀,首先發(fā)送1位起始位,接著發(fā)送8位數(shù)據(jù)字節(jié),最后發(fā)送偶校驗(yàn)位。之后,I/O口轉(zhuǎn)為接收模式,再過(guò)一個(gè)ETU之后,檢測(cè)I/O口,若為高電平則表明字符發(fā)送成功,若為低電平則表明發(fā)送錯(cuò)誤,需要重新發(fā)送。若重發(fā)2次都還是發(fā)送錯(cuò)誤,則返回發(fā)送失敗。圖4是發(fā)送字符幀的函數(shù)流程圖。

  

004.jpg

  3.6卡命令處理函數(shù)

  在ISO7816標(biāo)準(zhǔn)中定義了多種終端與卡的信息交互命令,包括管理卡和文件的命令、數(shù)據(jù)單元處理命令、記錄處理命令、數(shù)據(jù)對(duì)象處理命令、安全處理命令、傳輸處理命令、用于結(jié)構(gòu)化卡查詢(xún)語(yǔ)言的處理命令和在多應(yīng)用環(huán)境中的應(yīng)用管理命令。當(dāng)然,在實(shí)際應(yīng)用中并不要求所有的卡都支持全部的命令。

  所有命令均是由終端應(yīng)用層(TAL)通過(guò)傳輸層(TTL)向IC卡發(fā)出命令,TTL首先把命令頭的5 B傳送給IC卡,并等待著一個(gè)過(guò)程字節(jié)返回,之后再根據(jù)返回的過(guò)程字節(jié)作進(jìn)一步的處理[2]。

  圖5是卡命令處理函數(shù)的流程圖[7],按此圖編寫(xiě)的函數(shù)可處理所有終端與卡交互命令。

  

005.jpg

4接口測(cè)試

  圖6卡式燃?xì)獗砜刂破魇褂媚骋蝗細(xì)獗眄?xiàng)目的CPU卡,對(duì)按照本文接口方案開(kāi)發(fā)的卡式燃?xì)獗砜刂破鳎ㄈ鐖D6所示)進(jìn)行測(cè)試,分別測(cè)試了上電復(fù)位函數(shù)、卡命令處理函數(shù)和下電關(guān)閉函數(shù)。測(cè)試結(jié)果表明接口的設(shè)計(jì)符合ISO7816的要求。

006.jpg

 ?。?)上電復(fù)位測(cè)試

  把CPU卡插入卡座,控制器MCU執(zhí)行cpu_reset()函數(shù),接收到從CPU卡返回的應(yīng)答數(shù)據(jù):3B 6D 00 00 57 44 29 46 40 86 93 00 07 E2 07 45 2C。該數(shù)據(jù)符合ISO78163的復(fù)位應(yīng)答要求,上電復(fù)位函數(shù)測(cè)試成功。

 ?。?)選擇應(yīng)用目錄命令測(cè)試

  MCU執(zhí)行cpu_protocol()函數(shù),給CPU卡發(fā)送命令:00 A4 00 00 02 DF 01;CPU卡返回應(yīng)答數(shù)據(jù):6F 10 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 32 90 00。

  應(yīng)答數(shù)據(jù)的最后2 B為狀態(tài)字節(jié)SW1和SW2,其中90 00表示執(zhí)行命令成功。

 ?。?)讀取用戶(hù)卡號(hào)命令測(cè)試

  MCU執(zhí)行cpu_protocol()函數(shù),給CPU卡發(fā)送命令:00 B0 8A 0C 08;CPU卡返回應(yīng)答數(shù)據(jù):07 55 00 01 26 70 17 06 90 00。

  應(yīng)答數(shù)據(jù)的前8 B為用戶(hù)卡的卡編號(hào),后2 B狀態(tài)字節(jié)90 00表示執(zhí)行命令成功。

 ?。?)下電關(guān)閉測(cè)試

  在MCU執(zhí)行cpu_deactivation ()函數(shù)之后,使用萬(wàn)用表檢測(cè)卡座的RST、Vcc和I/O觸點(diǎn)均為低電平,使用示波器檢測(cè)CLK觸點(diǎn)為沒(méi)有波型輸出,說(shuō)明CPU卡已下電關(guān)閉成功。

5結(jié)論

  本文是在具體的項(xiàng)目開(kāi)發(fā)過(guò)程中,根據(jù)ISO7816系列標(biāo)準(zhǔn),基于MCU通用I/O引腳實(shí)現(xiàn)了CPU卡讀寫(xiě)接口的軟硬件低層驅(qū)動(dòng)設(shè)計(jì),此設(shè)計(jì)方案已在實(shí)際應(yīng)用中得到了驗(yàn)證,效果良好。讀者稍加修改或不用修改便可以把本文的設(shè)計(jì)應(yīng)用到其他CPU卡系統(tǒng)項(xiàng)目中。

參考文獻(xiàn)

 ?。?] International Standard ISO/IEC 78162. Dimensions and location of the contacts[S]. 2007.

 ?。?] International Standard ISO/IEC 78163. Electrical interface and transmission protocols[S]. 2006.

  [3] International Standard ISO/IEC 78164. Organization, security and commands for interchange[S]. 2005.

 ?。?] 王愛(ài)英. 智能卡技術(shù)——IC卡、RFID標(biāo)簽與物聯(lián)網(wǎng)(第4版)[M]. 北京:清華大學(xué)出版社, 2015.

 ?。?] Microchip. PIC16(L)F1946/1947數(shù)據(jù)手冊(cè)[Z]. 2012.

 ?。?] 王耀. ESAM安全模塊及其在卡表上的應(yīng)用[J]. 城市燃?xì)? 2003, 337(3): 1821.

 ?。?] 陳峰,尹寒. CPU卡的接口特性、傳輸協(xié)議與讀寫(xiě)程序設(shè)計(jì)[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2002(3): 1722.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。