📄 fm1702.c
字号:
pre_row = 0; write_reg(0x23,0x63); write_reg(0x12,0x3f); write_reg(0x13,0x3f); buffer[0] = RF_CMD_ANTICOL; buffer[1] = 0x20; write_reg(0x22,0x03); /* 关闭CRC,打开奇偶校验 */ temp = Command_Send(2, buffer, Transceive); while(1) { if(temp == FALSE) { return(FM1715_NOTAGERR); } temp = read_reg(0x0A); temp = read_reg(0x04); if(temp == 0) { return FM1715_BYTECOUNTERR; } Read_FIFO(buffer); Save_UID(row, col, temp); /* 将收到的UID放入UID数组中 */ temp = read_reg(0x0A); /* 判断接収数据是否出错 */ temp = temp & 0x01; if(temp == 0x00) { temp = Check_UID(); /* 校验收到的UID */ if(temp == FALSE) { return(FM1715_SERNRERR); } return(FM1715_OK); } else { temp = read_reg(0x0B); /* 读取冲突检测寄存器 */ 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; /*~~~~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); buffer[0] = RF_CMD_SELECT; buffer[1] = 0x70; for(i = 0; i < 5; i++) { buffer[i + 2] = UID[i]; } write_reg(0x22,0x0f); /* 开启CRC,奇偶校验校验 */ temp = Command_Send(7, buffer, Transceive); if(temp == FALSE) { return(FM1715_NOTAGERR); } else { temp = read_reg(0x0A); if((temp & 0x02) == 0x02) return(FM1715_PARITYERR); if((temp & 0x04) == 0x04) return(FM1715_FRAMINGERR); if((temp & 0x08) == 0x08) return(FM1715_CRCERR); temp = read_reg(0x04); if(temp != 1) return(FM1715_BYTECOUNTERR); Read_FIFO(buffer); /* 从FIFO中读取应答信息 */ temp = *buffer; /* 判断应答信号是否正确 */ //change by hbp if((temp == 0x08) || (temp == 0x88) || (temp == 0x53) ||(temp == 0x18)) //S70 temp = 0x18 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; /*~~~~~~~~~~~~~~~~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); write_reg(0x13,0x3f); temp1 = read_reg(0x09); temp1 = temp1 & 0xf7; write_reg(0x09,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]; } write_reg(0x22,0x0f); /* 开启CRC,奇偶校验校验 */ temp = Command_Send(6, buffer, Authent1); if(temp == FALSE) { return FM1715_NOTAGERR; } temp = read_reg(0x0A); 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 = read_reg(0x0A); if((temp & 0x02) == 0x02) return FM1715_PARITYERR; if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR; if((temp & 0x08) == 0x08) return FM1715_CRCERR; temp1 = read_reg(0x09); 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; /*~~~~~~~~~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); write_reg(0x13,0x3f); write_reg(0x22,0x0f); buff[0] = RF_CMD_READ; buff[1] = Block_Adr; temp = Command_Send(2, buff, Transceive); if(temp == 0) { return FM1715_NOTAGERR; } temp = read_reg(0x0A); if((temp & 0x02) == 0x02) return FM1715_PARITYERR; if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR; if((temp & 0x08) == 0x08) return FM1715_CRCERR; temp = read_reg(0x04); 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; /*~~~~~~~~~~~~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); F_buff = buff + 0x10; write_reg(0x22,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 = read_reg(0x04); 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 = read_reg(0x0A); 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; /*~~~~~~~~~~~~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); F_buff = buff + 4; *F_buff = RF_CMD_INC; *(F_buff + 1) = Block_Adr; write_reg(0x22,0x07); temp = Command_Send(2, F_buff, Transceive); if(temp == FALSE) { return FM1715_NOTAGERR; } temp = read_reg(0x04); 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; /*~~~~~~~~~~~~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); F_buff = buff + 4; *F_buff = RF_CMD_DEC; *(F_buff + 1) = Block_Adr; write_reg(0x22,0x07); temp = Command_Send(2, F_buff, Transceive); if(temp == FALSE) { return FM1715_NOTAGERR; } temp = read_reg(0x04); 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; /*~~~~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); write_reg(0x22,0x07); *buffer = RF_CMD_RESTORE; *(buffer + 1) = Block_Adr; temp = Command_Send(2, buffer, Transceive); if(temp == FALSE) { return FM1715_NOTAGERR; } temp = read_reg(0x04); 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; /*~~~~~~~~~*/ write_reg(0x23,0x63); write_reg(0x12,0x3f); write_reg(0x22,0x07); buffer[0] = RF_CMD_TRANSFER; buffer[1] = Block_Adr; temp = Command_Send(2, buffer, Transceive); if(temp == FALSE) { return FM1715_NOTAGERR; } temp = read_reg(0x04); 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); default: return(FM1715_TRANSERR); }}#if 0/****************************************************************//*名称: HL_Active *//*功能: 该函数实现高级MIFARE卡激活命令*//*输入: Secnr: 扇区号*//* Block_Adr: 块地址*//*输出: 操作状态码*//* 读出数据存于buffer中*//****************************************************************/uchar HL_Active(uchar Block_Adr, uchar Mode){ /*~~~~~~~~~*/ uchar temp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -