📄 mifare.c
字号:
{ status = MI_ERR; }
return status;
}
/////////////////////////////////////////////////////////////////////
//功 能:写数据到M1卡一块
//参数说明: addr[IN]:块地址
// pData[IN]:写入的数据,16字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdWrite(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char idata ucComBuf[FSD];
PcdSetTmo(5);
WriteRawRC(RegChannelRedundancy,0x0F);
ucComBuf[0] = PICC_WRITE;
ucComBuf[1] = addr;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
if (status == MI_OK)
{
memcpy(ucComBuf, pData, 16);
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,16,ucComBuf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
}
return status;
}
/////////////////////////////////////////////////////////////////////
//功 能:扣款和充值
//参数说明: dd_mode[IN]:命令字
// 0xC0 = 扣款
// 0xC1 = 充值
// addr[IN]:钱包地址
// pValue[IN]:4字节增(减)值,低位在前
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{
char status;
unsigned int unLen;
unsigned char idata ucComBuf[FSD];
PcdSetTmo(5);
ucComBuf[0] = dd_mode;
ucComBuf[1] = addr;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
if (status == MI_OK)
{
memcpy(ucComBuf, pValue, 4);
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,4,ucComBuf,&unLen);
if (status != MI_ERR)
{ status = MI_OK; }
}
if (status == MI_OK)
{
ucComBuf[0] = PICC_TRANSFER;
ucComBuf[1] = addr;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
}
return status;
}
/////////////////////////////////////////////////////////////////////
//功 能:备份钱包
//参数说明: sourceaddr[IN]:源地址
// goaladdr[IN]:目标地址
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
{
char status;
unsigned int unLen;
unsigned char idata ucComBuf[FSD];
ucComBuf[0] = PICC_RESTORE;
ucComBuf[1] = sourceaddr;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
if (status == MI_OK)
{
ucComBuf[0] = 0;
ucComBuf[1] = 0;
ucComBuf[2] = 0;
ucComBuf[3] = 0;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,4,ucComBuf,&unLen);
if (status != MI_ERR)
{ status = MI_OK; }
}
if (status != MI_OK)
{ return MI_ERR; }
ucComBuf[0] = PICC_TRANSFER;
ucComBuf[1] = goaladdr;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
return status;
}
/////////////////////////////////////////////////////////////////////
//功 能:命令卡片进入休眠状态
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdHalt(void)
{
char status;
unsigned int unLen;
unsigned char idata ucComBuf[FSD];
ucComBuf[0] = PICC_HALT;
ucComBuf[1] = 0;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
return MI_OK;
}
/////////////////////////////////////////////////////////////////////
//M I F A R E U L T R A L I G H T A N T I C O L L I S I O N
//A N D S E L E C T
//parameter: pSnr[OUT]:7Byte card SNR
/////////////////////////////////////////////////////////////////////
char UL_PcdAnticoll(unsigned char *pSnr)
{
char status ;
unsigned char i, snr_check = 0;
unsigned int unLen;
unsigned char idata ucComBuf[FSD];
WriteRawRC(RegDecoderControl,0x28);
ClearBitMask(RegControl,0x08);
WriteRawRC(RegChannelRedundancy,0x03);
PcdSetTmo(4);
ucComBuf[0] = PICC_ANTICOLL1;
ucComBuf[1] = 0x20;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
if (status == MI_OK)
{
for (i=0; i<4; i++)
{
*(pSnr+i) = ucComBuf[i];
snr_check ^= ucComBuf[i];
}
if (snr_check != ucComBuf[i])
{ status = MI_ERR; }
else
{ memcpy(pSnr, &ucComBuf[1], 3); }
}
ClearBitMask(RegDecoderControl,0x20);
snr_check = 0x88;
WriteRawRC(RegChannelRedundancy,0x0F);
ClearBitMask(RegControl,0x08);
PcdSetTmo(4);
ucComBuf[0] = PICC_ANTICOLL1;
ucComBuf[1] = 0x70;
ucComBuf[2] = 0x88;
for (i=0; i<3; i++)
{
snr_check ^= *(pSnr+i);
ucComBuf[i+3] = *(pSnr+i);
}
ucComBuf[6] = snr_check;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,7,ucComBuf,&unLen);
if (status == MI_OK)
{
if (unLen != 0x08)
{ status = MI_ERR; }
}
if (status == MI_OK)
{
snr_check = 0;
WriteRawRC(RegDecoderControl,0x28);
ClearBitMask(RegControl,0x08);
WriteRawRC(RegChannelRedundancy,0x03);
PcdSetTmo(4);
ucComBuf[0] = PICC_ANTICOLL2;
ucComBuf[1] = 0x20;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
if (!status)
{
for (i=0; i<4; i++)
{ snr_check ^= ucComBuf[i]; }
if (snr_check != ucComBuf[i])
{ status = MI_ERR; }
else
{ memcpy(pSnr+3, &ucComBuf[0], 4); }
}
ClearBitMask(RegDecoderControl,0x20);
snr_check = 0;
WriteRawRC(RegChannelRedundancy,0x0F);
ClearBitMask(RegControl,0x08);
PcdSetTmo(4);
ucComBuf[0] = PICC_ANTICOLL2;
ucComBuf[1] = 0x70;
for (i=0; i<4; i++)
{
snr_check ^= *(pSnr+3+i);
ucComBuf[i+2] = *(pSnr+3+i);
}
ucComBuf[6] = snr_check;
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,7,ucComBuf,&unLen);
if (status == MI_OK)
{
if (unLen != 0x08)
{ status = MI_ERR; }
}
}
return status;
}
/////////////////////////////////////////////////////////////////////
//M I F A R E U L T R A L I G H T W R I T E
//parameter: addr[IN]:page addr
// pData[IN]:4byte data
/////////////////////////////////////////////////////////////////////
char UL_PcdWrite(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char idata ucComBuf[FSD];
PcdSetTmo(4);
WriteRawRC(RegChannelRedundancy,0x07);
ucComBuf[0] = 0xA2;
ucComBuf[1] = addr;
memcpy(&ucComBuf[2], pData, 4);
status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,6,ucComBuf,&unLen);
if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
PcdSetTmo(4);
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -