//ATR = 3B FF 18 35 FF B1 11 66 F1 FE 4D 00 1F C7 00 31 38 64 47 90 EC C2 73 14 01 50 82 90 00 C1

//--ATR 总长 0x1E(30) 字节

//复位应答信号以字符为单位(称为字符帧)进行传送

//

//----在传送字符前,I/O处于Z状态

//----每个字符由10位组成,起始位(1位)状态为A

//--------8位数据位ba ~ bh, 第10位bi为偶校验

//----复位应答期间,1etu = 372个clock

//----一个数据字节由b1-b8组成,b1为LSB,b8为MSB。接收方在每一位的中间采样,采样时间应该小于0.2etu。

//----两连续字符之间的延时(两起始位下降沿之间)至少为12个etu,包括字符宽度10(+/-0.2)个etu和一段保护时间。

//----两连续字符之间的延时(两起始位下降沿之间)最大不超过9600个etu,这个最大值称为

//----------初始等待时间。

//----在保护时间内,读卡器和卡都处于接收状态,I/O线处于状态Z。

//----发送方在下降沿开始后的第11个etu处检查I/O状态,

//--------当奇偶校验不正确时,从起始位下降沿之后的10.5个etu开始,

//--------接收方发送状态A做为出错信息,该信号宽度为1-2个etu。

//--------如果发送方检查I/O状态为Z,则表示接收是正确的,反之则认为是错误的,

//--------接收方希望重新发送此字节。

//--------对于T=0的卡必须重发,对于其他卡是可以选择的

//------------------------------------------------------------

//----------<<<在TS之后发送的字符数不超过32个,复位应答格式如下>>>

//--         - T0 ................... Format character       (Mandatory) 

//--         - TAi, TBi, TCi, TDi ... Interface characters   (Optional)  

//--         - T1, T2, ... ,TK ...... Historical characters  (Optional)  

//--         - TCK .................. Check character        (Conditional)

//

//--     TS  : Initial character     

//--     TO  : Format character

//--     TAi : Interface character [ codes FI,DI ] 

//--     TBi : Interface character [ codes II,PI1 ]

//--     TCi : Interface character [ codes N ]     

//--     TDi : Interface character [ codes Yi+1, T ]

//--     T1, ... , TK : Historical characters (max,15)    

//--     TCK : Check character

//--------------------------------------------------------------------------------

//TS( The Initial character )         = 3B

//

//--- 正向约定:Z表示1,A表示0,传输时先传输LSB,则TS应该是

//----(Z)AZZAZZZAAZ,0 1 1 0 1 1 1 0 0 1  即16进制数3B

//----bd, be, bf为ZZZ。

//--- 反向约定:Z表示0,A表示1,传输时先传输MSB,则TS应该是

//----(Z)AZZAAAAAAZ,1 0 0 1 1 1 1 1 1 0  即16进制数3F

//----bd, be, bf为AAA。

//----此字节表示 正向约定,高电平为1,低电平为0,传输时先传输LSB,最后传输MSB

//--------------------------------------------------------------------------------

//T0( The Format character )          = FF

//--

//--Y1 : 接口字符是否存在的指示符

//--       b4 = 1,发送TA1

//--       b5 = 1,发送TB1

//--       b6 = 1,发送TC1

//--       b7 = 1,发送TD1

//--K : 历史字节数(0~15)   

//--            格式字符     T0 提供的信息

//--T0表示接口字符的个数和历史字节的数量

//----其高4位有几个bit为1,则表示后续有几个接口字符,其低4位表示有多少个历史字节(0-15)

//--------高4位 = F(  1 1 1 1  )表示后续字符中存在  TA1 TB1 TC1 TD1

//--------------------( TA1, TB1, TC1, TA2, TB2 是全局接口字符,TC2是专用接口字符 )

//----低4位 = F,表示后面有15个历史字节

//--------------------------------------------------------------------------------

//TA1                                 = 18

//----表示有增强的波特率,公式 "baudrate = f / ( F / D )"

//------其中,f是读卡器提供的时钟,常用 f = 3571200(单位HZ)

//--------F由TA1的高4位(FI)查表得出,D由TA1的低4位(DI)查表得出

//----FI = 01 ,查下表,则F = 372

//------

//----DI = 08 ,查下表,则D = 12

//------

//----复位之后推荐波特率为 115200

//--------------------------------------------------------------------------------

//TB1                                 = 35

//----TB1现在已经废除,在早期规范中其bit 6-0 用来表示卡片编程电压和电流

//------在2006版之后,如果出现TB1,其值应该为0,表示该卡不使用专用触点 C6 来提供编程电压

//------TB1的最高位应该为0,若不为0,应该视为0

//----TB1 bit 6, 5(base 0)指定最大编程电流因子 I

//--------bit 4-0(base 0)最大编程电压因子 P,定义了VPP的工作状态

//------

//--------bit 6, 5 = 1(  0 1  )

//--------bit 4-0 = 15(  1 0 1 0 1  )( 21 )

//----编程电压为 10.2 V(出现TB2,由TB2指出),电流为 50 毫安

//--------------------------------------------------------------------------------

//TC1                                 = FF

//----指示出额外保护时间N

//------额外保护时间是两个字符发送的起始下降沿之间的最小间隔

//--------N = 255(0xFF),额外保护时间EGT = 11 etu

//--------------------------------------------------------------------------------

//TD1                                 = B1

//--TD1 : 高4位是后续接口字符是否存在的指示器

//--       b4 = 1,发送TA2

//--       b5 = 1,发送TB2

//--       b6 = 1,发送TC2

//--       b7 = 1,发送TD2

//--    低4位是通讯协议

//--           TD1 提供的信息

//--------高4位 = B(  1 0 1 1  ),表示后续字符中存在  TA2 TB2 TD2

//--------低4位 = 1,表示通讯协议是T = 1

//--------------------------------------------------------------------------------

//TA2                                 = 11

//---------- 二进制  0 0 0 1 0 0 0 1

//--TA2存在,表明卡处于专用模式

//----TA2的 bit 7( based 0 )为0,则表明卡片有更改模式的能力

//----TA2的 bit 4( based 0 )为1,则使用事先约定的F,D

//----低4位表示使用的协议 T = 1

//----专用模式,卡片有更改模式的能力,使用默认的通讯速率,通讯协议 T = 01

//--------------------------------------------------------------------------------

//TB2                                 = 66

//----TB2是全局参数,自2006版以来已经废除,如果存在TB2,应该忽略

//------在1997版中,TB2取值应该在50-250之间(更早的版本中TB2不存在)

//------以0.1V的精度取代TB1的编程电压

//----编程电压为 10.2 V

//--------------------------------------------------------------------------------

//TD2                                 = F1

//--TD2 : 高4位是后续接口字符是否存在的指示器

//--       b4 = 1,发送TA3

//--       b5 = 1,发送TB3

//--       b6 = 1,发送TC3

//--       b7 = 1,发送TD3

//--    低4位是通讯协议

//--           TD2 提供的信息

//--------高4位 = F(  1 1 1 1  ),表示后续字符中存在  TA3 TB3 TC3 TD3

//--------低4位 = 1,表示通讯协议是T = 1

//--------------------------------------------------------------------------------

//TA3                                 = FE

//----TA3指示了卡端信息字段长度(IFSC)

//------IFSC是T = 1协议下,卡片接收数据域的最大长度

//------TA3在 01 - FE 之间有效,00 和 FF保留

//--------

//----T = 1协议下信息域的最大长度是 254

//--------------------------------------------------------------------------------

//TB3                                 = 4D

//----TB3 指示了T = 1协议下,BWI和CWI的值

//------高4位是BWI,低4位是CWI

//--------BWI是块传输中,两个块之间最大的等待参数

//----------BWI默认值为4(有效值0-9)

//----------BWT = 11 etu + ( 2^BWI * 960 * Fd / f )

//------------当前BWI = 4(0x04)

//--------------Fd = 1, 表示 372 个clock

//--------------一个etu = 31.0 个clock

//----块等待时间BWT = 11 + ( 2^4 * 960 * 372 ) / 31.0 = 184331.0 个etu

//--------CWI是块传输中,块内两个字符之间最大的等待参数

//----------CWI默认值为13(有效值0-15)

//----------CWT = (11 + 2^CWI) etu

//------------当前CWI = 13(0x0D)

//----块内字符等待时间CWT = 11 + 2^13 = 8203 个etu

//--------------------------------------------------------------------------------

//TC3                                 = 00

//----T = 1块传输块校验机制

//------LRC 纵向冗余校验

//--------从NAD到LRC所有字节异或运算时结果应该为0

//------CRC 循环冗余校验

//--------见 ISO/IEC 13239

//----校验方式为 LRC 纵向冗余校验

//--------------------------------------------------------------------------------

//TD3                                 = 1F

//--TD3 : 高4位是后续接口字符是否存在的指示器

//--       b4 = 1,发送TA4

//--       b5 = 1,发送TB4

//--       b6 = 1,发送TC4

//--       b7 = 1,发送TD4

//--    低4位是通讯协议

//--           TD3 提供的信息

//--------高4位 = 1(  0 0 0 1  ),表示后续字符中存在  TA4

//--------低4位 = F,表示通讯协议是T = 15, T = 15不属于传输协议,仅指明了全局接口字节的类型

//--------------------------------------------------------------------------------

//TA4                                 = C7

//----TA4是T = 15时,用于指出 时钟停止 以及 卡片电压支持 的参数

//------

//------

//----------二进制 = 1 1 0 0 0 1 1 1

//----bit 7,6 = 11,时钟停止无优先级

//----bit 5-0 = 7,支持A, B 和 C类(5.0V, 3.0V, 1.8V)

//--------------------------------------------------------------------------------

//00 31 38 64 47 90 EC C2 73 14 01 50 82 90 00

//----是历史字节

//----类型指示符编码   = 00

//------压缩TLV数据对象

//----------31 --- Tag: 3, Len: 1(卡片服务数据字节card service data byte)

//------------卡片服务数据字节Card service data byte: 38

//--------------bit 5 = 1, EF.DIR中支持BER-TLV数据对象

//--------------bit 4 = 1, EF.ATR中支持BER-TLV数据对象

//--------------EF.DIR 和 EF.ATR 访问服务:

//----------------bit 3-1 = 100, 使用 READ BINARY 命令

//--------------bit 0 = 0, 卡片有MF

//----------64 --- Tag: 6, Len: 4(预发数据pre-issuing data)

//------------数据: 47 90 EC C2 "G退숀"

//----------73 --- Tag: 7, Len: 3(卡片能力card capabilities)

//------------选择方法: 14

//--------------bit 4 = 1, 支持使用FILE ID选择DF

//--------------bit 2 = 1, 支持短文件标识

//------------数据编码字节: 01

//--------------Write功能行为:

//----------------bit 6,5 = 00, 一次性写入

//--------------BER-TLV第一个tag字节为FF:

//----------------合法

//--------------Data unit in quartets: 1

//------------命令链,数据域长度和逻辑通道: 50

//--------------bit 6 = 1, 扩展LC和LE

//--------------逻辑通道分配:

//----------------bit 4,3 = 10, 由卡决定

//--------------最大逻辑通道数: 1

//----------必备的状态指纹器(至少3字节)

//------------LCS (卡片生命周期-life card cycle): 82

//--------------专有的

//------------状态码: 90 00

//--------------90 00 是返回状态,表示--- 成功

//--------------------------------------------------------------------------------

//TCK                                 = C1

//--TCK值正确