📄 iso7816.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 + -