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

📄 iso7816.c

📁 本公司的单相CPU卡表的源程序代码
💻 C
字号:
#include "include\macro.h"  
#include "include\HardConfig.h"
#include "include\SysConfig.h"
#include "include\SubConfig.h"
#include "include\data.h"
#include "include\bitdef.h"

#include "include\FunAnnounce.h"




uchar  ESAMResetData_RX(void);
uchar  ICResetData_RX(void);
uchar ICByte_RX(uchar* prt_data);
uchar IC8Bit_RX(uchar *prt_data);
uchar ESAMByte_RX(uchar* prt_data);
uchar ESAM8Bit_RX(uchar *prt_data);
uchar ICByte_TX(uchar data);
void IC8Bit_TX(uchar data);
uchar ESAMByte_TX(uchar data);
void ESAM8Bit_TX(uchar data);

/********************************************************
*
*********************************************************/
uchar IC_Data_RX (uchar*  dataPtr,uchar len)
{
 uchar i;
 
       for(i=0;i<len;i++)
       	{
       	    if (ICByte_RX(dataPtr)==false)   return false;
       	    dataPtr++;
       	}
       
       return true;
}

/********************************************************
*
*********************************************************/
uchar IC_Data_TX (uchar* dataPtr,uchar len)
{
 uchar i;
 
       for(i=0;i<len;i++)
       	{
       	    if (ICByte_TX(*dataPtr)==false)   return false;
       	    dataPtr++;
       	}
       
       return true;
}


/********************************************************
*
*********************************************************/
uchar ESAM_Data_RX (uchar*  dataPtr,uchar len)
{
 uchar i;
 
       for(i=0;i<len;i++)
       	{
       	    if (ESAMByte_RX(dataPtr)==false)   return false;
       	    dataPtr++;
       	}
       
       return true;
}

/********************************************************
*
*********************************************************/
uchar ESAM_Data_TX (uchar* dataPtr,uchar len)
{
 uchar i;
 
       for(i=0;i<len;i++)
       	{
       	    if (ESAMByte_TX(*dataPtr)==false)   return false;
       	    dataPtr++;
       	}
       
       return true;
}

/********************************************************
*
*********************************************************/
uchar  ESAMResetData_RX(void)
{
    uchar dataBuffer[20],Number,i;
    uchar *Addr;
	  
    Addr= dataBuffer;
	  if(ESAMByte_RX(Addr)==false)   return false;         
	  if((*Addr) !=0x3b )   return false; 

	  if(ESAMByte_RX(++Addr)==false)   return false;     
		Number = (*Addr)&0x0f;
		if(ESAMByte_RX(++Addr)==false)   return false;  
	  if(*Addr !=0)   return false;  
		if(ESAMByte_RX(++Addr)==false)   return false;   
		if(*Addr !=0)   return false;  
		
		for(i=0;i<Number;i++)
		{
			      if(ESAMByte_RX(++Addr)==false)   return false; 
	  }

    for(i=0; i<16;i++)
    {
        DE_n_CLK(176);            // 1 etu    
    }
        
	  return true;
}


/********************************************************
*
*********************************************************/
uchar ESAM_Reset(void)
{
		dir_EDATA = 1;              // DATA INPUT
		dir_ERST = 0;
	  pin_ERST  =0;
		DE_n_CLK(176);             // 1 etu
		DE_n_CLK(176);            // 1 etu

		dir_EDATA = 1;
    pin_ERST  =1;
	  DE_n_CLK(90);            // 200 clk.
	  
		if(ESAMResetData_RX() == false)   return false;

		return true;
}

/********************************************************
*
*********************************************************/
uchar  ICResetData_RX(void)
{
    uchar dataBuffer[20],Number,i;
    uchar *Addr;
	  		
    Addr= dataBuffer;
	  if(ICByte_RX(Addr)==false)   return false;         
	  if((*Addr) !=0x3b )   return false; 

	  if(ICByte_RX(++Addr)==false)   return false;     
		Number = (*Addr)&0x0f;
		if(ICByte_RX(++Addr)==false)   return false;     	
		if(*Addr !=0)   return false;  
		
		if(ICByte_RX(++Addr)==false)   return false;   
		if(*Addr !=0)   return false;  
		
		for(i=0;i<Number;i++)
		{
			      if(ICByte_RX(++Addr)==false)   return false; 
	  }

    for(i=0; i<16;i++)
    {
        DE_n_CLK(176);            // 1 etu    
    }
    
	  return true;
}

/********************************************************
*
*********************************************************/
uchar Card_Reset(void)
{
		dir_ICDATA = 1;              // DATA INPUT
		dir_ICRST = 0;
	  pin_ICRST  =0;
		DE_n_CLK(176);             // 1 etu
		DE_n_CLK(176);            // 1 etu

		dir_ICDATA = 1;
    pin_ICRST  =1;
	  DE_n_CLK(90);            // 200 clk.
	  
		if(ICResetData_RX() == false)   return false;

		return true;
}

/********************************************************
*
*********************************************************/
uchar ICByte_RX(uchar* prt_data)
{
	uchar RESENUM=0x03;
	uchar  flag;

	  pin_ICDATA=1;
	  dir_ICDATA = 1;
    while(RESENUM--)
    {
        flag = IC8Bit_RX( prt_data);

        if ( flag== IC_COMM_OK)
        {
            DE_n_CLK(140);                    //  MUST 1 ETU
            return  true;
        }

        if(flag == IC_COMM_ERR_EVEN)
        {
            DE_n_CLK(40);                    //  
            dir_ICDATA = 0;
            pin_ICDATA=0;
            DE_n_CLK(180);                    //  
            pin_ICDATA=1;
            dir_ICDATA = 1;
            DE_n_CLK(40);                   
        	}
        else
        {
             return  false;
        }   
        
    }

    return false;
}

/********************************************************
*
*********************************************************/
uchar IC8Bit_RX(uchar *prt_data)
{
	register unsigned char R_Bit=0,evenFg=0,Num=1;
 uint i =0;
   
   while(1)
   	{
	   switch(R_Bit)
	   {
		      case 0:
		      	  TCE51 =1;
				      while(pin_ICDATA)
						  {
								   i++;
							    if(i>20000)                               // wait for 50ms
							    {
							        TCE51 =0;
							        return   IC_COMM_ERR_LONG;
							    } 
						  }
				      TCE51 =0;
						  DE_n_CLK(176);          //  1 ETU 
						  DE_n_CLK(83);           //  0.5 ETU 
					  	R_Bit++;
						  break;
						  
		      case 1:
		      case 2:
		      case 3:
		      case 4:
		      case 5:		
		      case 6:	
		      case 7:	
		      case 8:
					   *prt_data>>=1;
		         if(pin_ICDATA)
		         {
		             *prt_data|=0x80;
			             evenFg^=0x80;
		         }
		         else
             {
	              *prt_data&=0x7f; 
		         }		
						  DE_n_CLK(176);          //  1 ETU 
						 R_Bit++;
						 break;
						 
		      case 9:
						 if(pin_ICDATA)   evenFg^=0x80;
						 if(evenFg & 0x80)  return  IC_COMM_ERR_EVEN; 
						 return  IC_COMM_OK;
						 
	        default:
	 	        Sys_err();
	    } 
   	}
	}

/********************************************************
*
*********************************************************/
uchar ESAMByte_RX(uchar* prt_data)
{
	uchar RESENUM=0x03;
	uchar  flag;

	  pin_EDATA=1;
	  dir_EDATA = 1;
    while(RESENUM--)
    {
        flag = ESAM8Bit_RX( prt_data);

        if ( flag== IC_COMM_OK)
        {
            DE_n_CLK(140);                    //  MUST 1 ETU
            return  true;
        }

        if(flag == IC_COMM_ERR_EVEN)
        {
             DE_n_CLK(40);                    //  
	  		      dir_EDATA = 0;
		          pin_EDATA=0;
		          DE_n_CLK(180);                    //  
		          pin_EDATA=1;
		          dir_EDATA = 1;
		          DE_n_CLK(40);                   
        	}
        else
        {
             return  false;
        }   
        
    }

    return false;
}

