📄 cpucard.c
字号:
CPU卡的接口特性、传输协议与读写程序设计
接收数据子程序
程序代码如下:
void Reset(BYTE *len, BYTE *resp)
{
if(!ECPU)
{ //冷复位
ICVCC=1;
delay_10ms(1);
ICIO =1;
ICCLK=1;
ECPU =TRUE;
}else{ //热复位
ICRST=0;
}
TMOD=0x22; //开定时器T1为模式2, T0为模式2
TH1=-52;
TL1=-52;
ET1=FALSE;
TR1=TRUE;
do{}while(!TF1); //延时 200 个时钟周期 200/3.57Mhz=56us,
//56us/1.085us=51.6Cyl
TF1=FALSE;
ET0=FALSE;
ET1=TRUE;
TR1=FALSE;
ICRST=1;
qry_ext1(2,resp); //接收前两个复位响应数据
*len=(resp[1]&0x0f)+2;
qry_ext1(*len,&(resp[2])); //根据第二个字节的后半字节+2,判断复位响应所剩数据长度,//再接收其余字节
*len+=2;
}
触点释放子程序
程序代码如下:
void Power_off(void)
{
ICRST=0;
ICCLK=0;
ECPU =FALSE;
ICIO =0;
ICVCC=0;
}
读写程序代码及注释:
函数介绍:
l void qry_ext1(BYTE bytenr,BYTE *Buffer):接收数据子程序(参数含义分别是:接收数据字节数,接收数据的存放处)
l void RSXmt(void): 发送数据子程序
l WORD CPUC_Cmd(BYTE len,BYTE* comm, BYTE *lenr, BYTE* resp):CPU卡命令子程序(参数含义分别是:发送命令长度,发送命令,返回字节数,返回数据),函数返回状态字节SW1SW2
程序源代码:
WORD CPUC_Cmd(BYTE len,BYTE* comm, BYTE *lenr, BYTE* resp)
{
BYTE Lc, Le, sw1, sw2, i;
BYTE BPrc,INS;
Begin:
INS=comm[1]; //变量赋值,INS等于命令字第二个字节
if(len>5) //变量赋值,根据命令字的不同长度确定Lc和Le
{
Lc=comm[4];
if(len>5+Lc)Le=comm[5+Lc];
else
Le=0x00;
}else{
Le=comm[4];
Lc=0;
}
for(i=0;i<5;i++) //发送命令头CLA, INS, P1, P2, 0/Le/Lc
{
XmtDat=comm[i];
RSXmt();
}
A:
qry_ext1(1,&BPrc); //接收第一个返回字节
if(BPrc==0x60) //若第一个返回字节为60,继续等待接收
{
goto A;
}else if(BPrc==INS) //若第一个返回字节等于INS
{
if(Lc==0) //若=INS, 没有要发送数据,接收Le+2个返回字节
{
qry_ext1(Le+2,resp);
sw1=resp[Le]; sw2=resp[Le+1];
}else{ //若=INS, 有要发送数据,发送后,Lc清零,重新接收
delay_50us_NOP(1);
for(i=0;i<Lc;i++)
{
XmtDat=comm[5+i];
RSXmt();
}
Lc=0;
goto A;
}
}else
{
sw1=BPrc;
qry_ext1(1,&BPrc);
sw2=BPrc;
if(sw1==0x61) //若第一个返回字节等于‘61’,P3置为第二个
{ //返回字节的值,发送GET RESPONSE 指令
comm[0]=0x00;
comm[1]=0xC0;
comm[2]=0x00;
comm[3]=0x00;
comm[4]=sw2;
comm[5]=0;
len=5;
delay_50us_NOP(1);
goto Begin;
}
if(sw1==0x6C) //若第一个返回字节等于‘6C’,P3置为第二个
{ //返回字节的值,重发命令头
comm[4]=sw2;
comm[5]=0x00;
len=5;
delay_50us_NOP(1);
goto Begin;
}
}
*lenr=Le; //设置返回长度的参数为Le
return ( (((WORD)sw1)<<8)+sw2 ); //返回SW1SW2
}
注释:
① Le—接收数据长度 ② Licc—卡实际要返回的数据长度
③ Lc—发送数据长度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -