激活時(shí)序
在激活過(guò)程結(jié)束(接口設(shè)備中 RST 處于 L 狀態(tài),VCC 上電柠贤,I/O 進(jìn)入接收模式香浩,CLK 已被提供了一個(gè)匹配并穩(wěn)定的時(shí)鐘信號(hào))時(shí),卡片已就緒臼勉,可以進(jìn)行冷復(fù)位邻吭。卡片在冷復(fù)位之前的內(nèi)部狀態(tài)不做規(guī)定宴霸。
根據(jù)圖 1囱晴,在 Ta 時(shí)間點(diǎn)上時(shí)鐘信號(hào)應(yīng)用于 CLK∑靶唬卡片應(yīng)當(dāng)在時(shí)鐘信號(hào)應(yīng)用于 CLK(在 Ta+ta 時(shí)間點(diǎn))之后的 200 個(gè)時(shí)鐘周期(ta時(shí)延)內(nèi)將 I/O 設(shè)置為 H 狀態(tài)畸写。冷復(fù)位是在時(shí)鐘信號(hào)應(yīng)用于CLK(在 Ta+tb 時(shí)間點(diǎn))之后,將 RST 維持至少 400 個(gè)時(shí)鐘周期(tb 時(shí)延)的結(jié)果氓扛。接口設(shè)備應(yīng)當(dāng)在 RST 處于 L 狀態(tài)時(shí)忽略 I/O 上的狀態(tài)枯芬。
在 Tb 時(shí)間點(diǎn)上,RST 被置為 H 狀態(tài)采郎。I/O 上的應(yīng)答應(yīng)當(dāng)在 RST 上信號(hào)上升沿后(在 Tb+tc時(shí)間點(diǎn))的 400 和 40000 個(gè)時(shí)鐘周期之間(tc 時(shí)延)開始千所。如果應(yīng)答沒(méi)有在 RST 處于 H 狀態(tài)后 40000個(gè)時(shí)鐘周期內(nèi)開始,接口設(shè)備應(yīng)當(dāng)執(zhí)行一個(gè)去激活蒜埋。
void SIM_Cold_Reset(uint8_t ChannelID)
{
Set_Sim_Io(ChannelID, SIM_VCC, 1); //初始時(shí)淫痰,電源電壓先上電
Delay_400_CLK(); //待電壓穩(wěn)定
Set_SimData_Direction(ChannelID, 1); //將I/O端口置為接收方式
Set_SimClk_Status(ChannelID, 1); //啟動(dòng)獨(dú)立波特率發(fā)生器開始計(jì)數(shù)工作,對(duì)系統(tǒng)時(shí)鐘進(jìn)行分頻輸出
Delay_400_CLK(); //RST復(fù)位信號(hào)需在提供CLK信號(hào)后400個(gè)時(shí)鐘周期內(nèi)保持低電平
Set_Sim_Io(ChannelID, SIM_RST, 1); //之后才可置為高電平
}
以4M的時(shí)鐘為基準(zhǔn)整份,一個(gè)時(shí)鐘為1/4us黑界,則400個(gè)時(shí)鐘用100us,40000個(gè)時(shí)鐘為10ms皂林。
ATR基本應(yīng)答數(shù)據(jù)如下
數(shù)據(jù)元 | 說(shuō)明 |
---|---|
TS | 起始字符 |
T0 | 格式字符 |
TA1,TB1蚯撩,TC1础倍,TD1,... | 接口字符 |
T1胎挎,T2沟启,... ,TK | 歷史字符 |
TCK | 校驗(yàn)字符 |
下面以ATR:3B9F94801FC78031E073FE21135758485553494D01F9
為例犹菇,進(jìn)行說(shuō)明
數(shù)據(jù)元 | 說(shuō)明 |
---|---|
TS | 起始字符 |
T0 | 格式字符 |
TA1德迹,TB1,TC1揭芍,TD1胳搞,... | 接口字符 |
T1,T2,... 肌毅,TK | 歷史字符 |
TCK | 校驗(yàn)字符 |
1.起始字符TS
TS是ATR的強(qiáng)制部分筷转,總是必須送出的。此字節(jié)只允許有兩種編碼:3B為正向約定悬而,3F為反向約定呜舒。使用反向邏輯約定時(shí), I/O的低電平狀態(tài)等效于邏輯1笨奠,且該數(shù)據(jù)字節(jié)的最高位在起始位之后首先發(fā)送袭蝗。使用正向邏輯約定時(shí), I/O的高電平狀態(tài)等效于邏輯1般婆,且該數(shù)據(jù)字節(jié)的最低位在起始位之后首先發(fā)送到腥。
上例ATR的TS為3B
2.格式字符T0
格式字符T0含有一組位表明將要傳送哪個(gè)接口字符,它同時(shí)也指出后繼歷史字符的個(gè)數(shù)腺兴。像TS一樣左电,每個(gè)ATR中都必須有這個(gè)字節(jié)。
高半字節(jié)( b5-b8) 表示后續(xù)字符TA1到TD1是否存在页响。(b5對(duì)應(yīng)TA1篓足,b8對(duì)應(yīng)TD1);
低半字節(jié)( b1-b4) 表明可選歷史字符的數(shù)目( 0到15)闰蚕;
上例ATR的T0為9F
表明存在TA1和TD1栈拖,歷史字符為15個(gè)。
當(dāng)沒(méi)有TD1時(shí)没陡,T=0涩哟,則TCK不存在。
3.接口字符TA1盼玄,TB1贴彼,TC1,TD1埃儿,...
這些字節(jié)在ATR中是可選的器仗,由格式字符T0的高半字節(jié)決定。
3.1 全局接口字符TA1
TA1高半字節(jié) FI 用于確定 F 的值童番, F 為時(shí)鐘速率轉(zhuǎn)換因子精钮。用于修改復(fù)位應(yīng)答之后終端所提供的時(shí)鐘頻率。低半字節(jié) DI 用于確定 D 的值剃斧, D 為位速率調(diào)節(jié)因子轨香。用于調(diào)整復(fù)位應(yīng)答之后所使用的位持續(xù)時(shí)間。etu =F/D * (1/f)
FI和DI編碼如下:
FI | F | DI | D |
---|---|---|---|
0000 | 372 | 0000 | RFU |
0001 | 372 | 0001 | 1 |
0010 | 558 | 0010 | 2 |
0011 | 744 | 0011 | 4 |
0100 | 1116 | 0100 | 8 |
0101 | 1488 | 0101 | 16 |
0110 | 1860 | 0110 | 32 |
0111 | RFU | 0111 | RFU |
1000 | RFU | 1000 | 12 |
1001 | 512 | 1001 | 20 |
1010 | 768 | 1010 | RFU |
1011 | 1024 | 1011 | RFU |
1100 | 1536 | 1100 | RFU |
1101 | 2048 | 1101 | RFU |
1110 | RFU | 1110 | RFU |
1111 | RFU | 1111 | RFU |
上例ATR的TA1為94
表明F=512幼东,D=8臂容。
3.2 全局接口字符TB1:(沒(méi)有意義了)
TB1傳送PI1和II的值科雳,PI1 在 b1 到 b5 位中定義,用于確定IC卡所需的編程電壓 P 值策橘;II 在 b6 和 b7位中定義炸渡,用于確定IC卡所需的最大編程電流I值。一般情況下ATR中必須包含TB1=00丽已,表示IC卡不使用VPP蚌堵。
上例ATR的TB1為空
3.2 全局接口字符TC1:(沒(méi)有意義了)
上例ATR的TC1為空
3.2 全局接口字符TD1
TD1字符比較關(guān)鍵,看上面的ATR數(shù)據(jù)結(jié)構(gòu)圖可知沛婴,TD1的高4位決定了是否有TA2/TB2/TC2/TD2吼畏。
同理,TD2的高4位決定了是否有TA3/TB3/TC3/TD3嘁灯。
上例ATR的TD1為80泻蚊,
可表明存在TD2=1F,TA2丑婿、TB2性雄、TC2不存在
上例ATR的TD2為1F,
可表明存在TA3=C7羹奉,TB3秒旋、TC3、TD3不存在
4.歷史字符
很長(zhǎng)一段時(shí)間诀拭,沒(méi)有任何標(biāo)準(zhǔn)對(duì)歷史字符做出規(guī)定迁筛,結(jié)果是隨操作系統(tǒng)生產(chǎn)者而不同,它們包含了變化廣泛的數(shù)據(jù)耕挨。
上例ATR的歷史字符為
8031E073FE21135758485553494D01细卧。
5.校驗(yàn)字符TCK
TCK具有一個(gè)檢驗(yàn)復(fù)位應(yīng)答期間所發(fā)送數(shù)據(jù)完整性的值。TCK的值應(yīng)使從T0到包括TCK在內(nèi)的所有字節(jié)進(jìn)行異或運(yùn)算的結(jié)果為零筒占。
當(dāng)沒(méi)有TD1時(shí)贪庙,T=0,則TCK不存在翰苫。
如果在ATR中僅指出了T=0協(xié)議插勤,TCK校驗(yàn)和可以不在ATR的尾部出現(xiàn)。在這種情況下革骨,完全沒(méi)有發(fā)送它,因?yàn)橛闷媾夹r?yàn)已經(jīng)知道了差錯(cuò)字節(jié)而在T=0協(xié)議中重復(fù)發(fā)送出錯(cuò)字節(jié)又是強(qiáng)制性的析恋。相反良哲,在T=1協(xié)議中,TCK字節(jié)必須出現(xiàn)助隧,校驗(yàn)和的計(jì)算從字節(jié)T0開始筑凫,結(jié)束于最后的接口字符滑沧,如果有則是最后的歷史字符。
上例ATR的TCK為F9巍实,
將9F94801FC78031E073FE21135758485553494D01進(jìn)行異或處理即可得到F9
for(atrCount = 1; atrCount <21; atrCount++)
{
printf("atrXOR_old:%X,atr:%X\n",atrXOR,atr[atrCount]);
atrXOR ^= atr[atrCount];
printf("atrXOR_new:%X\n",atrXOR);
}
該ATR的解析如下:
ATR:3B9F94801FC78031E073FE21135758485553494D01F9
ATR分析:
正向約定 F=512 D=8 N=0(d)
Protocal=TO
AtrBinarySize=22
AtrHistorySize=15
AtrHistorySize=8031E073FE21135758485553494D01
31:卡片數(shù)據(jù)服務(wù)
E0:通過(guò)全DF名稱的直接應(yīng)用選擇滓技、通過(guò)部分DF名稱的選擇數(shù)據(jù)對(duì)象在DIR文件中有效
73:卡能力標(biāo)簽
FE:DF選擇(通過(guò)全DF名稱、通過(guò)部分DF名稱棚潦、通過(guò)路徑令漂、通過(guò)文件標(biāo)識(shí))
EF管理(所支持的短EF標(biāo)識(shí)符、所支持的記錄號(hào))
21:數(shù)據(jù)編碼類型
13:邏輯通道最大數(shù)4
TS=3B
T0=9F
TA1=94
TD1=80
TD2=1F
TA3=C7(時(shí)鐘停止休止符:無(wú)優(yōu)先 級(jí)別指示符:A丸边、B叠必、和C)
TCK=F9
參考
http://www.cnblogs.com/utank/p/5463269.html
http://www.cnblogs.com/utank/p/5545750.html
http://blog.csdn.net/daidi1989/article/details/49883207
http://blog.csdn.net/u013566722/article/details/49306505