1 硬件接口
1.1 TDA8007简介
TDA8007是NXP公司推出的IC卡读卡芯片。它提供2个能同时满足ISO7816标准、EMV和GSM1111标准的IC卡读写接口。处理器只需通过其接口控制并行通信来管理TDA8007,便可实现对IC卡的上电、下电及读写数据处理。TDA8007的片选信号和外部中断信号线可以方便读写器处理多个IC卡头;特别的硬件ESD处理、接口短路处理、电源出错处理等,为IC卡和IC卡读写器提供了比较高的安全保护;内部集成的电源管理功能使其供电范围可达2.7~6.0 V,通过电源管理可以给IC卡提供5.0 V、3.0 V及1.8 V的电源,以适合不同工作电压的IC卡应用。
1.2 TDA8007工作时序与ARM总线时序比较
在基于ARM核心的嵌入式系统中,程序大多数是存在外部NAND Flash里面的。当TDA8007也接入总线时,若使用总线复用的方式,就需要把程序调用到内存中运行,同时需要11个GPIO来控制TDA8007的读写。本文采用非总线复用的方式,ARM处理器选用LPC2220。LPC2220微控制器是基于一个支持实时仿真和嵌入跟踪的32/16位ARM7TDMIS CPU。由于TDA8007最开始是为51核的单片机设计的,所以读写的时序和ARM的总线不同。 TDA8007和LPC2220的读写时序如图1和图2所示。
图1 TDA8007的读写时序
图2 LPC2220的读写时序
对比图1和图2,可以发现TDA8007和LPC2220的读写时序是不一样的,因此无法直接连接。特别要说明的是,使用之前一定要深入研究芯片的数据手册,时序匹配不对可能会导致二次布板。
1.3 解决方案
TDA8007无法直接连接到LPC2220,同时除非使用专门的GPIO接口,否则也无法采用总线复用的方式操作TDA8007,目前,大多数设计方案都是使用51单片机控制TDA8007,51单片机再与LPC2220进行通信。本文提出了一种新的解决办法,可以很方便使TDA8007连接到LPC2220处理器,操作方法和操作存储器一样。
通过比较可以很清楚看出,二者时序的主要区别在于读写信号的时序不同,如表1所列。
表1 TDA8007与LPC2220读写时序比较
针对TDA8007的独特时序,将LPC2220的OE、WE信号进行与操作,作为TDA8007的WR使能信号,使用一个GPIO口进行读写控制,CS信号仍然不变,这样的时序图就非常符合读写的要求。图3为TDA8007与LPC2220连接的电路图。其中,TDA_RD/WR是GPIO。
图3 TDA8007设计电路
2 软件接口
由于TDA8007连接到ARM总线上时使用GPIO控制读写操作,所以程序也需进行相应修改。修改后读写函数如下:
#define TdaCS 0x83000040//TDA8007地址
unsigned char *volatile TDA=(unsigned char *)TdaCS;
uchar read_register(uchar address) {
uchar val;
IO3DIR=(IO3DIR |(0x01<<29));
IO3SET=(0x01 << 29);//RD控制,RD=1
val=TDA[address];
return val;
}
void write_register(uchar address, uchar _data){
IO3DIR=(IO3DIR |(0x01<<29));
IO3CLR=(0x01 << 29);//RD控制,RD=0
TDA[address]=_data;
IO3SET=(0x01 << 29);
}
3 结论
使用TDA8007时需要注意如下问题:
① 外围电路的配置。SAP和SAM、SBP和SBM、VUP和GND这3个电容的匹配非常重要,如果电容选择错误,可能会导致上电失败。按照经验,SAP和SAM、SBP和SBM之间均使用0.01 μF电容,VUP和GND之间使用220 nF电容。这种配置方式的实际使用效果好于按照demo电路的电容配置。
② 在大多数的使用环境下,TDA8007使用晶振为14.745 6 MHz。如果CPU的频率比较低,最好进行分频。
③ 上电前最好先确定是否已经插卡9,避免多次上电导致芯片烧毁。
本文的解决方案已经在某公司金融POS系列产品中得到实际应用。从目前的使用情况来看,可以通过国际EMV L1和L2认证。