⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm1702.c

📁 很好用的FM1702的读写程序
💻 C
📖 第 1 页 / 共 3 页
字号:
**************************************************************
*/ 
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 + -