void SIM_Cold_Reset(uint8_t ChannelID)
Set_Sim_Io(ChannelID, SIM_VCC, 1);
Delay_400_CLK();
Set_SimData_Direction(ChannelID, 1);
Set_SimClk_Status(ChannelID, 1);
Delay_400_CLK();
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
激活时序在激活过程结束(接口设备中 RST 处于 L 状态,VCC 上电,I/O 进入接收模式,CLK 已被提供了一个匹配并稳定的时钟信号)时,卡片已就绪,可以进行冷复位。卡片在冷复位之前的内部状态不做规定。根据图 1,在 Ta 时间点上时钟信号应用于 CLK。卡片应当在时钟信号应用于 CLK(在 Ta+ta 时间点)之后的 200 个时钟周期(ta时延)内将 I/O 设置为 H 状态...
f8 T0 Y1 = 0xF(TA1, TB1, TC1, TD1), K = 8
13 TA1 F = 0x1(Fi = 372, Fmax = 5MHz), D = 0x3(Di = 4)
00 TB1 deprecated
00 TC1 N = 0, extra guard time integer
81 TD1 Y2 =
SIM卡检卡是在modem 侧完成的。modem在初始化时会去做
SIM卡的初始化,包括检卡动作。
1>先给
SIM卡上电(会先上1.8v,如果检卡失败会切换到3.0v);
2>
SIM controller拉动RST PIN;
3>
SIM 卡收到controller的RST后回复一串字符串,称为
ATR(answer to reset),
ATR里面包含了一些卡的信息;
4>
SIM driver收到卡回的
ATR后就可以跟卡进行通信了
SIM卡不识卡最常见的原因是硬件接触不好导致的。
智能卡无线小板相对于串口无线小板最大的不同是智能卡无线小板上的单片机要模仿真正的智能卡来发送和接收机顶盒的数据,这部分功能将直接决定整个无线GX系统的稳定性。
智能卡常用的通信协议有T0、T1和T14协议,关于这三种通信协议完整的介绍,在很多资料上都能找到,本文不再详细阐述,有兴趣的朋友可以查阅相关书籍。
本章节主要介绍BJST、YXTF、SMSX这三种智能卡的通信协议的关键技术和机顶盒智能卡
ISO7816 标准是个标准的半双工接口,本模块作为主设备,控制SIM卡的操作,SIM卡作为从设备只有在两种情况下产生应答信号:收到RST 信号后发送ATR、接到命令后应答。
因此,SIM 卡驱动模块作为主设备,主要完成两个操作:发送RST 等待ATR,发送命令并等待SIM 卡的应答。
TX, XMT, 发送transmit
RX, RCV, 接收Receive
ATR 解析工具。非常好用,而且解析详细。如下所示。
ATR: 3B 3D 94 00 80 67 AF 03 0F 05 78 0A 0E 83 3E 9F 16
Initial character:
TS = 3B --> Using Direct Convention
Format byte:
T0 = 3D
- Y1 = 03 --> Interface Bytes Transmitted: TA1 TB1
- K = 0D --> # Historical Bytes = 13
Interface bytes:
TA1 = 94
- Fi / Di = 512 / 8 : Baudrate at 3.5712 MHz = 55800 bps
TB1 = 00
- VPP is not electrically connected
Historical bytes: 80 67 AF 03 0F 05 78 0A 0E 83 3E 9F 16
IMSI国际移动用户识别码(International Mobile Subscriber Identification Number)是区别移动用户的标志,储存在
SIM卡中,可用于区别移动用户的有效信息。
IMSI是15位的十进制数,其结构为:MCC+MNC+MSIN
1.MCC
MCC(Mobile Country Code,移动国家码)MCC的资源由国际电联(ITU)统一分配和管理,唯一...
PLMN(Public Land Mobile Network,公共陆地移动网络),由政府或它所批准的经营者,为公众提供陆地移动通信业务目的而建立和经营的网络,PLMN = MCC + MNC。
对于一个特定的终端来说,通常需要维护几种不同类型的PLMN列表,每个列表中会有多个PLMN。
RPLMN(Registered PLMN 已登记PLMN):已登记PLMN。是终端在上次关机或脱网前登...
SIM卡里面的内容跟我们平常电脑的文件管理系统类似,一个文件夹下面有文件夹也有文件,文件夹下面又有文件夹,一层接一层的嵌套,只不过SIM规范将这些文件进行了名字的定义,如MF/EF/DF/ADF…
如下先将几个专有名词进行解释:
MF(Master File)主文件
EF(Elementary File)基本文件
DF(Dedicated File)专用文件
ADF(Applica...
// Connect to the smart card
LONG rv = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
if (rv != SCARD_S_SUCCESS)
// Failed to establish context
// ...
rv = SCardConnect(hContext, _T("Your Card Reader"), SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
if (rv != SCARD_S_SUCCESS)
// Failed to connect to the card
// ...
// Get the ATR
rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, pbAtr, &dwAtrLen);
if (rv != SCARD_S_SUCCESS)
// Failed to get ATR
// ...
// Clean up
SCardDisconnect(hCard, SCARD_LEAVE_CARD);
SCardReleaseContext(hContext);
请替换代码中的“Your Card Reader”为您的智能卡读卡器名称。注意,您需要在代码中包含winscard.h头文件并将Winscard.lib链接到您的项目中。