📄 fm1702.c
字号:
return FM1715_REQERR;
}
/****************************************************************/
/*名称: AntiColl */
/*功能: 该函数实现对放入FM1715操作范围之内的卡片的防冲突检测*/
/*输入: N/A */
/*输出: FM1715_NOTAGERR: 无卡*/
/* FM1715_BYTECOUNTERR: 接收字节错误*/
/* FM1715_SERNRERR: 卡片序列号应答错误*/
/* FM1715_OK: 卡片应答正确*/
/****************************************************************/
uchar AntiColl(void)
{
/*~~~~~~~~~~~~~*/
uchar temp;
uchar i;
uchar row, col;
uchar pre_row;
/*~~~~~~~~~~~~~*/
row = 0;
col = 0;
pre_row = 0;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
ModConductance = 0X3f;
buffer[0] = RF_CMD_ANTICOL;
buffer[1] = 0x20;
ChannelRedundancy = 0x03; /* 关闭CRC,打开奇偶校验 */
temp = Command_Send(2, buffer, Transceive);
while(1)
{
if(temp == FALSE)
{
return(FM1715_NOTAGERR);
}
temp = ErrorFlag;
temp = FIFO_Length;
if(temp == 0)
{
return FM1715_BYTECOUNTERR;
}
Read_FIFO(buffer);
Save_UID(row, col, temp); /* 将收到的UID放入UID数组中 */
//change by hbp
//Show_UID(); /* 显示UID */
temp = ErrorFlag; /* 判断接収数据是否出错 */
temp = temp & 0x01;
if(temp == 0x00)
{
temp = Check_UID(); /* 校验收到的UID */
if(temp == FALSE)
{
return(FM1715_SERNRERR);
}
return(FM1715_OK);
}
else
{
temp = CollPos; /* 读取冲突检测寄存器 */
row = temp / 8;
col = temp % 8;
buffer[0] = RF_CMD_ANTICOL;
Set_BitFraming(row + pre_row, col); /* 设置待发送数据的字节数 */
pre_row = pre_row + row;
for(i = 0; i < pre_row + 1; i++)
{
buffer[i + 2] = UID[i];
}
if(col != 0x00)
{
row = pre_row + 1;
}
else
{
row = pre_row;
}
temp = Command_Send(row + 2, buffer, Transceive);
}
}
}
/****************************************************************/
/*名称: Select_Card */
/*功能: 该函数实现对放入FM1715操作范围之内的某张卡片进行选择*/
/*输入: N/A */
/*输出: FM1715_NOTAGERR: 无卡*/
/* FM1715_PARITYERR: 奇偶校验错*/
/* FM1715_CRCERR: CRC校验错*/
/* FM1715_BYTECOUNTERR: 接收字节错误*/
/* FM1715_OK: 应答正确*/
/* FM1715_SELERR: 选卡出错*/
/****************************************************************/
uchar Select_Card(void)
{
/*~~~~~~~~~~~~*/
uchar temp, i;
/*~~~~~~~~~~~~*/
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
buffer[0] = RF_CMD_SELECT;
buffer[1] = 0x70;
for(i = 0; i < 5; i++)
{
buffer[i + 2] = UID[i];
}
ChannelRedundancy = 0x0f; /* 开启CRC,奇偶校验校验 */
temp = Command_Send(7, buffer, Transceive);
if(temp == FALSE)
{
return(FM1715_NOTAGERR);
}
else
{
temp = ErrorFlag;
if((temp & 0x02) == 0x02) return(FM1715_PARITYERR);
if((temp & 0x04) == 0x04) return(FM1715_FRAMINGERR);
if((temp & 0x08) == 0x08) return(FM1715_CRCERR);
temp = FIFO_Length;
if(temp != 1) return(FM1715_BYTECOUNTERR);
Read_FIFO(buffer); /* 从FIFO中读取应答信息 */
temp = *buffer;
if((temp == 0x08) || (temp == 0x88) || (temp == 0x53)) /* 判断应答信号是否正确 */
return(FM1715_OK);
else
return(FM1715_SELERR);
}
}
/****************************************************************/
/*名称: Authentication */
/*功能: 该函数实现密码认证的过程*/
/*输入: UID: 卡片序列号地址*/
/* SecNR: 扇区号*/
/* mode: 模式*/
/*输出: FM1715_NOTAGERR: 无卡*/
/* FM1715_PARITYERR: 奇偶校验错*/
/* FM1715_CRCERR: CRC校验错*/
/* FM1715_OK: 应答正确*/
/* FM1715_AUTHERR: 权威认证有错*/
/****************************************************************/
uchar Authentication(uchar idata *UID, uchar SecNR, uchar mode)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~*/
uchar idata i;
uchar idata temp, temp1;
/*~~~~~~~~~~~~~~~~~~~~~~~~*/
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
ModConductance = 0x3f;
temp1 = Control;
temp1 = temp1 & 0xf7;
Control = temp1;
if(mode == RF_CMD_AUTH_LB) /* AUTHENT1 */
buffer[0] = RF_CMD_AUTH_LB;
else
buffer[0] = RF_CMD_AUTH_LA;
buffer[1] = SecNR * 4 + 3;
for(i = 0; i < 4; i++)
{
buffer[2 + i] = UID[i];
}
ChannelRedundancy = 0x0f; /* 开启CRC,奇偶校验校验 */
temp = Command_Send(6, buffer, Authent1);
if(temp == FALSE)
{
return FM1715_NOTAGERR;
}
temp = ErrorFlag;
if((temp & 0x02) == 0x02) return FM1715_PARITYERR;
if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;
if((temp & 0x08) == 0x08) return FM1715_CRCERR;
temp = Command_Send(0, buffer, Authent2); /* AUTHENT2 */
if(temp == FALSE)
{
return FM1715_NOTAGERR;
}
temp = ErrorFlag;
if((temp & 0x02) == 0x02) return FM1715_PARITYERR;
if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;
if((temp & 0x08) == 0x08) return FM1715_CRCERR;
temp1 = Control;
temp1 = temp1 & 0x08; /* Crypto1on=1验证通过 */
if(temp1 == 0x08)
{
return FM1715_OK;
}
return FM1715_AUTHERR;
}
/****************************************************************/
/*名称: MIF_Read */
/*功能: 该函数实现读MIFARE卡块的数值*/
/*输入: buff: 缓冲区首地址*/
/* Block_Adr: 块地址*/
/*输出: FM1715_NOTAGERR: 无卡*/
/* FM1715_PARITYERR: 奇偶校验错*/
/* FM1715_CRCERR: CRC校验错*/
/* FM1715_BYTECOUNTERR: 接收字节错误*/
/* FM1715_OK: 应答正确*/
/****************************************************************/
uchar MIF_READ(uchar idata *buff, uchar Block_Adr)
{
/*~~~~~~~~~~~~~~~~~*/
uchar idata temp;
/*~~~~~~~~~~~~~~~~~*/
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
ModConductance = 0X3f;
ChannelRedundancy = 0x0f;
/* 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 = ErrorFlag;
if((temp & 0x02) == 0x02) return FM1715_PARITYERR;
if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;
if((temp & 0x08) == 0x08) return FM1715_CRCERR;
temp = FIFO_Length;
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;
}
}
/****************************************************************/
/*名称: 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;
/*~~~~~~~~~~~~~~~~~~~~*/
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(FM1715_NOTAGERR);
}
temp = FIFO_Length;
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);
case 0x05: return(FM1715_PARITYERR);
default: return(FM1715_WRITEERR);
}
temp = Command_Send(16, buff, Transceive);
if(temp == TRUE)
{
return(FM1715_OK);
}
else
{
temp = ErrorFlag;
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);
}
}
/****************************************************************/
/*名称: 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;
/*~~~~~~~~~~~~~~~~~~~~*/
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 FM1715_NOTAGERR;
}
temp = FIFO_Length;
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: 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;
}
/****************************************************************/
/*名称: 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;
/*~~~~~~~~~~~~~~~~~~~~*/
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 FM1715_NOTAGERR;
}
temp = FIFO_Length;
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: 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;
}
#if 0
/****************************************************************/
/*名称: 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 FM1715_NOTAGERR;
}
temp = FIFO_Length;
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);
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;
}
#endif
/****************************************************************/
/*名称: 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;
/*~~~~~~~~~*/
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 FM1715_NOTAGERR;
}
temp = FIFO_Length;
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -