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

📄 rc531.c

📁 由华邦单片机w78e516bc1来控制RC531设计的一款读写器
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 	SecNR: 扇区号                                                                 			*/
/*      mode: 模式                                                                              	*/
/*输出:                                                                                                	*/
/*	FM222_NOTAGERR:	无卡										*/
/*      FM222_PARITYERR: 奇偶校验错									*/
/*      FM222_CRCERR: CRC校验错										*/
/*	FM222_OK: 应答正确	      									*/         
/* 	FM222_AUTHERR: 权威认证有错									*/
/********************************************************************************************************/
uchar	Authentication(uchar idata *UID,uchar SecNR,uchar mode)
{
	uchar idata i;
	uchar idata temp,temp1;
	
	temp1=Control;
	temp1=temp1 & 0xf7;
	Control=temp1;
	
	if (mode==1)							//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(FM222_NOTAGERR);					
	temp=ErrorFlag;
	if ((temp & 0x02)==0x02)
		return(FM222_PARITYERR);
	if((temp & 0x04)==0x04)
		return(FM222_FRAMINGERR);
	if ((temp & 0x08)==0x08)
		return(FM222_CRCERR);
														
	temp=Command_Send(0,buffer,Authent2);				//AUTHENT2
	if(temp==FALSE)
		return(FM222_NOTAGERR);
	temp=ErrorFlag;
	if ((temp & 0x02)==0x02)
		return(FM222_PARITYERR);
	if((temp & 0x04)==0x04)
		return(FM222_FRAMINGERR);
	if ((temp & 0x08)==0x08)
		return(FM222_CRCERR);
	temp1=Control;
	temp1=temp1 & 0x08;						//Crypto1on=1,验证通过
	if (temp1==0x08)
		return(FM222_OK);
	else 
		return(FM222_AUTHERR);	
}

/********************************************************************************************************/
/*名称: MIF_Read                                                                     	     	  	*/
/*功能: 该函数实现读MIFARE卡块的数值                                                  			*/                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/*      buff: 缓冲区首地址      									*/
/*	Block_Adr: 块地址                                                                 		*/
/*输出:                                                                                                	*/
/*	FM222_NOTAGERR: 无卡			               						*/
/*	FM222_PARITYERR: 奇偶校验错									*/
/*	FM222_CRCERR: CRC校验错										*/
/*	FM222_BYTECOUNTERR: 接收字节错误								*/
/*	FM222_OK: 应答正确										*/
/********************************************************************************************************/
uchar MIF_READ(uchar idata *buff,uchar Block_Adr)
{
	uchar idata temp;
	
	ChannelRedundancy=0x0f;
	//Int_Req=0x7f;
	buff[0]=RF_CMD_READ;
	buff[1]=Block_Adr;
	temp=Command_Send(2,buff,Transceive);
	if (temp==0)
		return(FM222_NOTAGERR);
	
	temp=ErrorFlag;
	if ((temp & 0x02)==0x02)
		return(FM222_PARITYERR);
	if((temp & 0x04)==0x04)
		return(FM222_FRAMINGERR);
	if ((temp & 0x08)==0x08)
		return(FM222_CRCERR);
		
	temp=FIFO_Length;
	if (temp!=0x10)
		return(FM222_BYTECOUNTERR);	
	Read_FIFO(buff);
	return(FM222_OK);	
}

/********************************************************************************************************/
/*名称: MIF_Write                                                                     	     	  	*/
/*功能: 该函数实现写MIFARE卡块的数值                                                  			*/                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/*      buff: 缓冲区首地址										*/
/*	Block_Adr: 块地址										*/
/*输出:                                                                                                	*/
/*	FM222_NOTAGERR: 无卡			               						*/
/*	FM222_BYTECOUNTERR: 接收字节错误								*/
/*	FM222_NOTAUTHERR: 未经权威认证									*/
/*	FM222_EMPTY: 数据溢出错误									*/
/*	FM222_CRCERR: CRC校验错										*/
/*	FM222_PARITYERR: 奇偶校验错									*/
/*	FM222_WRITEERR: 写卡块数据出错									*/
/*	FM222_OK: 应答正确										*/
/********************************************************************************************************/
uchar MIF_Write(uchar idata *buff,uchar Block_Adr)
{
	uchar idata temp;
	uchar idata *F_buff;
	
	F_buff=buff+0x10;
	ChannelRedundancy=0x0f;
	*F_buff=RF_CMD_WRITE;
	*(F_buff+1)=Block_Adr;
	temp=Command_Send(2,F_buff,Transceive);
	if (temp==FALSE)
		return(FM222_NOTAGERR);
	temp=FIFO_Length;
	if (temp==0)
		return(FM222_BYTECOUNTERR);
	Read_FIFO(F_buff);
	temp=*F_buff;
	switch(temp)
	{
		case 0x00 :
			return(FM222_NOTAUTHERR);
		case 0x04:
			return(FM222_EMPTY);
		case 0x0a:
			break;
		case 0x01:
			return(FM222_CRCERR);
		case 0x05:
			return(FM222_PARITYERR);
		default:
			return(FM222_WRITEERR);
	}
	
	temp=Command_Send(16,buff,Transceive);
	if (temp==TRUE)
		return(FM222_OK);
	else 
	{
		temp=ErrorFlag;
		if ((temp & 0x02)==0x02)
			return(FM222_PARITYERR);
		else if((temp & 0x04)==0x04)
			return(FM222_FRAMINGERR);
		else if ((temp & 0x08)==0x08)
			return(FM222_CRCERR);
		else 
			return(FM222_WRITEERR);
	}			
}

