📄 fm1715.c
字号:
//Int_Req=0x7f;
buff[0] = RF_CMD_READ;
buff[1] = Block_Adr;
temp = Command_Send(2, buff, Transceive);
if (temp == 0)
{
return FM1715_NOTAGERR;
}
temp = ErrorFlagR;
if ((temp & 0x02) == 0x02) return FM1715_PARITYERR;
if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;
if ((temp & 0x08) == 0x08) return FM1715_CRCERR;
temp = FIFO_LengthR;
if (temp == 0x10) //8K卡读数据长度为16
{
Read_FIFO(buff);
return FM1715_OK;
}
else if (temp == 0x04) //Token 卡读数据长度为16
{
Read_FIFO(buff);
return FM1715_OK;
}
else
{
return FM1715_BYTECOUNTERR;
}
}
//第 39 页 共 52 页
//5.4.8 WRITE
//****************************************************************
//*名称: MIF_Write
//*功能: 该函数实现写MIFARE 卡块的数值
//*输入: buff: 缓冲区首地址
//* Block_Adr: 块地址
//*输出: FM1715_NOTAGERR: 无卡
//* FM1715_BYTECOUNTERR: 接收字节错误
//* FM1715_NOTAUTHERR: 未经权威认证
//* FM1715_EMPTY: 数据溢出错误
//* FM1715_CRCERR: CRC 校验错
//* FM1715_PARITYERR: 奇偶校验错
//* FM1715_WRITEERR: 写卡块数据出错
//* FM1715_OK: 应答正确
//****************************************************************
uchar MIF_Write(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
uchar idata *F_buff;
CRCPresetLSBW(0x63);
CWConductanceW(0x3f);
F_buff = buff + 0x10;
ChannelRedundancyW(0x07);
*F_buff = RF_CMD_WRITE;
*(F_buff + 1) = Block_Adr;
temp = Command_Send(2, F_buff, Transceive);
if (temp == FALSE)
{
return(FM1715_NOTAGERR);
}
temp = FIFO_LengthR;
if (temp == 0)
{
return(FM1715_BYTECOUNTERR);
}
Read_FIFO(F_buff);
temp = *F_buff;
switch (temp)
{
case 0x00 :
return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1715_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM1715_CRCERR);
//第 40 页 共 52 页
case 0x05:
return(FM1715_PARITYERR);
default:
return(FM1715_WRITEERR);
}
temp = Command_Send(16, buff, Transceive);
if (temp == TRUE)
{
return(FM1715_OK);
}
else
{
temp = ErrorFlagR;
if ((temp & 0x02)==0x02)
return(FM1715_PARITYERR);
else if((temp & 0x04)==0x04)
return(FM1715_FRAMINGERR);
else if ((temp & 0x08)==0x08)
return(FM1715_CRCERR);
else
return(FM1715_WRITEERR);
}
}
//第 49 页 共 52 页
//六、例程
//注意:在下列操作前,应先将获取的密钥(6 字节)存放于keybuffer[ ]缓冲区中。
//6.1 卡片触发
//****************************************************************
//*名称: HL_Active
//*功能: 该函数实现高级MIFARE 卡激活命令
//*输入: Mode: 认证模式 =0表示用密码A认证,=1表示用密码B认证
//* 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 != FM1715_OK)
{
return(FM1715_REQERR);
}
temp = AntiColl(); //AntiCol
if(temp != FM1715_OK)
{
return(FM1715_ANTICOLLERR);
}
temp = Select_Card(); //Select
if(temp != FM1715_OK)
{
return(FM1715_SELERR);
}
Load_key_CPY(); //LoadKey
// Load_keyE2_CPY((Secnr%16), Mode); //LoadKey
temp = Authentication(UID, Secnr, Mode);//Authentication
if(temp != FM1715_OK)
{
return(FM1715_AUTHERR);
}
return FM1715_OK;
}
//第 51 页 共 52 页
//6.3 读卡
//***************************************************************
//*名称: HL_Read
//*功能: 该函数实现高级读命令
//*输入: Mode: 认证模式 =0表示用密码A认证,=1表示用密码B认证
//* Block_Adr: 块地址
//*输出: 操作状态码
//* 读出数据存于buffer 中
//****************************************************************
uchar HL_Read(uchar idata *buff,uchar Block_Adr,uchar Mode)
{
uchar temp;
temp = HL_Active(Block_Adr, Mode);
if(temp != FM1715_OK)
{
return temp;
}
//Read
temp = MIF_READ(buff,Block_Adr);
if(temp != FM1715_OK)
{
return temp;
}
return FM1715_OK;
}
//第 52 页 共 52 页
//6.4 写卡
//****************************************************************
//*名称: HL_Write
//*功能: 该函数实现高级写命令
//*输入: buff: 待写入数据的首地址
//* Mode: 认证模式 =0表示用密码A认证,=1表示用密码B认证
//* Block_Adr: 块地址
//*输出:操作状态码
//****************************************************************
uchar HL_Write(uchar idata *buff,uchar Block_Adr,uchar Mode)
{
uchar temp;
temp = HL_Active(Block_Adr, Mode);
if(temp != FM1715_OK)
{
return temp;
}
//Write
temp = MIF_Write(buff, Block_Adr);
if(temp != FM1715_OK)
{
return FM1715_WRITEERR;
}
return FM1715_OK;
}
//*************************************************************************************************
//以下是比较少用的命令子程序
//第 41 页 共 52 页
//5.4.9 INCREMENT
//****************************************************************
//*名称: MIF_Increment
//*功能: 该函数实现MIFARE 卡自动增值操作
//*输入: buff: 四个字节数值起始地址
//* Block_Adr: 块地址
//*输出: FM1715_NOTAGERR: 无卡
//* FM1715_BYTECOUNTERR: 接收字节错误
//* FM1715_NOTAUTHERR: 未经权威认证
//* FM1715_EMPTY: 数据溢出错误
//* FM1715_CRCERR: CRC 校验错
//* FM1715_PARITYERR: 奇偶校验错
//* FM1715_INCRERR: 卡片增款操作失败
//* FM1715_OK: 应答正确
//****************************************************************
uchar MIF_Increment(uchar idata *buff,uchar Block_Adr)
{
uchar temp;
uchar idata *F_buff;
CRCPresetLSBW(0x63);
CWConductanceW(0x3f);
F_buff = buff + 4;
*F_buff = RF_CMD_INC;
*(F_buff + 1) = Block_Adr;
ChannelRedundancyW(0x07);
temp = Command_Send(2, F_buff, Transceive);
if (temp == FALSE)
{
return FM1715_NOTAGERR;
}
temp = FIFO_LengthR;
if (temp == 0)
{
return FM1715_BYTECOUNTERR;
}
Read_FIFO(F_buff);
temp = *F_buff;
switch(temp)
{
case 0x00 :
//break;
return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1715_EMPTY);
case 0x0a:
break;
case 0x01:
//第 42 页 共 52 页
return(FM1715_CRCERR);
case 0x05:
return(FM1715_PARITYERR);
default:
return(FM1715_INCRERR);
}
temp = Command_Send(4, buff, Transmit);
if (temp == FALSE)
{
return FM1715_INCRERR;
}
return FM1715_OK;
}
//第 43 页 共 52 页
//5.4.10 DECREMENT
//****************************************************************
//*名称: MIF_Decrement
//*功能: 该函数实现MIFARE 卡自动减值操作
//*输入: buff: 四个字节数值起始地址
//* Block_Adr: 块地址
//*输出: FM1715_NOTAGERR: 无卡
//* FM1715_BYTECOUNTERR: 接收字节错误
//* FM1715_NOTAUTHERR: 未经权威认证
//* FM1715_EMPTY: 数据溢出错误
//* FM1715_CRCERR: CRC 校验错
//* FM1715_PARITYERR: 奇偶校验错
//* FM1715_DECRERR: 卡片扣款操作失败
//* FM1715_OK: 应答正确
//****************************************************************
uchar MIF_Decrement(uchar idata *buff,uchar Block_Adr)
{
uchar temp;
uchar idata *F_buff;
CRCPresetLSBW(0x63);
CWConductanceW(0x3f);
F_buff = buff + 4;
*F_buff = RF_CMD_DEC;
*(F_buff + 1) = Block_Adr;
ChannelRedundancyW(0x07);
temp = Command_Send(2, F_buff, Transceive);
if (temp == FALSE)
{
return FM1715_NOTAGERR;
}
temp = FIFO_LengthR;
if (temp == 0)
{
return FM1715_BYTECOUNTERR;
}
Read_FIFO(F_buff);
temp = *F_buff;
switch (temp)
{
case 0x00 :
//break;
return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1715_EMPTY);
case 0x0a:
break;
case 0x01:
//第 44 页 共 52 页
return(FM1715_CRCERR);
case 0x05:
return(FM1715_PARITYERR);
default:
return(FM1715_DECRERR);
}
temp = Command_Send(4, buff, Transmit);
if (temp == FALSE)
{
return(FM1715_DECRERR);
}
return FM1715_OK;
}
//第 45 页 共 52 页
//5.4.11 RESTORE
//****************************************************************
//*名称: 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;
CRCPresetLSBW(0x63);
CWConductanceW(0x3f);
ChannelRedundancyW(0x07);
*buffer = RF_CMD_RESTORE;
*(buffer + 1) = Block_Adr;
temp = Command_Send(2, buffer, Transceive);
if (temp == FALSE)
{
return FM1715_NOTAGERR;
}
temp = FIFO_LengthR;
if (temp == 0)
{
return FM1715_BYTECOUNTERR;
}
Read_FIFO(buffer);
temp = *buffer;
switch (temp)
{
case 0x00 :
//break;
return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1715_EMPTY);
case 0x0a:
break;
case 0x01:
return(FM1715_CRCERR);
case 0x05:
return(FM1715_PARITYERR);
//第 46 页 共 52 页
default:
return(FM1715_RESTERR);
}
for (i = 0; i < 4; i++)
buffer[i] = 0x00;
temp = Command_Send(4, buffer, Transmit);
if (temp == FALSE)
{
return FM1715_RESTERR;
}
return FM1715_OK;
}
//第 47 页 共 52 页
//5.4.12 TRANSFER
//****************************************************************
//*名称: MIF_Transfer
//*功能: 该函数实现MIFARE 卡电子钱包保存操作
//*输入: Block_Adr: 块地址
//*输出: FM1715_NOTAGERR: 无卡
//* FM1715_BYTECOUNTERR: 接收字节错误
//* FM1715_NOTAUTHERR: 未经权威认证
//* FM1715_EMPTY: 数据溢出错误
//* FM1715_CRCERR: CRC 校验错
//* FM1715_PARITYERR: 奇偶校验错
//* FM1715_TRANSERR: 卡片恢复,备份操作失败
//* FM1715_OK: 应答正确
//****************************************************************
uchar MIF_Transfer(uchar Block_Adr)
{
uchar temp;
CRCPresetLSBW(0x63);
CWConductanceW(0x3f);
ChannelRedundancyW(0x07);
buffer[0] = RF_CMD_TRANSFER;
buffer[1] = Block_Adr;
temp = Command_Send(2, buffer, Transceive);
if (temp == FALSE)
{
return FM1715_NOTAGERR;
}
temp = FIFO_LengthR;
if (temp == 0)
{
return FM1715_BYTECOUNTERR;
}
Read_FIFO(buffer);
temp = *buffer;
switch (temp)
{
case 0x00 :
//break;
return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(FM1715_EMPTY);
case 0x0a:
return(FM1715_OK);
case 0x01:
return(FM1715_CRCERR);
case 0x05:
return(FM1715_PARITYERR);
//第 48 页 共 52 页
default:
return(FM1715_TRANSERR);
}
}
//第 50 页 共 52 页
//6.2 INITVAL VALUE
//****************************************************************
//*名称: 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;
}
//第 25 页 共 47 页
//5.3.5 向FM1715的EEPROM中写入数据
//****************************************************************
//*名称: Write_E2
//*功能: 该函数实现向FM1715的EE中写入数据
//*输入: lsb, EE地址(低字节)
//* msb, EE地址(高字节)
//* count, 待写入数据EE的字节个数
//* buff, 指向待写入数据的指针
//*输出: TRUE, EE数据正确写入
//* FALSE, EE数据写入有误
//****************************************************************
uchar Write_E2(uchar lsb,uchar msb,uchar count,uchar idata *buff)
{
uchar i;
for(i = 0;i < count; i++)
{
*(buff + count - i + 2) = *(buff - i + count);
}
*buff = lsb;
*(buff + 1) = msb;
if(Command_Send(count + 2, buff, WriteE2)==TRUE)
{
if((SecondaryStatusR & 0x40)==0x40)
return TRUE;
}
return FALSE;
}
*/
//5.3.4 读FM1715中的EEPROM数据
//****************************************************************
//*名称: Read_E2
//*功能: 该函数实现从FM1715的EE中读出数据
//*输入: lsb, EE地址(低字节)
//* msb, EE地址(高字节)
//* count, 待读出数据EE的字节个数
//* buff, 指向待读出数据的指针
//*输出: TRUE, EE数据正确读出
//* FALSE, EE数据读出有误
//****************************************************************
/*
uchar Read_E2(uchar lsb,uchar msb,uchar count,uchar *buff)
{
uchar temp;
*buff=lsb;
*(buff+1)=msb;
*(buff+2)=count;
temp=Command_Send(3,buff,ReadE2);
if(temp==TRUE)
{
Read_FIFO(buff,4); //LJL 050415
return(TRUE);
}
return(FALSE);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -