1-SIM卡复位ATR解析

激活时序

image

在激活过程结束(接口设备中 RST 处于 L 状态,VCC 上电,I/O 进入接收模式,CLK 已被提供了一个匹配并稳定的时钟信号)时,卡片已就绪,可以进行冷复位。卡片在冷复位之前的内部状态不做规定。

根据图 1,在 Ta 时间点上时钟信号应用于 CLK。卡片应当在时钟信号应用于 CLK(在 Ta+ta 时间点)之后的 200 个时钟周期(ta时延)内将 I/O 设置为 H 状态。冷复位是在时钟信号应用于CLK(在 Ta+tb 时间点)之后,将 RST 维持至少 400 个时钟周期(tb 时延)的结果。接口设备应当在 RST 处于 L 状态时忽略 I/O 上的状态。

在 Tb 时间点上,RST 被置为 H 状态。I/O 上的应答应当在 RST 上信号上升沿后(在 Tb+tc时间点)的 400 和 40000 个时钟周期之间(tc 时延)开始。如果应答没有在 RST 处于 H 状态后 40000个时钟周期内开始,接口设备应当执行一个去激活。

void SIM_Cold_Reset(uint8_t ChannelID)
{
    Set_Sim_Io(ChannelID, SIM_VCC, 1);    //初始时,电源电压先上电             
    Delay_400_CLK();                      //待电压稳定
    Set_SimData_Direction(ChannelID, 1);  //将I/O端口置为接收方式
    Set_SimClk_Status(ChannelID, 1);      //启动独立波特率发生器开始计数工作,对系统时钟进行分频输出
    Delay_400_CLK();                      //RST复位信号需在提供CLK信号后400个时钟周期内保持低电平
    Set_Sim_Io(ChannelID, SIM_RST, 1);    //之后才可置为高电平
}

以4M的时钟为基准,一个时钟为1/4us,则400个时钟用100us,40000个时钟为10ms。

ATR基本应答数据如下

下面以ATR:3B9F94801FC78031E073FE21135758485553494D01F9为例,进行说明

数据元说明
TS起始字符
T0格式字符
TA1,TB1,TC1,TD1,…接口字符
T1,T2,… ,TK历史字符
TCK校验字符

ATR.jpg

1.起始字符TS

TS是ATR的强制部分,总是必须送出的。此字节只允许有两种编码:3B为正向约定,3F为反向约定。使用反向逻辑约定时, I/O的低电平状态等效于逻辑1,且该数据字节的最高位在起始位之后首先发送。使用正向逻辑约定时, I/O的高电平状态等效于逻辑1,且该数据字节的最低位在起始位之后首先发送。

上例ATR的TS为3B
2.格式字符T0

格式字符T0含有一组位表明将要传送哪个接口字符,它同时也指出后继历史字符的个数。像TS一样,每个ATR中都必须有这个字节。

高半字节( b5-b8) 表示后续字符TA1到TD1是否存在。(b5对应TA1,b8对应TD1);

低半字节( b1-b4) 表明可选历史字符的数目( 0到15);

上例ATR的T0为9F
表明存在TA1和TD1,历史字符为15个。

当没有TD1时,T=0,则TCK不存在。

3.接口字符TA1,TB1,TC1,TD1,…

这些字节在ATR中是可选的,由格式字符T0的高半字节决定。

3.1 全局接口字符TA1

TA1高半字节 FI 用于确定 F 的值, F 为时钟速率转换因子。用于修改复位应答之后终端所提供的时钟频率。低半字节 DI 用于确定 D 的值, D 为位速率调节因子。用于调整复位应答之后所使用的位持续时间。etu =F/D * (1/f)

FI和DI编码如下:

FIFDID
00003720000RFU
000137200011
001055800102
001174400114
0100111601008
01011488010116
01101860011032
0111RFU0111RFU
1000RFU100012
1001512100120
10107681010RFU
101110241011RFU
110015361100RFU
110120481101RFU
1110RFU1110RFU
1111RFU1111RFU
上例ATR的TA1为94
表明F=512,D=8
3.2 全局接口字符TB1:(没有意义了)

TB1传送PI1和II的值,PI1 在 b1 到 b5 位中定义,用于确定IC卡所需的编程电压 P 值;II 在 b6 和 b7位中定义,用于确定IC卡所需的最大编程电流I值。一般情况下ATR中必须包含TB1=00,表示IC卡不使用VPP。

上例ATR的TB1为空
3.2 全局接口字符TC1:(没有意义了)
上例ATR的TC1为空
3.2 全局接口字符TD1

TD1字符比较关键,看上面的ATR数据结构图可知,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.历史字符

很长一段时间,没有任何标准对历史字符做出规定,结果是随操作系统生产者而不同,它们包含了变化广泛的数据。

上例ATR的历史字符为
8031E073FE21135758485553494D01。
5.校验字符TCK

TCK具有一个检验复位应答期间所发送数据完整性的值。TCK的值应使从T0到包括TCK在内的所有字节进行异或运算的结果为零。

当没有TD1时,T=0,则TCK不存在。

如果在ATR中仅指出了T=0协议,TCK校验和可以不在ATR的尾部出现。在这种情况下,完全没有发送它,因为用奇偶校验已经知道了差错字节而在T=0协议中重复发送出错字节又是强制性的。相反,在T=1协议中,TCK字节必须出现,校验和的计算从字节T0开始,结束于最后的接口字符,如果有则是最后的历史字符。

上例ATR的TCK为F9,
将9F94801FC78031E073FE21135758485553494D01进行异或处理即可得到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:卡片数据服务
E0:通过全DF名称的直接应用选择、通过部分DF名称的选择数据对象在DIR文件中有效
73:卡能力标签
FE:DF选择(通过全DF名称、通过部分DF名称、通过路径、通过文件标识)
EF管理(所支持的短EF标识符、所支持的记录号)
21:数据编码类型
13:逻辑通道最大数4
TS=3B
T0=9F
TA1=94
TD1=80
TD2=1F
TA3=C7(时钟停止休止符:无优先 级别指示符: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值