/********************************************************
*
*********************************************************/
uchar ESAM8Bit_RX(uchar *prt_data)
{
	register unsigned char R_Bit=0,evenFg=0,Num=1;
 uint i =0;
   
   while(1)
   	{
	   switch(R_Bit)
	   {
		      case 0:
		      	  TCE51 =1;
				      while(pin_EDATA)
						  {
								   i++;
							    if(i>20000)                               // wait for 50ms
							    {
							        TCE51 =0;
							        return   IC_COMM_ERR_LONG;
							    } 
						  }
				      TCE51 =0;
						  DE_n_CLK(176);          //  1 ETU 
						  DE_n_CLK(83);           //  0.5 ETU 
					  	R_Bit++;
						  break;
						  
		      case 1:
		      case 2:
		      case 3:
		      case 4:
		      case 5:		
		      case 6:	
		      case 7:	
		      case 8:
					   *prt_data>>=1;
		         if(pin_EDATA)
		         {
		             *prt_data|=0x80;
			             evenFg^=0x80;
		         }
		         else
             {
	              *prt_data&=0x7f; 
		         }		
						  DE_n_CLK(176);          //  1 ETU 
						 R_Bit++;
						 break;
						 
		      case 9:
						 if(pin_EDATA)   evenFg^=0x80;
						 if(evenFg & 0x80)  return  IC_COMM_ERR_EVEN; 
						 return  IC_COMM_OK;
						 
	        default:
	 	        Sys_err();
	    } 
   	}
	}



/********************************************************
*
*********************************************************/
uchar ICByte_TX(uchar data)
{
 	unsigned char ResendNum=0x03,i,j=0;
	uchar flg=0;

		 pin_ICDATA =1;
		 dir_ICDATA = 0;
		 DE_n_CLK(176);       //  1 ETU 
		      
	   while(ResendNum--)
	   {
		      dir_ICDATA = 0;
		      IC8Bit_TX(data);
		      dir_ICDATA = 1;

		      DE_n_CLK(176);       //  1 ETU 
		      flg =0;
		      if(pin_ICDATA==0)      flg =1;
		      
		      pin_ICDATA =1;
		      dir_ICDATA = 0;
		      DE_n_CLK(176);       //  1 ETU 
		      
		      if(flg==0)    return true;   
		      NOP();
		  }
	   return false; 
}

/********************************************************
*
*********************************************************/
void IC8Bit_TX(uchar data)
{
 register uchar Num=8; 
 register uchar i; 
  register uchar evenFg=0;

    
    pin_ICDATA=0;
    DE_n_CLK(176);          //  1 ETU 
    
    for(i=0;i<8;i++)
    {
        
        if(data&0X01)   
        {
            pin_ICDATA=1;
            evenFg ^= 0x80;
        }
        else
        {
            pin_ICDATA=0;
        }
        data>>=1;
        DE_n_CLK(176);       //  1 ETU 
    }

    if(evenFg&0x80)
    {
        pin_ICDATA=1;
    }
    else
    {  
        pin_ICDATA=0;
    }
    DE_n_CLK(176);       //  1 ETU  
    
}


/********************************************************
*
*********************************************************/
uchar ESAMByte_TX(uchar data)
{
 	unsigned char ResendNum=0x03,i,j=0;
	uchar flg=0;

    pin_EDATA =1;
		dir_EDATA = 0;
		DE_n_CLK(176);       //  1 ETU 
		
	   while(ResendNum--)
	   {
		      dir_EDATA = 0;
		      ESAM8Bit_TX(data);
		      dir_EDATA = 1;

		      DE_n_CLK(176);       //  1 ETU 
		      flg =0;
		      if(pin_EDATA==0)      flg =1;
		      
		      pin_EDATA =1;
		      dir_EDATA = 0;
		      DE_n_CLK(176);       //  1 ETU 
		      
		      if(flg==0)    return true;   
		      NOP();
		  }
	   return false; 
}
/********************************************************
*
*********************************************************/
void ESAM8Bit_TX(uchar data)
{
 register uchar Num=8; 
 register uchar i;
 register uchar evenFg=0;

    
    pin_EDATA=0;
    DE_n_CLK(176);          //  1 ETU 
    
    for(i=0;i<8;i++)
    {
        
        if(data&0X01)   
        {
            pin_EDATA=1;
            evenFg ^= 0x80;
        }
        else
        {
            pin_EDATA=0;
        }
        data>>=1;
        DE_n_CLK(176);       //  1 ETU 
    }

    if(evenFg&0x80)
    {
        pin_EDATA=1;
    }
    else
    {  
        pin_EDATA=0;
    }
    DE_n_CLK(176);       //  1 ETU  
    
}


/********************************************************
** void DE_n_CLK(uchar cnt)
**     注 固有的误差为5us
*********************************************************/
void DE_n_CLK(uchar cnt)
{
	  TMH1_User_Init(cnt);
	  DI();
	  TCE51 =1;
	  TMHE1 = 1;
	  EI();
		while(TMIFH1 == 0);    
		DI();
		TCE51 =0;
	  TMHE1 = 0;                             //Close H1
		TMIFH1 = 0;                            //flag 	   
		EI();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -