用PIC 單片機(jī)實(shí)現(xiàn)的IC 卡讀寫(xiě)器
文章出處:http://coolbang.cn 作者: 人氣: 發(fā)表時(shí)間:2011年10月20日
[文章內(nèi)容簡(jiǎn)介]:詳細(xì)介紹PIC 單片機(jī)使用SPI 方式與IC 卡進(jìn)行數(shù)據(jù)傳輸?shù)脑砗碗娐吩O(shè)計(jì),以及使用USART 方式與PC 機(jī)進(jìn)行串行異步通信的工作原理;介紹PIC 單片機(jī)聽(tīng)SPI 方式和USART 方式的設(shè)置方法。
引言本設(shè)計(jì)的主要目的是介紹IC 卡的數(shù)據(jù)存儲(chǔ)技術(shù)和IC 卡的數(shù)據(jù)通信,因而使用存儲(chǔ)器卡。由于本設(shè)計(jì)中既可與IC 卡進(jìn)行串行同步通信,又要與上位機(jī)進(jìn)行中行異步通信,因而需要選擇一種同時(shí)具有這兩種通信方式的單片機(jī)。因?yàn)镻IC16F877 不僅具有本設(shè)計(jì)所需要的兩種通信方式,而且還具有運(yùn)行速度快、低功耗、價(jià)格低等優(yōu)點(diǎn),所以選擇PIC16F877 單片機(jī)作為本設(shè)計(jì)的單片機(jī)。本設(shè)計(jì)的二極管電路是單片機(jī)與IC 卡通信數(shù)據(jù)線的保護(hù)電路。當(dāng)數(shù)據(jù)線上的電壓為負(fù)電壓時(shí),與地相連的二極管導(dǎo)通;當(dāng)數(shù)據(jù)線上的電壓大于+5V 時(shí),與+5V 相連的二極管導(dǎo)通,從而保證數(shù)據(jù)線上的電壓在0V~+5V 之間,保護(hù)單片機(jī)和IC 卡不受損壞。單片機(jī)的15 腳和23 腳分別與IC 卡的輸出引腳3 和4 相連。由于IC 卡的輸出電壓為CMOS 電平,而單片機(jī)能夠正確的識(shí)別IC 卡的輸出信號(hào),需要加上拉電阻。1 SPI 工作方式串行外圍設(shè)備接口SPI(Serial Peripheral Interface)總線技術(shù)是Motrola 公司推出的一種同步串行接口。SPI 總線是一種三線同步總線,因其硬件能力很強(qiáng),與SPI 有關(guān)的軟件就相當(dāng)簡(jiǎn)單,使CPU 有更多的時(shí)間處理其它事務(wù),因此得到廣泛應(yīng)用。SPI 模式允許8 位數(shù)據(jù)同步發(fā)送和接收,支持SPI 的所有四種方式。SPI 模式傳輸數(shù)據(jù)需要四根信號(hào)線:串行數(shù)據(jù)輸出(SDO)線、串行數(shù)據(jù)輸入(SDI)線、串行時(shí)鐘(SCK)和從選擇(SS)。其中,從選擇線只用于從屬模式。1.1 SPI 主模式由于控制時(shí)鐘SCK 的輸出,主模式可以在任何時(shí)候開(kāi)始傳輸數(shù)據(jù)。主模式通過(guò)軟件協(xié)議控制從模式的數(shù)據(jù)輸出。在主模式中,一旦SSPUF 寄存器寫(xiě)入,數(shù)據(jù)就會(huì)發(fā)送或接收。在接收數(shù)據(jù)時(shí),SSPSR 寄存器按照時(shí)鐘速率移位,一旦接收到一個(gè)字節(jié),數(shù)據(jù)就傳輸?shù)絊SPBUF,同時(shí)中斷標(biāo)志位和狀態(tài)標(biāo)志位置位。時(shí)鐘的極性可以通過(guò)編程改變。在主模式中,時(shí)鐘SCK 的頻率可以設(shè)置為:fosc/4(即Tcy)、fosc/16(即4Tcy)、fosc/64(即16Tcy)和定時(shí)器2(Timer2)輸出的二分頻等四種。在芯片時(shí)鐘為20MHz 時(shí),SCK的最大頻率為5.0MHz。在本設(shè)計(jì)中,使用的就是SPI 主模式,由單片機(jī)控制時(shí)鐘SCK 的輸出。當(dāng)向IC 卡中寫(xiě)數(shù)據(jù)時(shí),隨時(shí)可以發(fā)送數(shù)據(jù);當(dāng)讀IC 卡內(nèi)的數(shù)據(jù)時(shí),先要發(fā)送任意一個(gè)數(shù)據(jù)(此時(shí)IC 卡不處于寫(xiě)入狀態(tài),不會(huì)接收該數(shù)據(jù)), 給IC 卡提供輸出數(shù)據(jù)的時(shí)鐘,然后再接收IC 卡發(fā)出的數(shù)據(jù)。其時(shí)序如圖2 所示。(發(fā)送和接惦的數(shù)據(jù)均為6FH)如果要連續(xù)發(fā)送數(shù)據(jù),那么每次將數(shù)據(jù)送到SSPBUF 寄存器后,都要判斷是否已經(jīng)發(fā)送完該數(shù)據(jù),即判斷PIR1 寄存器的SSPIF 位是否為1。如果SSPIF 位為1,則表明數(shù)據(jù)已經(jīng)發(fā)送完畢,可以繼續(xù)發(fā)送下一個(gè)數(shù)據(jù)。但此時(shí)還不能立即發(fā)送下一個(gè)數(shù)據(jù),因?yàn)镾SPIF 位必須在程序中由軟件清零,只有將SSPIF 位軟件清零后,才能繼續(xù)發(fā)送下一個(gè)數(shù)據(jù)。550)this.style.width=550;" border=0>1.2 SPI 從模式在SPI 從模式,數(shù)據(jù)的發(fā)送和接收領(lǐng)先SCK 引腳上輸入的外時(shí)鐘脈沖,當(dāng)最后一位被鎖存后,中斷標(biāo)志位SSPIF(PIR1 的D3)位。在休眠模式,從模式仍可發(fā)送和接收數(shù)據(jù),一旦接收到數(shù)據(jù),芯片就從休眠中喚醒。如果采用SS 控制的從模式,當(dāng)SS 引腳接到VDD 時(shí),SPI 模式復(fù)位;如果 彩CKE=1 控制的從模式,必須開(kāi)放SS 引腳控制。在本設(shè)計(jì)中,由于IC 卡是存儲(chǔ)器卡,不能提供時(shí)鐘信號(hào),因此不能采用從模式,只能采用主模式,由單片機(jī)控制時(shí)鐘信號(hào)。單片機(jī)的SPI 方式初始化程序如下:MOVLW20H ;將20H 送到累加器MOVWF SSPCON ;將累加器中的數(shù)送到SSPCON 寄存器BSF STATUS,RP0 ;將定RAM 區(qū)的第1 頁(yè)BCF SSPSTAT,SMP ;將SSPSTAT 寄存器的SMP 位置0BSF SSPSTAT,CKE ;將SSPSTAT 寄存器的CLK 位置1BCF TRISC,3 ;將端口C 的第3 位設(shè)置為輸出BCF TRISC,5 ;將端口C 的第5 位設(shè)置為輸出其中,上述第1、2 行程序是配置控制寄存器,將SPI 方式配置為主控模式,時(shí)鐘頻率為單片機(jī)時(shí)鐘頻率的1/4,并將時(shí)鐘的高電平設(shè)置為空閑狀態(tài)。第3 行程序?yàn)閾Q頁(yè)指令,將指針轉(zhuǎn)到第1 頁(yè)。因?yàn)镻IC16F877 單片機(jī)的數(shù)據(jù)存儲(chǔ)器是分頁(yè)的,而所要操作的寄存器在第1 頁(yè),因此要用換頁(yè)指令將指針到第1 頁(yè)。第4、5 行程序是配置狀態(tài)寄存器,將SPI 方式設(shè)置為數(shù)據(jù)輸出時(shí)鐘的中間采樣,時(shí)鐘SCK 的上升沿觸發(fā)。第6、7 行程序則是將RC 口的RC3 和RC5 設(shè)置為輸出。2 USART 方式通用同步異步接收發(fā)送模塊(USART)是兩個(gè)串行通信接口之一,USART 又稱為SCI(Serial Communication Interface)。USART 可以設(shè)置為全雙工異步串行通信系統(tǒng),這種方式可以與個(gè)人計(jì)算機(jī)PC 或串行接口CRT 等外圍設(shè)備進(jìn)行串行通信:也可以設(shè)置為半雙工異步串行通信系統(tǒng),與串行接口的A/D 或D/A集成電路、串行EEPROM 等器件連接。USART 是二線制串行通信接口,它可以被定義如下三種工作方式:全雙工異步方式、半雙工同步主控方式、半雙工同步從動(dòng)方式。為了把RC6 和RC7 分別設(shè)置成串行通信接口的發(fā)送/時(shí)鐘(TX/CK)線和接收/數(shù)據(jù)(TX/DT)線,必須首先把SPEN 位(TCSTAT 的RD7)和方向寄存器TRISC 的D7:D6 置1。USART 功能模塊含有兩個(gè)8 位可讀/寫(xiě)的狀態(tài)/控制寄存器,它們是發(fā)送狀態(tài)/控制寄存器TXSTA 和接收狀態(tài)/控制寄存器TCSTA。USART 帶有一個(gè)8 位波特率發(fā)生器BRG(Baud Rato Generator),這個(gè)BRG 支持USART 的同步和異步工作方式。用SPBRG 寄存器控制一個(gè)獨(dú)立的8 位定時(shí)器的周期。在異步方式下,發(fā)送狀態(tài)/控制寄存器TXSTA 的BRGH 位(即D2)也被用來(lái)控制波特率(在同步方式下忽略BRGH 位)。向波特率寄存器SPBRG 寫(xiě)入一個(gè)新的初值時(shí),都會(huì)使BRG 定時(shí)器復(fù)位清零,由此可以保證BRG 不需要等到定時(shí)器溢出后就可以輸出新的波特率。對(duì)USART 方式進(jìn)行初始化的程序如下:BSF STATUS,RP0 ;將指針指向數(shù)據(jù)存儲(chǔ)器的第1 頁(yè)MOVLW 0x19MOVWF SPBRG ;設(shè)置波特率為9600BCF STATUS,RP0 ;將指針指向數(shù)據(jù)存儲(chǔ)器的第0 頁(yè)CLRF RCSTA ;將接收控制和狀態(tài)寄存器清零BSF RCSTA,SPEN ;串口允許CLRF PIR1 ;清除中斷標(biāo)志BSF STATUS,RP0 ;將指針指向數(shù)據(jù)存儲(chǔ)器的第1 頁(yè)CLRF TXSTA ;將發(fā)送控制和狀態(tài)寄存器清零BSF TXSTA,BRGH ;設(shè)置為異步、高速波特率BSF TXSTA,TXEN ;允許發(fā)送BCF STATUS,RP0 ;將指針指向數(shù)據(jù)存儲(chǔ)器的第0 頁(yè)BSF RCSTA,CREN ;允許接收初始化完成后,即可發(fā)送或接收數(shù)據(jù)。在發(fā)送或接收數(shù)據(jù)時(shí),通過(guò)查詢發(fā)送/接收中斷標(biāo)志位即可判斷是否發(fā)送完一個(gè)數(shù)據(jù)/接收到一個(gè)數(shù)據(jù)。發(fā)送/接收中斷標(biāo)地不需要也不有用軟件復(fù)位。在異步串行發(fā)送的過(guò)程中,只要TXREG 寄存器為空,中斷標(biāo)志TXIF 就置位。因此,TXIF 為1 并不是發(fā)送完畢的標(biāo)志,但仍可以用TXIF 標(biāo)志來(lái)判斷。因此當(dāng)TXREG 為空時(shí),將數(shù)據(jù)送入后,數(shù)據(jù)會(huì)保留在TXREG 寄存器中,直到前一個(gè)數(shù)據(jù)從發(fā)送移位寄存器中移出,即前一個(gè)數(shù)據(jù)發(fā)送完。3 IC 卡IC 卡是集成電路卡(Integrated Circuit Card)的簡(jiǎn)稱,有些國(guó)家和地址稱其為智能卡(Smart Card)、芯片卡(Chip Card)。國(guó)際標(biāo)準(zhǔn)化組織(ISO)在ISO7816 標(biāo)準(zhǔn)中規(guī)定,IC 卡是指在由聚氯乙烯(PVC)或聚氯乙烯酸脂(PVCA)材料制成的塑料卡內(nèi)嵌入式處理器和存儲(chǔ)器等IC 芯片的數(shù)據(jù)卡。近年來(lái),由于導(dǎo)半體技術(shù)的進(jìn)步,集成化程度和存儲(chǔ)器容量有了很大提高,并使CPU 和存儲(chǔ)器集成在一個(gè)芯片上,從而提高了數(shù)據(jù)的安全性。在本設(shè)計(jì)中,IC 卡采用的是AT45DB041B-SC 芯片,該芯片的特點(diǎn)如一下:*單一的2.7V~3.6V 電源;*串行接口結(jié)構(gòu);*頁(yè)面編程操作,單一的循環(huán)重復(fù)編程(擦除和編程,2048 頁(yè)(每頁(yè)264 字節(jié))主存;*兩個(gè)264 字節(jié)的SRAM 數(shù)據(jù)緩存,允許在重編程非易失性存儲(chǔ)器時(shí)接收數(shù)據(jù);*內(nèi)置的編程和控制定時(shí)器;*低功耗,4mA 有源讀取電流,2μA CMOS 備用電流;*15MHz 的最大時(shí)鐘頻率;*串行外圍接口方式(SPI)——模式0 和3;*CMOS 的TTL 兼容的輸入和輸出;*5.0V 可承受的輸入,SI、SCK、CS(低電平有效)、RESET(低電平有效)。在本設(shè)計(jì)的調(diào)試過(guò)程中,曾測(cè)試過(guò)IC 卡的輸入輸出電平,結(jié)果證明這種IC 卡的輸入電平與TTL 兼容,而輸出電平與TTL 不兼容。4 IC 卡的電源提供電路在本設(shè)計(jì)中,由于IC 卡的電源電壓范圍為+2.7~+3.6V,而PIC 單片機(jī)需要的電源為+5V,而且穩(wěn)壓源提供的電壓也是+5V,因此,要設(shè)計(jì)一個(gè)穩(wěn)壓模塊,給IC 卡提供+3V 左右的電壓。設(shè)計(jì)電路如圖3 所示。該電路的主要元件為L(zhǎng)M317 芯片,它是三端可調(diào)集成穩(wěn)壓器,輸出電壓為1.25~37V 范圍內(nèi)可調(diào)。當(dāng)其Vin 端的輸入電壓在2~40V 范圍內(nèi)變化時(shí),電路均能正常工作,輸出端Vout 和調(diào)整端ADJ 間的電壓等于基準(zhǔn)電壓1.25V。該芯片內(nèi)的基電路的工作電流IREF 很小,約為50μA,由一個(gè)恒流性很好的恒流源提供,所以它的大小不受供電電壓的影響,非常穩(wěn)定。在圖3 中,B 點(diǎn)為電壓輸出端,為IC 卡提供電壓。A點(diǎn)為控制端,與單片機(jī)的一個(gè)端口引腳相連,當(dāng)該引腳為低電平時(shí),三極管Q1 不工作,B 點(diǎn)輸出電壓約為3.15V;當(dāng)該引腳為高電平時(shí),三極管Q1 工作,B 點(diǎn)輸出電壓約為1.25V。在程序中查詢IC 卡插座中是否有IC 卡,當(dāng)有IC 卡時(shí),將A 點(diǎn)所連的單片機(jī)引腳設(shè)置為低電平,從而為IC 卡提供電源;當(dāng)沒(méi)有IC 卡或?qū)C 卡的操作結(jié)束時(shí),將A 點(diǎn)連的單片機(jī)引腳設(shè)置為高電平,從而不給IC 卡提供電源。IC 卡的上電和下電程序如下。IC 卡上電子程序 IC 卡下電子程序POWERON POWEROOFBSF STATUS,RP0 BSFSTATUS,RP0BCF TRISE,0 BCF TRISE,0BCF RTISE,1 BCF TRISE,1BCF STATUS,RP0 BCF STATUS,RP0BCF PORTE,0 BSF PORTE,0BCF PORTE,1 BSF PORTE,1CALL DLYTIM CALL DLYTIMRETURN RETURN在本設(shè)計(jì)中,單片機(jī)與IC 卡通信的主程序流程圖如圖4 所示。5 與PC 機(jī)的通信在本設(shè)計(jì)中,有PIC 單片機(jī)與PC 機(jī)串行通信的功能。由于本設(shè)計(jì)所用的單片機(jī)PIC16F877 有USART方式,該方式可將C 口的RC5 和RC7 設(shè)置成異步串行通信模式,因而在本設(shè)計(jì)中,與PC 機(jī)的通信模塊電路就比較簡(jiǎn)單。將單片機(jī)C 口的RC6 和RC7 設(shè)置為異步串行通信模式,經(jīng)過(guò)MAX232A 芯片進(jìn)行電平轉(zhuǎn)換后,將TTL 電平轉(zhuǎn)換為RS232 電平,再與DB9 接口相連,即可實(shí)現(xiàn)通信。在PC 機(jī)端,可以用VC 等編程工具根據(jù)通信協(xié)議編寫(xiě)軟件來(lái)控制對(duì)IC 卡的讀寫(xiě)操作。6 結(jié)論經(jīng)過(guò)調(diào)試,本設(shè)計(jì)能夠在脫離在線仿真器的情況下,上電后獨(dú)立的運(yùn)行程序,并能在PC 機(jī)軟件的控制下,實(shí)現(xiàn)對(duì)IC 卡中任意位置的讀寫(xiě),其中讀寫(xiě)的起始地址、讀寫(xiě)數(shù)據(jù)的個(gè)數(shù)以及數(shù)據(jù)內(nèi)容可以在PC 機(jī)端輸入或選擇。本設(shè)計(jì)已在實(shí)際應(yīng)用中測(cè)試過(guò),具有實(shí)用價(jià)值。由于本設(shè)計(jì)中所使用的PIC 單片機(jī)的程序存儲(chǔ)器較大(8KB),因而可以編寫(xiě)較大的程序,實(shí)現(xiàn)多合一該卡器并由PC 機(jī)控制讀寫(xiě)哪種芯片的IC 卡。另外,由于本設(shè)計(jì)所使用單片機(jī)的程序存儲(chǔ)器是Flash 存儲(chǔ)器,因而可以方便地實(shí)現(xiàn)程序的下載和升級(jí)。
本文關(guān)鍵詞:?jiǎn)纹瑱C(jī),IC卡讀寫(xiě)器
上一篇:一種智能卡讀寫(xiě)器的設(shè)計(jì)與實(shí)現(xiàn)[ 10-20 ]
下一篇:低功耗射頻IC卡讀寫(xiě)器設(shè)計(jì)[ 10-20 ]