/********************************************************************************************************/
/*名称: MIF_Halt                                                                     	     	  	*/
/*功能: 该函数实现暂停MIFARE卡						                                */                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/* 	N/A     		                                                               		*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	FM222_OK: 应答正确			               						*/
/*	FM222_PARITYERR: 奇偶校验错									*/
/*	FM222_CRCERR: CRC校验错										*/
/*	FM222_NOTAGERR: 无卡										*/
/********************************************************************************************************/
uchar MIF_Halt(void)
{
	uchar temp;
	
	ChannelRedundancy=0x03;
	*buffer=RF_CMD_HALT;
	*(buffer+1)=0x00;
	temp=Command_Send(2,buffer,Transmit);
	if (temp==TRUE)
		return(FM222_OK);
	else 
	{
		temp=ErrorFlag;
		if ((temp & 0x02)==0x02)
			return(FM222_PARITYERR);
		if ((temp & 0x04)==0x04)
			return(FM222_FRAMINGERR);
		return(FM222_NOTAGERR);
	}
}

/********************************************************************************************************/
/*名称: MIF_Initival                                                                     	   	*/
/*功能: 该函数实现MIFARE卡初始化值操作						                        */                           	             
/*												      	*/											
/*输入:													*/  
/*	buff: 四个字节初始化数值起始地址								*/
/*      Block_Adr: 块地址                                                          	                */
/*       		                                                               		       	*/
/*输出:                                                                                                	*/
/*	FM222_NOTAGERR: 无卡			               						*/
/*	FM222_BYTECOUNTERR: 接收字节错误								*/
/*	FM222_NOTAUTHERR: 未经权威认证									*/
/*	FM222_EMPTY: 数据溢出错误									*/
/*	FM222_CRCERR: CRC校验错										*/
/*	FM222_PARITYERR: 奇偶校验错									*/
/*	FM222_WRITEERR: 写卡块数据出错									*/
/*	FM222_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);
}

/********************************************************************************************************/
/*名称: MIF_Increment                                                                     	        */
/*功能: 该函数实现MIFARE卡自动增值操作						                        */                           	             
/*													*/												      																								
/*输入:  												*/
/*	buff: 四个字节数值起始地址                                                                	*/
/*      Block_Adr: 块地址		                                                               	*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	FM222_NOTAGERR: 无卡			               						*/
/*	FM222_BYTECOUNTERR: 接收字节错误								*/
/*	FM222_NOTAUTHERR: 未经权威认证									*/
/*	FM222_EMPTY: 数据溢出错误									*/
/*	FM222_CRCERR: CRC校验错										*/
/*	FM222_PARITYERR: 奇偶校验错									*/
/*	FM222_INCRERR: 卡片增款操作失败									*/
/*	FM222_OK: 应答正确										*/
/********************************************************************************************************/
uchar MIF_Increment(uchar idata *buff,uchar Block_Adr)
{
	uchar temp;
	uchar idata *F_buff;
	
	F_buff=buff+4;
	*F_buff=RF_CMD_INC;
	*(F_buff+1)=Block_Adr;
	ChannelRedundancy=0x0f;
	temp=Command_Send(2,F_buff,Transceive);
	if (temp==FALSE)
		return(FM222_NOTAGERR);
	temp=FIFO_Length;
	if (temp==0)
		return(FM222_BYTECOUNTERR);
	Read_FIFO(F_buff);
	temp=*F_buff;
	switch(temp)
	{
		case 0x00 :
			return(FM222_NOTAUTHERR);
		case 0x04:
			return(FM222_EMPTY);
		case 0x0a:
			break;
		case 0x01:
			return(FM222_CRCERR);
		case 0x05:
			return(FM222_PARITYERR);
		default:
			return(FM222_INCRERR);
	}
	
	temp=Command_Send(4,buff,Transmit);
	if (temp==FALSE)
		return(FM222_INCRERR);
	return(FM222_OK);	
}


/********************************************************************************************************/
/*名称: MIF_Decrement                                                                     	      	*/
/*功能: 该函数实现MIFARE卡自动减值操作						                        */                           	             
/*												      	*/											
/*输入:  												*/
/*	buff: 四个字节数值起始地址                                                                	*/
/*      Block_Adr: 块地址		                                                               	*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	FM222_NOTAGERR: 无卡			               						*/
/*	FM222_BYTECOUNTERR: 接收字节错误								*/
/*	FM222_NOTAUTHERR: 未经权威认证									*/
/*	FM222_EMPTY: 数据溢出错误									*/
/*	FM222_CRCERR: CRC校验错										*/
/*	FM222_PARITYERR: 奇偶校验错									*/
/*	FM222_DECRERR: 卡片扣款操作失败									*/
/*	FM222_OK: 应答正确										*/
/********************************************************************************************************/
uchar MIF_Decrement(uchar idata *buff,uchar Block_Adr)
{
	uchar temp;
	uchar idata *F_buff;
	
	F_buff=buff+4;
	*F_buff=RF_CMD_DEC;
	*(F_buff+1)=Block_Adr;
	ChannelRedundancy=0x0f;
	temp=Command_Send(2,F_buff,Transceive);
	if (temp==FALSE)
		return(FM222_NOTAGERR);
	temp=FIFO_Length;
	if (temp==0)
		return(FM222_BYTECOUNTERR);
	Read_FIFO(F_buff);
	temp=*F_buff;
	switch(temp)
	{
		case 0x00 :
			return(FM222_NOTAUTHERR);
		case 0x04:
			return(FM222_EMPTY);
		case 0x0a:
			break;
		case 0x01:
			return(FM222_CRCERR);
		case 0x05:
			return(FM222_PARITYERR);
		default:
			return(FM222_DECRERR);
	}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -