1 综述
自从20世纪70年代IC卡诞生以来,在飞速发展的微电子技术的带动下,IC卡已经深入到社会生活的各个角落,各种各样的卡大大方便了人们的生活:银行的食堂卡、信用卡,公交车使用的交通卡,就餐使用的食堂卡,出入管理使用的考勤卡,打电话使用的付费电话卡,手机中使用的SIM卡等等。
IC卡又称为集成电路卡。卡片内封装有集成电路,用以存储和处理数据。IC卡的发展经历了从存储卡到智能卡,从接触式卡到非接触式卡,从近距离到远距离的过程。ISO/IEC7816标准定义的卡是接触卡,读卡机具必须和卡的触点接触才能和和卡进行信息交换,所以磨损严重,容易受污染,使用寿命低,操作速度慢。为此,非接触式卡技术迎刃而生。非接触式卡又称射频卡、感应卡,采用无线电调制方式和读卡机具进行信息交换。ISO/IEC10536定义的卡称为密耦合卡;ISO/IEC 14443定义的卡是近耦合卡(PICC),对应读卡机具简写为PCD;ISO/IEC15693对应的卡是遥耦合卡(VICC),对应的读卡机具简写为VCD。VICC比PICC具有更远的读卡距离,二者均采用13.56MHz工作频率,均具有防冲突机制。
图1所示的框图简单表示了射频卡读写系统的工作原理。
2 硬件设计
2.1 S6700芯片
S6700芯片是TI公司最新开发的针对IC卡读写的多协议收发器。它提供给用户数字接口,所以应用非常方便。ASIC能够支持的协议包括:TI TAGIT协议、ISO/IEC 15693-2、ISO/IEC 14443-2(TYPE A)等。S6700采用SSOP20封装,+5V供电,内部封装有发送调制器和接收解调器,采和曼彻斯特编码方式,典型发送功率200mW,其ESD保护符合MILSTD-883标准,有IDLE、POWER DOWN、FULL POWER三种电源管理功能。
笔者利用该ASIC结合MCU完整的实现了ISO/IEC 15693-3所规定的对VICC操作上层协议。
ISO/IEC 15693-2所规定的VCD与VICC通信物理层协议全部由ASIC实现,用户通过同步串行接口(SPI)遵照ASCI的通信求和ASIC打交道就可以实现VICC的读写操作。MCU和ASIC的通信接口有三根线:SCLOCK、DIN、DOUT,分别代表时钟线、数据输入线、数据输出线。时钟线是双向的,发送数据时由MCU控制,接收数据时由ASIC控制,在时钟的上升沿ASIC锁存数据。DOUT除了在接收数据期间的数据输出功能外,还用来表征ASIC内部FIFO的情况。DOUT内部下拉,平时为低电平。输入数据过程中,当ASIC的16位FIFO寄存器满时,DOUT线会自动跳变为高电平,直到FIFO寄存器空出,DOUT线又会跳变为低电平。在DOUT为高电平期间,输入数据无效。除了通信线外,M_ERR线用来在同时读多张卡的时候表征数据的冲突情况。同样,M_RR线内部下拉,平时为低电平,冲突时此线会升为高电平包括三个部分:ASIC典型应用电路、与MCU接口电路和天线电路。R2、L1、C5、C6组成串联谐振电路,匹配阻抗50Ω,可调电容C6用来准确调整电路谐振点在13.56MHz。如果认为ASIC 200mW输出功率不足,也可以再加一级功放电路,以提高读写距离。
对ASIC的操作有三种模式:普通模式、寄存器模式和直接模式。直接模式下,MCU要直接面向处理射频信号,比较复杂,所以此种模式一般不用。普通模式和寄存器模式操作的均是标准的数字信号,其不同在于规定芯片操作的一些参数,例如:所采用的射频协议、调制方式及传输速率是由命令序列中规定的还是由寄存器所设定的。普通模式每条指令均含有该指令使用的参数,而寄存器模式指令序列中并不含这些参数,而是由预先写入的寄存器中的数值所决定。注意,ASIC上电后必须首先初始化时间寄存器,芯片才能正常工作。
2.2 VICC——Tag-it HF-1应答器
Tag-it是TI公司为其最新开发的RFID TRANSPONDER(应答器)的注册商标,是一个产品系列。Tag-it完全和ISO/IEC15693兼容,是VICC的一种。按TI的设想,Tag-it主要应用在智能标签领域内,例如:特快专递、航空行李管理,电子门票等等。
Tag-it内有64位的UID(卡号)和8位的AFI(应用识别号)、8位的DSFID(数据存储格式),用来标识卡和特定应用的特征。卡内有2Kbit EEPROM,分成64个块,每个块32个bit。每个块均可以锁定,以保护数据免予修改。AFI、DSFID和32个块均可读可写,用以存储用户的数据。Tag-it采用13.56MHz的载波频率,工作于“READER TALKS FIRST”模式下,即:一问一答的模式。卡内有防冲突机制,可以同时读多张卡而不会造成冲突。
事实上一张卡可以有多种应用,不同的块可以存储不同应用的数据,即所谓的“一卡通”。遗憾的是,Tag-it内没有逻辑加密电路,无法实现密码功能,这限制了Tag-it在其它保密性要求较高的领域的应用。
3 通信协议
发给ASIC的命令序列必须符合ASIC通信协议和ISO/IEC15693-3规范。
3.1 命令结构
在普通模式下,命令序列结构如下:
*在寄存器模式下,命令字节是1位,且该位为1。
*起邕位S1:起始位波形是当SCLOCK位高电平时DIN发生一个上升沿。
*命令字节:规定ASIC与VICC通讯时的有关参数。例如,2DH,表示支持的射频协议是15693(1 out of 4),AM调制方式,调制率100%,返回数据波特率6.67kb/s。注意:命令字节的发送顺序是高位在先,即:MSB FIRST。
*数据:数据域内容由15693-3所规定。
15693-3命令的一般格式是:
15693命令序列中,FLAGS规定着命令内容中某些可选域存在与否。注意到S1和ES1在ASIC命令序列中已经存在,所以只须把15693命令序列中FLAGS、命令序号、命令内容、CRC16等域的内容取出填入ASIC序列中的数据域打包。注意:数据域的发送顺序是低位在先,即:LSB FIRST
*结束位ES1:结束位波形是当SCLOCK高电平时DIN发生一个下跳沿。
3.2 响应结构
VICC响应的一般格式是:
起始位S2
FLAGS
响应内容
CRC16
结束位ES2
*起台位S2:表示VICC响应数据的开始,定义为当SCLOCK为高电平时DOUT发生一个上升沿。
*结束位ES2:表示VICC响应数据的结束,定义为当SCLOCK为高电平时DOUT发生一个下降沿。
3.3 通信过程注意的问题
①时间寄存器初始化。初始化序列是:S1 01111011 00000001 11000ES1。
②发送顺序。命令字节(8位)发送的顺序是MSB FIRST,其它数据均是LSB FIRST。
③FIFO管理。发送每一位时都要检测DOUT的电平。DOUT高电平时停止发送,直到DOUT恢复为低电平。
④时钟线切换。命令发送过程中,双向时钟SCLOCK线由MCU控制,发送完毕,在接收VICC响应之前必须进行时钟线的切换,将控制权交由ASIC控制。
⑤CRC校验。CRC16校验是对15693-3规定的FLAGS、命令序列号、命令内容等字节的校验,不包括起始位和命令字节(8位)。
⑥适当延时。例如:发送命令字节后适当延时约100μs,以利ASIC正确动作。
3.4 举例
以读一个扇区为例,采用普通模式,VCD和VICC交互的完整过程如下:
(发送)S1(起始位)2D(命令字节)40(FLAGS)
20(读扇区命令序号)01(扇区号)00
(校验LOW BYTE)F2(校验HIGH BYTE)
ES1(结束位)TRAN1(SCLOCK切换)
(接收)S2(起始位)00(FLAGS)00(扇区安全状态)
31(数据1)32(数据2)33(数据3)34(数据4)BD 7F(校验)ES2(结束位)
3.5 关于反冲突算法
ISO/IEC 15693中描述的VICC反冲突算法非常费解,笔者通过实践摸索解决了这个问题,此处作为一简单说明。该算法基本上是一种搜索算法,卡内相对应的是一种比较应答机制。举例说明,假如READER磁场范围内有两张卡,其UID分别是E00700000158D1D2和E0070000015869E8,这样当READER采用NON-ADDRESSED模式指令去读的时候,两张卡均会回答,M_ERR线会跳变为高电平表示数据冲突。INVENTORY命令用来查询当前磁场范围内卡的卡号,专用用于解决冲突问题。其参数包括:FLAGS、COMMAND、MASKLENGTH、MASKVALUE。一种最简单的情况,设定:FLAGS.6=Nb_slots_flag=1,MAKLENGTH=4,MASKVALUE=0,当命令序列发送后,MASKVALUE会被自动与卡的UID的最低位比较,因为0≠2≠8,所以两张卡均不回答。同样的命令,如果MASKVALUE=2,则第一张卡就会回答;当MASKVALUE=8时第二张卡回答。如果两张卡的卡号是:E00700000158D1D2和E0070000015869E2,则当MASKLENGTH=4,MASKVALUE=2时两张卡均回答,就会发生冲突。解决的方法是:令MASKLENGTH=8,MASKVALUE=X2,X从0到F自增。这样,X2=D2时第一张卡回答,X2=E2时,第二张卡回答。依此类推。卡的UID最低位冲突的概率为62‰,最低两位冲突的榔为4‰。理解了此算法,就很容易理解标准中所描述的复杂算法。笔者采用这种逐位搜索算法编的读多卡程序,连续读3张卡的时间不超过500ms。
4 软件设计
笔者利用仿真器和PC机作为调试工具,采用8051汇编语言编程并调试通过了ISO/IEC15693-3所要求的所有命令。软件的主要功能包括:从PCRS232口接收命令数据,进行一次分拣处理后打包成ASIC命令序列,并发送给VICC。然后,接收VICC的响应,进行一定的分拣处理后通过RS232发送给PC机。本文只描述有关与VICC通信的部分。