DSP與IC卡接口設(shè)計(jì)
摘 要: 本文給出兩種IC卡(存儲(chǔ)卡和智能卡)結(jié)構(gòu)、讀寫(xiě)操作以及與DSP接口設(shè)計(jì)。
關(guān)鍵詞: IC卡;存儲(chǔ)卡;智能卡;DSP
圖1 AT24C16SC結(jié)構(gòu)框圖
圖2 AT24C16SC時(shí)序圖
隨著社會(huì)信息化程度的提高,IC卡的使用越來(lái)越普遍。IC卡分為接觸式和非接觸式兩種。接觸式IC卡分為存儲(chǔ)卡和智能卡(又叫作CPU卡)。本文討論了如何使用DSP的GPIO(通用輸入輸出)接口實(shí)現(xiàn)與IC卡的通信。
圖3 寫(xiě)卡操作命令時(shí)序圖
圖4 讀卡操作命令時(shí)序圖
DSP和存儲(chǔ)卡接口
存儲(chǔ)卡只具有存儲(chǔ)功能,是一片串行的EEPROM。以AT24C16SC為例,支持3V和5V電源,存取速度可達(dá)100KHz(3V)和400KHz(5V);容量為16Kbit,分為128頁(yè)面;雙向數(shù)據(jù)線(SDA)為OD(Open Drain)驅(qū)動(dòng),需加上拉電阻方可實(shí)施通信。該芯片可擦寫(xiě)10萬(wàn)次,內(nèi)部數(shù)據(jù)可保持100年,具有3000V以上高壓保護(hù)。內(nèi)部結(jié)構(gòu)如圖1。
存儲(chǔ)卡訪問(wèn)時(shí)序?yàn)镮2C標(biāo)準(zhǔn)時(shí)序:在時(shí)鐘線(SCL)為低時(shí)通過(guò)SDA實(shí)施對(duì)芯片讀寫(xiě);當(dāng)SCL為高時(shí),SDA處于保持狀態(tài)(即數(shù)據(jù)有效期)。當(dāng)SCL為高時(shí),SDA的變化表示芯片處于不同狀態(tài):
● 開(kāi)始狀態(tài):當(dāng)SCL為高時(shí),SDA由高變低表示一個(gè)開(kāi)始狀態(tài),任何操作前均需一個(gè)開(kāi)始狀態(tài)。
● 停止?fàn)顟B(tài):當(dāng)SCL為高時(shí),SDA由低變高表示一個(gè)停止?fàn)顟B(tài),跟在每個(gè)操作后,將卡置于等待(Stand by)模式。
在讀寫(xiě)時(shí),地址和數(shù)據(jù)都是按照8bit的大小進(jìn)行傳輸,接收的一方需要返回一個(gè)ACK信號(hào)表示確認(rèn),這個(gè)ACK信號(hào)用在第9bit的位置返回一個(gè)‘0’來(lái)表示。在讀卡操作時(shí),DSP在收到8bit后,第9個(gè)clock時(shí)應(yīng)向卡發(fā)送‘0’,表示收到了正確的數(shù)據(jù)同時(shí)要求卡繼續(xù)發(fā)送下一組8bit數(shù)據(jù),如果沒(méi)有這個(gè)ACK信號(hào),則卡就會(huì)中止當(dāng)前讀操作返回等待模式。在寫(xiě)卡操作時(shí),卡收到DSP發(fā)送的地址和數(shù)據(jù)后也應(yīng)返回一個(gè)ACK信號(hào),表示收到了正確的命令。開(kāi)始和停止?fàn)顟B(tài)、確認(rèn)信號(hào)時(shí)序圖如圖2。
一個(gè)讀寫(xiě)操作的開(kāi)始需要先發(fā)送一個(gè)Device Address字節(jié),這個(gè)字節(jié)的高4bit是“1010”,接著3bit是卡的高位地址,比如AT24C16SC需要有11位地址(2K字節(jié)的大小),高3bit地址就是這里來(lái)指示,最后1bit是讀寫(xiě)控制bit,若為‘1’,則表示后面進(jìn)行一個(gè)讀操作,若為‘0’,則表示后面進(jìn)行一個(gè)寫(xiě)操作。
寫(xiě)卡操作分為字寫(xiě)和頁(yè)寫(xiě)。字寫(xiě)時(shí),當(dāng)發(fā)送完Device Address字節(jié)(最后1bit為‘0’)后,發(fā)送一個(gè)Word Address字節(jié)(卡的低8位地址),接著發(fā)送一個(gè)字節(jié)的數(shù)據(jù),最后發(fā)送停止?fàn)顟B(tài)。頁(yè)寫(xiě)時(shí),可連續(xù)發(fā)送16個(gè)字節(jié)數(shù)據(jù)后再發(fā)送停止?fàn)顟B(tài)位。需要注意的是頁(yè)寫(xiě)時(shí),低4位地址是卡內(nèi)部自增的,當(dāng)?shù)竭_(dá)頁(yè)末地址時(shí)會(huì)自動(dòng)返回頁(yè)首地址,所以要正確發(fā)送停止?fàn)顟B(tài),否則繼續(xù)寫(xiě)入的字節(jié)就會(huì)覆蓋原來(lái)的數(shù)據(jù)(命令時(shí)序圖見(jiàn)圖3)。
讀卡操作分為讀當(dāng)前地址、讀任意地址和順序讀三種方式。以讀任意地址為例,在發(fā)送完Device Address字節(jié)(最后1bit為‘1’指明讀操作)后,發(fā)送Word Address字節(jié),這一過(guò)程是要裝載要讀的地址,再發(fā)送一個(gè)Device Address字節(jié)(同樣最后1bit為‘1’指明讀操作),便可從卡讀取一個(gè)連續(xù)8bit數(shù)據(jù),最后發(fā)送停止?fàn)顟B(tài)(而不是ACK信號(hào))結(jié)束讀操作(命令時(shí)序圖見(jiàn)圖4)。
以上分析可見(jiàn),DSP與存儲(chǔ)卡接口的關(guān)鍵就是如何產(chǎn)生SCL和SDA時(shí)序。將DSP的GPIO接口分別與存儲(chǔ)卡的SCL、SDA連接。需要注意的是,因?yàn)镈SP的工作頻率很高,改變狀態(tài)之前需要插入等待周期。
寫(xiě)卡的函數(shù)編程實(shí)例從略(基于C5409)。
圖5 智能卡的復(fù)位應(yīng)答
圖6智能卡的訪問(wèn)時(shí)序
DSP與智能卡接口
智能卡內(nèi)部有CPU、ROM、RAM、EEPROM等資源,卡內(nèi)駐有智能卡操作系統(tǒng)(COS),實(shí)施對(duì)卡的管理和維護(hù)。因?yàn)榭▋?nèi)有CPU和RAM,可根據(jù)需要進(jìn)行一些運(yùn)算和數(shù)據(jù)加密,卡內(nèi)EEPOM用于存放用戶資料(容量也較存儲(chǔ)卡大)。智能卡較存儲(chǔ)卡功能更強(qiáng),更安全(數(shù)據(jù)都受到加密保護(hù)),因而應(yīng)用面更廣,價(jià)格也比存儲(chǔ)卡高。
智能卡的操作遵循ISO7816-3規(guī)范,通信時(shí)序類似于雙向RS-232通信協(xié)議。操作前需要對(duì)卡進(jìn)行激活,激活的步驟為:VCC供電、RST為低、I/O設(shè)為輸入、提供CLK;之后對(duì)卡進(jìn)行復(fù)位,復(fù)位分為冷復(fù)位和熱復(fù)位,兩者區(qū)別在于冷復(fù)位時(shí)RST由低變高,而熱復(fù)位時(shí)RST由高變低再變高。復(fù)位后,卡應(yīng)發(fā)出復(fù)位應(yīng)答;DSP接收到卡的復(fù)位應(yīng)答后,便可向卡發(fā)送指令。取卡前需要進(jìn)行“釋放”,步驟順序與激活相反:RST變低,CLK變低,VCC掉電。
卡的復(fù)位應(yīng)答信息的組成如圖5。
TS:初始化字節(jié),用來(lái)進(jìn)行bit同步和指示后續(xù)通信的編碼方式,例如0x3f表示反碼編碼,0x3b表示正常編碼;
T0:格式字節(jié),高4個(gè)bit用來(lái)指示是否傳輸TA1、TB1、TC1、TD1,低4個(gè)bit用來(lái)指示有多少個(gè)歷史字符;
TAi、TBi、TCi:接口字節(jié),用來(lái)設(shè)置操作的一些參數(shù),比如速率,保護(hù)時(shí)間,編程電壓等;
TDi:接口字節(jié),高4bit用來(lái)指示是否傳輸TAi+1、TBi+1、TCi+1,低4個(gè)bit用來(lái)指示傳輸類型T。T=0,字符半雙工模式;T=1,塊半雙工模式,其他的T值保留。我們常用T=0即字符模式;
T1_TK:歷史字符,由制卡商提供;
TCK:校驗(yàn)位,是T0_TK所有字節(jié)的異或,T=0時(shí)不傳此字節(jié)。
訪問(wèn)卡的時(shí)序如圖6所示。
可以看出,1個(gè)字節(jié)幀由13位組成,包括1個(gè)起始位、8個(gè)數(shù)據(jù)位、1個(gè)校驗(yàn)位、2個(gè)保護(hù)時(shí)間位。在外部提供時(shí)鐘方式(常用方式)下,圖6中每個(gè)位占的時(shí)間間隔(ETU)默認(rèn)為外部時(shí)鐘周期的372倍。例如,外部時(shí)鐘為3.57MHz時(shí),位的間隔是9600,相當(dāng)于速率為9600。保護(hù)時(shí)間最長(zhǎng)可以為外部時(shí)鐘周期的254倍。
DSP與智能卡的連接跟存儲(chǔ)卡不同,RST引腳用來(lái)對(duì)卡內(nèi)CPU復(fù)位,可與DSP一個(gè)GPIO連接;智能卡的CLK為卡內(nèi)CPU工作時(shí)鐘,速度高(1MHz~5MHz),要求穩(wěn)定,用DSP的GPIO產(chǎn)生這樣的時(shí)鐘不可能。通常使用DSP一個(gè)串口McBSP發(fā)送的時(shí)鐘CLKX作為智能卡的時(shí)鐘。與存儲(chǔ)卡相同,DSP的一個(gè)GPIO與智能卡I/O相連。I/O是雙向,需要正確設(shè)置DSP的GPIO方向,且有精確的速率要求的,即為CLK速率的1/372,可以采用DSP內(nèi)部定時(shí)器產(chǎn)生。
讀卡函數(shù)編程實(shí)例從略(基于C5409)?!?
參考文獻(xiàn):
1. TMS320C54x DSP Reference Set:Enhanced Periherals,Texas Instruments,1999
2. TMS320C54x DSP Reference Set:CPU and Periherals,Texas Instruments,2001
3. AT24C16SC:2-Wire EEPROM Card Module,Atmel,2000