
图1 TM卡的等效替换 3.2 系统软件设计 对于SMC1990A1的等效替换,主要是对其时序的分析。对于SMC1990A1子设备,主要的编程是针对主机而言的,传输都是由主机发起的。现在改为单片机模拟SMC1990A1子设备(现称为“从机”)。

图2 初始化时序 首先,初始化时序,如图2所示。主机首先发送一个复位脉冲,历时tRETL(最短为480 μs的低电平信号),然后释放总线并进入接收状态。从机在检测到总线的上升沿后,等待tPDH时间后,从机拉低总线发出存在脉冲,历时tPDL(低电平,持续60~240 μs),然后释放总线。释放总线通过拉高总线实现。 对应于从机,初始化时序的中断服务程序流程如图3所示。

图3 初始化时序的中断服务程序流程 下面是主机写0和写1时序。在初始化时序后,当主机总线从高电平拉至低电平时,就产生写时间隙。在开始15 μs之内,应将所需写的位送到总线上,从机在开始后15 ~60 μs间对总线采样。若为低电平,写入的位是0,如图4所示;若为高电平,写入的位是1,如图5所示。连续写多位间的间隙tREC应大于1 μs。

图4 主机写0时序

图5 主机写1时序 对应于从机,是等待主机命令。从机等待主机命令的中断服务程序流程如图6所示。

图6 从机等待主机命令的中断服务程序流程 最后是主机读数据时序,如图7所示。主机总线在开始时刻从高电平拉至低电平时,总线只需保持低电平1~7 μs。之后在tLOWR时刻释放总线,一般在tRDV时刻采样总线(15 μs处),读时间隙在tLOWR与tRDV之间有效。从机必须在tRDV时刻前拉高或拉低总线,主机在tRDV时刻采样,并在60~120 μs内释放总线。

图7 主机读数据时序 对从机来说,则为发送64位ID处理。程序处理的难点在于从机必须在15 μs之前拉高或拉低总线,以供主机在15 μs处采样总线。程序通过判断位地址00H处的状态来实现此功能。通过判断位地址01H处的状态来确定发送位0或发送位1。从机发送64位ID处理的中断服务程序流程如图8所示。

图8 从机发送64位ID处理的中断服务程序流程 在完整地实现一次ROM功能的过程中,从机首先等待主机发送的复位脉冲,待检测到后发图9实现ROM功能的流程送存在脉冲应答。随后,从机开始接收主机发送的ROM命令,并将其保存,以判断随后的操作。最后,从机发送TM卡的64位标识码,完成一次ROM命令的执行。实现ROM功能的流程如图9所示。 单片机的汇编程序如下: ORG0000H
AJMPInit//跳到Init段
ORG0003H
AJMPJudge//跳到中断服务程序
Init: //初始化
MOVDPTR,#ID//ID表地址
MOVR5,#001H
MOVR7,#000H
CLR00H
SETB01H
SETBP3.2
LCALLDelay10s
CLRP3.2//拉低总线叫醒主机
LCALLDelay100us
SETBP3.2
SETBEA
SETBIT0
SETBEX0
MAIN: AJMPMAIN//主循环
Judge:CLREX0//判断执行动作,关中断
JNB00H,SecondJ//跳到二次判断
ID_IN:JB01H,SEND1//从机发送TM卡64位标识码
CLRP3.2//发送位0
SEND1:SETBP3.2 //发送位1
LCALLDelay30us
MOVA,R5//R5循环左移
RLA
MOVR5,A
MOVA,#00H
MOVCA,@A+DPTR
ANLA,R5
CLR01H//设置01H状态
JZRelease1
SETB01H
Release1:SETBP3.2
MOVA,R5
ANLA,#080H//判断字节发送完否
JZINTEND
INCDPTR
AJMPINTEND//跳到中断结束
SecondJ:MOVA,R7//二次判断
JZWaitReply//跳到执行应答判断是否命令接收结束
ANLA,#008H
JZWaitOrder//跳到执行接收命令
SETB00H
WaitOrder: LCALLDelay15us//接收命令
NOP
NOP
MOVA,P3//采样P3.2
ANLA,#004H
JZSAVE_R6
MOVA,#001H
SAVE_R6:
ORLA,R6 //保存命令到R6
RRA
MOVR6,A
RLOOP1:
MOVA,P3//判断主机的发送状态,是否返回
ANLA,#004H
JZRLOOP1
AJMPINTEND//跳到中断结束
WaitReply://执行应答
RLOOP:MOVA,P3//判断主机的复位信号
ANLA,#004H
JZRLOOP
LCALLDelay30us
CLRP3.2//从机拉低电平应答
LCALLDelay150us
SETBP3.2//释放总线
NOP
NOP
NOP
NOP
INTEND:
INCR7
CLRIE0
SETBEX0//开中断
RETI//中断返回
ID:DB001H//ID表
DB0C3H
DB04DH
DB057H
DB033H
DB022H
DB000H
DB0D2H 本文代码在实际运用中得到了很好的验证,能够稳定地替代SMC1990A1实现TM卡的ROM功能,极大地方便了权限管理人员用于丢失或损坏的TM卡的权限管理。