GTR=0xff; //保持时间12ETU

If(v==1) //v为函数变量

PCR|=0x08; //1.8V卡用

else if(v==3)

PCR|=0x02; //3V卡用

Else

PCR&=0xfd; //5V卡用

UCR2&=0xfc; //CKU=PSC=0,--31

FCR=0x00; //1奇偶校验1FIFO

PDR=0x0c; //Divider=12

CCR=0x00; //不分频

PCR&=0xfb; //RSTIN=0

UCR2|=0x04; //不自动转换

UCR1=0x01; //正向约定

UCR1&=0xf7; //接收模式

flag3=0; //复位定时标志

flagatr=0; //接收ATR首字节定时标志

PCR|=0x01; //激活

TOR2=0x6c;

TOR3=0x00;

TOC=0x61; //RST拉高前等待108ETU

while(flag3==0); //定时时间到,在中断中设置flag3=1

TOC=0x00; //关闭定时器

PCR|=0x04; //给复位拉高

TOR2=0x78;

TOR3=0x00;

TOC=0x61; //RST拉高前等待

flagatr=1;

ATR(); //复位应答处理函数

图5为IC卡的下电时序图。相对于上电时序,下电过程对时间的要求不是很严格,只要设计者控制TDA8007按照一定的顺序置低START、RSTIN和停止CLK即可,然后TDA8007会自动逐步释放RST、I/O、Vcc及VUP。具体处理见下电程序。

下电程序:

P15=0;

PCR&=0xfe; //START=0;下电

PCR&=0xfb; //卡的复位脚保持0

CCR&=0xdf; //停止时钟于低

CCR|=0x10; //停止时钟

P15=1;

6、 使用TDA8007应当注意的问题

TDA8007对于Vcc、RST出错,芯片过热(如图IC卡为电源短路卡或金属片),或IC卡插入拔出时都会产生中断输出。每次中断处理结束,应注意把HSR中的值读入一个临时地址,以便清楚HSR中的标志。

每次发送数据到IC前,即接收IC卡的最后一个数据之前,应设置寄存器UCR1中的LCT位,以便接收完IC卡的数据后,自动切换成发送状态。

对TDA8007部分布线时应注意,时钟信号线与其它线的隔离:最好被地线包围。

对于电路板上TDA8007部分的电容应尽量靠近TDA8007,其中电容Cap、Cbp、Cup尤其如此,并最好不要在这些电容连向TDA8007引脚过程中使用过孔;同时,Cap、Cup、Cbp电容的ESR要尽量小。

对TDA8007处理的两个IC卡座中的任何一个执行上电、下电、读写卡操作之前,必须执行选择卡座的操作函数,以便选中具体的IC卡进行处理。

对IC卡操作中上电时序中的定时,读写卡字节间等待定时等都可使用TDA8007中的定时器及定时控制器操作,注意其定时器为向下计数方式。

结语

本文主要从CPU IC卡的T=0的协议出发,介绍此类IC读写器设计的一些技术问题。值得指出的是,T=0协议仅仅是IC卡与外界数据交换的一种传输协议,只要在软件上适当修改并利用接口芯片TDA8007突出的处理能力,本读写器完全可以实现对其它ISO7816卡、EMV、GSM`11-11卡的读写。