📄 iso14443a.c
字号:
struct TranSciveBuffer *pi;
pi = &MfComData;
PcdSetTmo(4);
MfComData.MfCommand = PCD_LOADKEY;
MfComData.MfLength = 12;
memcpy(&MfComData.MfData[0], pKeys, 12);
status = PcdComTransceive(pi);
return status;
}
/////////////////////////////////////////////////////////////////////
//功能:用存放RC500的FIFO中的密钥和卡上的密钥进行验证
//input:auth_mode=验证方式,0x60:验证A密钥,0x61:验证B密钥
// block=要验证的绝对块号
// g_cSNR=序列号首地址
/////////////////////////////////////////////////////////////////////
char PcdAuthState(unsigned char auth_mode,unsigned char block,unsigned char *pSnr)
{
char status;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
WriteRawRC(RegChannelRedundancy,0x0F);
PcdSetTmo(4);
MfComData.MfCommand = PCD_AUTHENT1;
MfComData.MfLength = 6;
MfComData.MfData[0] = auth_mode;
MfComData.MfData[1] = block;
memcpy(&MfComData.MfData[2], pSnr, 4);
status = PcdComTransceive(pi);
if (status == MI_OK)
{
if (ReadRawRC(RegSecondaryStatus) & 0x07)
{ status = MI_BITCOUNTERR; }
else
{
MfComData.MfCommand = PCD_AUTHENT2;
MfComData.MfLength = 0;
status = PcdComTransceive(pi);
if (status == MI_OK)
{
if (ReadRawRC(RegControl) & 0x08)
{ status = MI_OK; }
else
{ status = MI_AUTHERR; }
}
}
}
return status;
}
/////////////////////////////////////////////////////////////////////
//读mifare_one卡上一块(block)数据(16字节)
//input: addr = 要读的绝对块号
//output:readdata = 读出的数据
/////////////////////////////////////////////////////////////////////
char PcdRead(unsigned char addr,unsigned char *pReaddata)
{
char status;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
PcdSetTmo(4);
WriteRawRC(RegChannelRedundancy,0x0F);
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 2;
MfComData.MfData[0] = PICC_READ;
MfComData.MfData[1] = addr;
status = PcdComTransceive(pi);
if (status == MI_OK)
{
if (MfComData.MfLength != 0x80)
{ status = MI_BITCOUNTERR; }
else
{ memcpy(pReaddata, &MfComData.MfData[0], 16); }
}
return status;
}
/////////////////////////////////////////////////////////////////////
//写数据到卡上的一块
//input:adde=要写的绝对块号
// writedata=写入数据
/////////////////////////////////////////////////////////////////////
char PcdWrite(unsigned char addr,unsigned char *pWritedata)
{
char status;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
PcdSetTmo(5);
WriteRawRC(RegChannelRedundancy,0x07);
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 2;
MfComData.MfData[0] = PICC_WRITE;
MfComData.MfData[1] = addr;
status = PcdComTransceive(pi);
if (status != MI_NOTAGERR)
{
if(MfComData.MfLength != 4)
{ status=MI_BITCOUNTERR; }
else
{
MfComData.MfData[0] &= 0x0F;
switch (MfComData.MfData[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x0A:
status = MI_OK;
break;
default:
status = MI_CODEERR;
break;
}
}
}
if (status == MI_OK)
{
PcdSetTmo(5);
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 16;
memcpy(&MfComData.MfData[0], pWritedata, 16);
status = PcdComTransceive(pi);
if (status != MI_NOTAGERR)
{
MfComData.MfData[0] &= 0x0F;
switch(MfComData.MfData[0])
{
case 0x00:
status = MI_WRITEERR;
break;
case 0x0A:
status = MI_OK;
break;
default:
status = MI_CODEERR;
break;
}
}
PcdSetTmo(4);
}
return status;
}
/////////////////////////////////////////////////////////////////////
//扣款和充值
//input:dd_mode=命令字,0xC0:扣款,0xC1:充值
// addr=钱包的绝对块号
// value=4字节增(减)值首地址,16进制数,低位在前
/////////////////////////////////////////////////////////////////////
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{
char status;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
PcdSetTmo(5);
// WriteRawRC(RegCRCPresetLSB,0x63);
// WriteRawRC(RegCwConductance,0x3F);
WriteRawRC(RegChannelRedundancy,0x0F);
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 2;
MfComData.MfData[0] = dd_mode;
MfComData.MfData[1] = addr;
status = PcdComTransceive(pi);
if (status != MI_NOTAGERR)
{
if (MfComData.MfLength != 4)
{ status = 0x21; } //{ status = MI_BITCOUNTERR; }
else
{
MfComData.MfData[0] &= 0x0F;
switch (MfComData.MfData[0])
{
case 0x00:
status = 0x22;//status = MI_NOTAUTHERR;
break;
case 0x0A:
status = MI_OK;
break;
case 0x01:
status = 0x23;//status = MI_VALERR;
break;
default:
status = 0x24; //status = MI_CODEERR;
break;
}
}
}
if (status == MI_OK)
{
PcdSetTmo(5);
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 4;
pi = &MfComData;
memcpy(&MfComData.MfData[0], pValue, 4);
status = PcdComTransceive(pi);
if (status==MI_OK)
{
if (MfComData.MfLength != 4)
{ status = 0x25; }// { status = MI_BITCOUNTERR; }
else
{ status = MI_OK; }
}
else if(status == MI_NOTAGERR)
{ status = MI_OK; }
else
{ status=0x26; }// { status=MI_COM_ERR; }
}
if (status == MI_OK)
{
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 2;
MfComData.MfData[0] = PICC_TRANSFER;
MfComData.MfData[1] = addr;
status = PcdComTransceive(pi);
if (status != MI_NOTAGERR)
{
if (MfComData.MfLength != 4)
{ status = MI_BITCOUNTERR; }
else
{
MfComData.MfData[0] &= 0x0F;
switch(MfComData.MfData[0])
{
case 0x00:
status = 0x27; //status = MI_NOTAUTHERR;
break;
case 0x0a:
status = MI_OK;
break;
case 0x01:
status = 0x28;// status = MI_VALERR;
break;
default:
status = 0x29; //status = MI_CODEERR;
break;
}
}
}
}
return status;
}
/////////////////////////////////////////////////////////////////////
//命令卡进入休眠状态
/////////////////////////////////////////////////////////////////////
char PcdHalt()
{
char status = MI_OK;
struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi = &MfComData;
MfComData.MfCommand = PCD_TRANSCEIVE;
MfComData.MfLength = 2;
MfComData.MfData[0] = PICC_HALT;
MfComData.MfData[1] = 0;
status = PcdComTransceive(pi);
if (status)
{
if (status==MI_NOTAGERR || status==MI_ACCESSTIMEOUT)
status = MI_OK;
}
WriteRawRC(RegCommand,PCD_IDLE);
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -