⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpucard.c

📁 供CPU卡终端开发人员
💻 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 + -