激活时序
在激活过程结束(接口设备中 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 | 校验字符 |
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编码如下:
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:(没有意义了)
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