📄 fm1702.c
字号:
**************************************************************
*/
uchar MIF_Write(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
uchar idata *F_buff;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
F_buff = buff + 0x10;
ChannelRedundancy = 0x07;
*F_buff = RF_CMD_WRITE;
*(F_buff + 1) = Block_Adr;
temp = Command_Send(2, F_buff, Transceive);
if (temp == FALSE)
{
return(FM1702_NOTAGERR);
}
temp = FIFOLength;
if (temp == 0)
{
return(FM1702_BYTECOUNTERR);
}
Read_FIFO(F_buff);
temp = *F_buff;
switch (temp)
{
case 0x00 :
return(FM1702_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1702_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM1702_CRCERR);
case 0x05:
return(FM1702_PARITYERR);
default:
return(FM1702_WRITEERR);
}
temp = Command_Send(16, buff, Transceive);
if ( temp )
{
return(FM1702_OK);
}
else
{
temp = ErrorFlag;
if ((temp & 0x02)==0x02)
return(FM1702_PARITYERR);
else if((temp & 0x04)==0x04)
return(FM1702_FRAMINGERR);
else if ((temp & 0x08)==0x08)
return(FM1702_CRCERR);
else
return(FM1702_WRITEERR);
}
}
/*
**************************************************************
名称: MIF_Increment
功能: 该函数实现MIFARE卡自动增值操作
输入: buff: 四个字节数值起始地址
Block_Adr: 块地址
输出: FM1715_NOTAGERR: 无卡
FM1702_BYTECOUNTERR: 接收字节错误
FM1702_NOTAUTHERR: 未经权威认证
FM1702_EMPTY: 数据溢出错误
FM1702_CRCERR: CRC校验错
FM1702_PARITYERR: 奇偶校验错
FM1702_INCRERR: 卡片增款操作失败
FM1702_OK: 应答正确
****************************************************************
*/
uchar MIF_Increment(uchar idata *buff,uchar Block_Adr)
{
uchar temp;
uchar idata *F_buff;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
F_buff = buff + 4;
*F_buff = RF_CMD_INC;
*(F_buff + 1) = Block_Adr;
ChannelRedundancy = 0x07;
temp = Command_Send(2, F_buff, Transceive);
if (temp == FALSE)
{
return FM1702_NOTAGERR;
}
temp = FIFOLength;
if (temp == 0)
{
return FM1702_BYTECOUNTERR;
}
Read_FIFO(F_buff);
temp = *F_buff;
switch(temp)
{
case 0x00:
//break;
return(FM1702_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1702_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM1702_CRCERR);
case 0x05:
return(FM1702_PARITYERR);
default:
return(FM1702_INCRERR);
}
temp = Command_Send(4, buff, Transmit);
if (temp == FALSE)
{
return(FM1702_DECRERR);
}
return FM1702_OK;
}
/*
**************************************************************
名称: MIF_Decrement
功能: 该函数实现MIFARE卡自动减值操作
输入: buff: 四个字节数值起始地址
Block_Adr: 块地址
输出:
FM1702_NOTAGERR: 无卡
FM1702_BYTECOUNTERR: 接收字节错误
FM1702_NOTAUTHERR: 未经权威认证
FM1702_EMPTY: 数据溢出错误
FM1702_CRCERR: CRC校验错
FM1702_PARITYERR: 奇偶校验错
FM1702_DECRERR: 卡片扣款操作失败
FM1702_OK: 应答正确
***************************************************************
*/
uchar MIF_Decrement(uchar idata *buff,uchar Block_Adr)
{
uchar temp;
uchar idata *F_buff;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
F_buff = buff + 4;
*F_buff = RF_CMD_DEC;
*(F_buff + 1) = Block_Adr;
ChannelRedundancy = 0x07;
temp = Command_Send(2, F_buff, Transceive);
if (temp == FALSE)
{
return FM1702_NOTAGERR;
}
temp = FIFOLength;
if (temp == 0)
{
return FM1702_BYTECOUNTERR;
}
Read_FIFO(F_buff);
temp = *F_buff;
switch (temp)
{
case 0x00:
//break;
return(FM1702_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1702_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM1702_CRCERR);
case 0x05:
return(FM1702_PARITYERR);
default:
return(FM1702_DECRERR);
}
temp = Command_Send(4, buff, Transmit);
if (temp == FALSE)
{
return(FM1702_DECRERR);
}
return FM1702_OK;
}
/****************************************************************
名称: MIF_Restore
功能: 该函数实现MIFARE卡自动恢复,备份操作
输入: Block_Adr: 块地址
输出:
FM1715_NOTAGERR: 无卡
FM1715_BYTECOUNTERR: 接收字节错误
FM1715_NOTAUTHERR: 未经权威认证
FM1715_EMPTY: 数据溢出错误
FM1715_CRCERR: CRC校验错
FM1715_PARITYERR: 奇偶校验错
FM1715_RESTERR: 卡片恢复,备份操作失败
FM1715_OK: 应答正确
*****************************************************************
*/
uchar MIF_Restore(uchar Block_Adr)
{
uchar temp,i;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
ChannelRedundancy = 0x07;
*buffer = RF_CMD_RESTORE;
*(buffer + 1) = Block_Adr;
temp = Command_Send(2, buffer, Transceive);
if (temp == FALSE)
{
return FM1702_NOTAGERR;
}
temp = FIFOLength;
if (temp == 0)
{
return FM1702_BYTECOUNTERR;
}
Read_FIFO(buffer);
temp = *buffer;
switch (temp)
{
case 0x00 :
//break;
return(FM1702_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1702_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM1702_CRCERR);
case 0x05:
return(FM1702_PARITYERR);
default:
return(FM1702_RESTERR);
}
for (i = 0; i < 4; i++)
buffer[i] = 0x00;
temp = Command_Send(4, buffer, Transmit);
if (temp == FALSE)
{
return FM1702_RESTERR;
}
return FM1702_OK;
}
/*
***************************************************************
名称: MIF_Transfer
功能: 该函数实现MIFARE卡电子钱包保存操作
输入: Block_Adr: 块地址
输出:
FM1702NOTAGERR: 无卡
FM1702BYTECOUNTERR: 接收字节错误
FM1702NOTAUTHERR: 未经权威认证
FM1702EMPTY: 数据溢出错误
FM1702CRCERR: CRC校验错
FM1702PARITYERR: 奇偶校验错
FM1702TRANSERR: 卡片恢复,备份操作失败
FM1702OK: 应答正确
***************************************************************
*/
uchar MIF_Transfer(uchar Block_Adr)
{
uchar temp;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
ChannelRedundancy = 0x07;
buffer[0] = RF_CMD_TRANSFER;
buffer[1] = Block_Adr;
temp = Command_Send(2, buffer, Transceive);
if (temp == FALSE)
{
return FM1702_NOTAGERR;
}
temp = FIFOLength;
if (temp == 0)
{
return FM1702_BYTECOUNTERR;
}
Read_FIFO(buffer);
temp= *buffer;
switch (temp)
{
case 0x00 :
//break;
return(FM1702_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1702_EMPTY);
case 0x0a:
return(FM1702_OK);
case 0x01:
return(FM1702_CRCERR);
case 0x05:
return(FM1702_PARITYERR);
default:
return(FM1702_TRANSERR);
}
}
//*****************************************************
//*****************************************************
/*
卡片触发
***************************************************************
名称: HL_Active
功能: 该函数实现高级 MIFARE 卡激活命令
输入:
Secnr: 扇区号
Block_Adr: 块地址
输出:
操作状态码
读出数据存于 buffer 中
/***************************************************************
*/
uchar HL_Active(uchar Block_Adr,uchar Mode)
{
uchar temp;
Secnr = Block_Adr/4;
MIF_Halt(); //Halt
temp = Request(RF_CMD_REQUEST_STD); //Request
if(temp != FM1702_OK)
{
return(FM1702_REQERR);
}
temp = AntiColl(); //AntiCol
if(temp != FM1702_OK)
{
return(FM1702_ANTICOLLERR);
}
temp = Select_Card(); //Select
if(temp != FM1702_OK)
{
return(FM1702_SELERR);
}
Load_keyE2_CPY((Secnr%16), Mode); //LoadKey
temp = Authentication(UID, Secnr, Mode); //Authentication
if(temp != FM1702_OK)
{
return(FM1702_AUTHERR);
}
return FM1702_OK;
}
/*
***************************************************************/
/*名称: MIF_Initival */
/*功能: 该函数实现MIFARE卡初始化值操作 */
/*输入:
buff: 四个字节初始化数值起始地址 */
/* Block_Adr: 块地址 */
/*输出:
FM1715_NOTAGERR: 无卡 */
/* FM1715_BYTECOUNTERR: 接收字节错误 */
/* FM1715_NOTAUTHERR: 未经权威认证 */
/* FM1715_EMPTY: 数据溢出错误 */
/* FM1715_CRCERR: CRC校验错 */
/* FM1715_PARITYERR: 奇偶校验错 */
/* FM1715_WRITEERR: 写卡块数据出错 */
/* FM1715_OK: 应答正确 */
/***************************************************************
*/
uchar MIF_Initival(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
uchar i;
for (i = 0; i < 4; i++)
{
*(buff + 4 + i) =~(*(buff + i));
}
for (i = 0; i < 4; i++)
{
*(buff + 8 + i)=*(buff + i);
}
*(buff + 12) = Block_Adr;
*(buff + 13) = ~Block_Adr;
*(buff + 14) = Block_Adr;
*(buff + 15) = ~Block_Adr;
temp = MIF_Write(buff, Block_Adr);
return temp;
}
/*
***************************************************************/
/*名称: HL_Read */
/*功能: 该函数实现高级读命令 */
/*输入:
Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/*输出:
操作状态码 */
/* 读出数据存于buffer中 */
/***************************************************************
*/
uchar HL_Read(uchar idata *buff,uchar Block_Adr,uchar Mode)
{
uchar temp;
temp = HL_Active(Block_Adr, Mode);
if(temp != FM1702_OK)
{
return temp;
}
//Read
temp = MIF_Read(buff,Block_Adr);
if(temp != FM1702_OK)
{
return temp;
}
return FM1702_OK;
}
/*
***************************************************************/
/*名称: HL_Write */
/*功能: 该函数实现高级写命令 */
/*输入:
buff: 待写入数据的首地址 */
/* Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/*输出:
操作状态码 */
/***************************************************************
*/
uchar HL_Write(uchar idata *buff,uchar Block_Adr,uchar Mode)
{
uchar temp;
temp = HL_Active(Block_Adr, Mode);
if(temp != FM1702_OK)
{
return temp;
}
//Write
temp = MIF_Write(buff, Block_Adr);
if(temp != FM1702_OK)
{
return FM1702_WRITEERR;
}
return FM1702_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -