摘要两种读写时序完全不同的IC卡在同一种系统中共存时,系统必须能够正确识别卡类型,然后才能按对应的读写时序对其读写。文章以AT88SC1604加密卡和SLE4442加密卡为典型样例,通过分析具体时序,给出获取卡型的方法及完整程序。
关键词AT88SC1604卡 SLE4442卡 卡型识别 程序设计
引言
随着国家“金卡工程”的不断发展,各种IC卡应用方案不断涌现。如预付费系统、门禁系统、保险系统等。在某一特定系统中,很可能不同用户对象使用两种不同IC卡。如本文设计的电能预付费系统中,管理员采集数据时,使用的是Atmel公司出品的大容量加密IC卡AT88SC1604;而普通用户使用的是Siemens公司出品的小容量预付费卡SLE4442。这两种卡的读写时序完全不同。这就需要系统在对IC卡读写之前,能够自动识别卡的类型,然后才能按照对应的时序对其读写。下面谈谈AT88SC1604卡与SLE4442卡在系统中的共存技术。
1IC卡简介
国际标准化组织针对IC卡在不同领域的不同应用,制定了IC卡应用时所应参考图1IC卡引脚或遵循的标准——ISO7816标准。然而该标准只严格定义了IC卡的物理特征及某些特定时序,预留了某些特性供不同厂家自己扩充。IC卡引脚示意如图1所示。
AT88SC1604卡为Atmel公司出品的大容量加密IC卡,内部有4个分区(分等分区卡和不等分区卡两种),每个分区均有独立的安全验证逻辑。整张卡还有一个总的验证逻辑。对于等分区卡,内部前三个分区每个分区的EEPROM容量为4096×1位,分区四的容量为3656×1位,EEPROM按位组织。SLE4442卡为Siemens公司出品的小容量加密IC卡,EEPROM容量为256×8位,按字节组织。二者引脚特性如表1所列。
图2SLE4442卡的命令帧格式AT88SC1604的FUS引脚为编程信号端,PGM为擦、写控制信号端。这是与SLE4442卡在硬件特性上的不同之处。
表1引脚特性
引脚号〖〗C1〖〗C2〖〗C3〖〗C4〖〗C5〖〗C6〖〗C7〖〗C8AT88SC1604〖〗VCC〖〗RST〖〗CLK〖〗N.C.〖〗GND〖〗N.C.〖〗I/O〖〗N.C.SLE4442〖〗VCC〖〗RST〖〗CLK〖〗FUS〖〗GND〖〗N.C.〖〗I/O〖〗PGM
2AT88SC1604卡与SLE4442卡时序分析
AT88SC1604与SLE4442卡均符合ISO78163规定的同步协议,也就是在时钟的下降沿后读取数据。对于AT88SC1604卡,某个地址读、写时,需要先设定其内部地址计数器到指定地址,然后才能开始对该地址读写。时钟信号的每个下降沿,都会令其内部地址计数器的值自动增1;每次的复位操作,都会令其内部的地址计数器归零。由于其内部地址计数器的值是不可读的,因此在对该卡读、写之前,必须先复位一次,才能确保让其内部的地址计数器到指定的地址。而SLE4442卡则无需繁琐的地址计数器。SLE4442工作在命令/响应模式,每帧命令为3字节。对其内部某个地址读、写时,3字节的指令包含了该地址信息。其命令帧格式如图2所示。其中Control字段为命令关键字,Address字段为地址信息,Data字段为写操作时的待写入数据。这一点与AT88SC1604卡是截然不同的。
因此,当对插入的IC卡进行读写之前,必须先得到卡类型,才能按照对应的时序对其读写。SLE4442卡的复位与应答(ATR: Answer To Reset)时序如图3所示。
从图2中可以看出,SLE4442卡在复位后,需要额外的32个脉冲。此时输出的32位数据为卡对复位的应答响应。
图3SLE4442卡ATR操作AT88SC1604卡的复位操作时序如图4所示。
图4AT88SC1604卡复位操作AT88SC1604卡在复位后,地址计数器被清零,内部第0单元的数据被送到数据线上。以后每个时钟的下降沿,地址计数器自动增1,同时该地址单元的数据自动图5IC卡接口电路被送到数据线上。按照SLE4442卡的ATR复位方式对卡复位,会令AT88SC1604卡复位的同时,其内部地址计数器的值提高到32。如果接着按SLE4442卡的读时序发送3字节读命令,会将AT88SC1604卡的位地址计数器提高到56(字节地址为7)。此时按照统一的读时序就可以读出此字节地址的值。对于AT88SC1604卡,此地址为发行者区(IZ);对SLE4442卡,此地址为厂商标识区(FZ)。若二者此地址的数据不同,则系统便能正确识别出该卡类型。这两个地址的数据出厂时可以根据需要定制,默认情况下AT88SC1604卡为0xFF,SLE4442卡为0x15。因此,可以按照读SLE4442卡的方式读第7字节地址。根据该地址的数据判断卡的类型。
3程序设计
系统IC卡接口电路如图5所示。
需要注意的一点是,IC卡在上电前,RST引脚必须保持低电平,上电后卡才会被“激活”。否则对于AT88SC1604卡,验证密码的操作将不会通过。
获取卡类型的程序如下:void ICReset (void)
{unsigned char i,ATRBuf\[4\];
IC_DAT=1;_nop_();_nop_();
/*释放数据口线*/
IC_RST=1;_nop_();_nop_();
IC_CLK=1;_nop_();_nop_();
IC_CLK=0;_nop_();_nop_();
IC_RST=0;_nop_();_nop_();/*复位操作结束*/
for(i=0;i<4;i++)
{ATRBuf\[i\]=ICReadByte ();
/*对于SLE4442卡,这是ATR操作*/
}
}
unsigned char ICReadByte (void)
{unsigned char i,RData=0;
IC_DAT=1;IC_CLK=0;_nop_();_nop_();
for(i=0;i<8;i++)
{RData<<=1;
RData =IC_DAT;
IC_CLK=1;_nop_();_nop_();IC_CLK=0;
}
return (DataInvert(RData));
/*将读出的数据逆序返回,为实际读取的数据*/
}
void ICSendCmd (unsigned char *CmdBuf)
{unsigned char i,j,ch;
IC_CLK=1;_nop_();_nop_();
IC_DAT=0;_nop_();_nop_();
IC_CLK=0;_nop_();_nop_();
/*IFD:SLE4442卡的启动条件*/
for(i=0;i<3;i++)
{ch=CmdBuf\[i\];
for(j=0;j<8;j++)
{IC_DAT=ch&0X01; /*输出数据到IC卡*/
IC_CLK=1;_nop_();_nop_(); IC_CLK=0;
ch>>=1;
}
}
IC_DAT=0;_nop_();_nop_();
IC_CLK=1;_nop_();_nop_();
IC_DAT=1;_nop_();_nop_();/*停止卡*/
}
unsigned charICGetCardType(void)
{unsigned char CmdBuf\[3\]={0x30,0x07,0xFF},ch,CardType=0;
ICReset (); /*发送32个脉冲*/
ICSendCmd (CmdBuf);/*发送24个脉冲*/
ch=ICReadByte (); /*读取该地址的值*/
switch(ch) {/*卡型判断*/
case0x15:CardType=CARD_TP_4442;
break;/*这是4442卡*/
case0xFF : CardType=CARD_TP_1604;
break;/*这是1604卡*/
default:break;
}
return CardType;/*返回卡类型编号*/
}
结语
通过分析两种卡读写时序的异同来编写控制程序,系统可以正确识别所插入IC卡的类型。之后,系统就可以分别按照相应的读写逻辑对其读写,达到了读写时序不同的两种卡在同一种系统中共存的目的。
参考文献
1于宏军,赵冬艳. 智能(IC)卡技术全书. 北京:电子工业出版社,1996
2Atmel. AT88SC1604 Datasheet
3Siemens. SLE4442 Datasheet
本文使用海纳锐利编辑并转载, 版权归原作者所有。
上一篇:基于CPLD的CCD采集系统设计
下一篇:485 现场总线施工的实际问题和解决办法
推荐阅读最新更新时间:2024-05-13 21:02
- 泰克示波器,朝第二个百万台销售纪录前进!
- 免费试用|是德科技加快信号完整性和电源完整性测试
- 悦读 TI 工业应用精选方案,闯关赢好礼喽!
- 【EEWORLD第二十三届】2011年02月社区明星人物揭晓!
- 【EE团】铁电MSP-EXP430FR5739低价来袭,让你的夏日清凉到底!
- 开关电源兴趣小组招募,只为学习开关电源
- 医用/工业CT医疗影像探测器芯片应用与解决方案
- 已结束|ADI•世健工业嘉年华——工业应用云会展
- 灵动MM32 eMiniBoard免费测评试用
- 全球首款Cortex-M23内核物联网芯片SAML10和SAM L11系列 闯关获取SAML10/SAML11法宝,拆除电子界安全危机,赢好礼!