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

📄 rc531.c

📁 采用TI公司MSP430来控制RC531的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
			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                                                                     	        */
/*功能: 该函数实现对放入RC531操作范围之内的某张卡片进行选择                                             */                           	             
/*												       	*/											
/*输入:                                                                                                	*/
/*       N/A                                                                        		        */
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	RC531_NOTAGERR: 无卡                                                 		                */
/*      RC531_PARITYERR: 奇偶校验错                                                                     */
/*	RC531_CRCERR: CRC校验错										*/
/*	RC531_BYTECOUNTERR: 接收字节错误								*/
/*	RC531_OK: 应答正确										*/
/*	RC531_SELERR: 选卡出错										*/
/********************************************************************************************************/
char Select_Card(void)
{
		char temp,i;
		
		buffer[0]=RF_CMD_SELECT;
		buffer[1]=0x70;	
		for(i=0;i<5;i++)
		    buffer[i+2]=UID[i];
		rc531_register_write(ChannelRedundancy,0x0f);				//开启CRC,奇偶校验校验
		temp=Command_Send(7,buffer,Transceive);
		
		if(temp==FALSE)
			return(RC531_NOTAGERR);
		else
		{	
			temp=rc531_register_read(ErrorFlag);
			if ((temp & 0x01)==0x01)
				return(RC531_COLLERR);
			if ((temp & 0x02)==0x02)
				return(RC531_PARITYERR);
			if((temp & 0x04)==0x04)
				return(RC531_FRAMINGERR);
			if ((temp & 0x08)==0x08)
				return(RC531_CRCERR);
			
			temp=rc531_register_read(FIFO_Length);
			if (temp!=1)
				return(RC531_BYTECOUNTERR);
			Read_FIFO(buffer);			//从FIFO中读取应答信息
			if (*buffer==SAK_BYTE0 || *buffer==SAK_BYTE1)	//判断应答信号是否正确
				return(RC531_OK);
			else 
				return(RC531_SELERR);
		}
}


/********************************************************************************************************/
/*名称: Read_E2                                                                     	               	*/
/*功能: 该函数实现从RC531的EE中读出数据                                                                	*/                           	             
/*												        */
/*输入:                                                                                                	*/
/*       lsb, EE地址(低字节)                                                                           	*/
/*	 msb, EE地址(高字节)                                                                           	*/
/*       count, 待读出数据EE的字节个数                                                                 	*/
/*	 buff, 指向待读出数据的指针                                                                    	*/
/*												        */
/*输出:                                                                                                	*/
/*	TRUE, EE数据正确读出                                                 		               	*/
/*	FALSE, EE数据读出有误  	                                       				        */
/********************************************************************************************************/
char Read_E2(char lsb,char msb,char count,char  *buff)
{
	char temp;
	
	*buff=lsb;
	*(buff+1)=msb;
	*(buff+2)=count;
	temp=Command_Send(3,buff,ReadE2);
	Read_FIFO(buff);
	return(temp);		
}

/********************************************************************************************************/
/*名称: Write_E2                                                                     	               	*/
/*功能: 该函数实现向RC531的EE中写入数据                                                                	*/                           	             
/*												        */											
/*输入:                                                                                                	*/
/*       lsb, EE地址(低字节)                                                                           	*/
/*	 msb, EE地址(高字节)                                                                           	*/
/*       count, 待写入数据EE的字节个数                                                                 	*/
/*	 buff, 指向待写入数据的指针                                                                    	*/
/*												       	*/
/*输出:                                                                                                	*/
/*	 TRUE, EE数据正确写入  				                                                */
/*	 FALSE, EE数据写入有误  	                                       				*/
/********************************************************************************************************/
char Write_E2(char lsb,char msb,char count,char  *buff)
{

	char temp,i;
	
	for(i=0;i<count;i++)
		*(buff+count-i+2)=*(buff-i+count);
	*buff=lsb;
	*(buff+1)=msb;
	temp=Command_Send(count+2,buff,WriteE2);
	temp=rc531_register_read(SecondaryStatus);
	temp=temp & 0x40;
	if (temp==0x40)
		return(TRUE);
	else
		return(FALSE);
}

/********************************************************************************************************/
/*名称: Load_key_CPY                                                                     	     	*/
/*功能: 该函数实现把FIFO中的密码存入rc531的keybuffer中                                                  */                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/*       keybuff: 密码首地址                                                                            */
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 TRUE: 密钥装载成功				              					*/
/*	 FALSE: 密钥装载失败										*/
/********************************************************************************************************/
char Load_key_CPY(char *keybuff)
{
	char temp;
	
	temp=Command_Send(12,keybuff,LoadKey);
	temp=(rc531_register_read(ErrorFlag)) & 0x40;
	if (temp==0x40)
		return(FALSE);
	return(TRUE);
}
	
/********************************************************************************************************/
/*名称: Load_keyE2                                                                     	     	  	*/
/*功能: 该函数实现把E2中密码存入rc531的keybuffer中                                                  	*/                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/*       Secnr: EE起始地址                                                                    		*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 True: 密钥装载成功			               						*/
/*       False: 密钥装载失败										*/
/********************************************************************************************************/
char	Load_keyE2_CPY(char Secnr,char Mode)
{
	char temp;
	char msb=0;
	char lsb=0;
	
	temp = Secnr * 12;
	if (Mode==0)
	{
		if (temp>=0x80)							//计算密码存放地址
		{
			lsb=temp-0x80;
			msb=0x01;
		}
		else
		{
			msb=0x00;
			lsb=temp+0x80;
		}
	}
	else
	{
		msb=0x01;
		lsb=temp+0x40;
	}
	buffer[0]=lsb;
	buffer[1]=msb;
	temp=Command_Send(2,buffer,LoadKeyE2);
	temp=(rc531_register_read(ErrorFlag)) & 0x40;
	if (temp==0x40)
		return(FALSE);
	return(TRUE);
}

/********************************************************************************************************/
/*名称: Authentication                                                                     	     	*/
/*功能: 该函数实现密码认证的过程                                                  			*/                           	             
/*													*/											      																								
/*输入:                                                                                                	*/
/*      UID: 卡片序列号地址										*/ 
/* 	SecNR: 扇区号                                                                 			*/
/*      mode: 模式                                                                                      */
/*      0 : KeyA                                                                                        */
/*      1 : KeyB                                                                             	        */
/*输出:                                                                                                	*/
/*	RC531_NOTAGERR:	无卡										*/
/*      RC531_PARITYERR: 奇偶校验错									*/
/*      RC531_CRCERR: CRC校验错										*/
/*	RC531_OK: 应答正确	      									*/         
/* 	RC531_AUTHERR: 权威认证有错									*/
/********************************************************************************************************/
char	Authentication(char  *UID,char SecNR,char mode)
{
	char i;
	char temp,temp1;
	
	temp1=rc531_register_read(Control);
	temp1=temp1 & 0xf7;
	rc531_register_write(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];
	rc531_register_write(ChannelRedundancy,0x0f);						//开启CRC,奇偶校验校验
	temp=Command_Send(6,buffer,Authent1);		                
	if (temp==FALSE)
		return(RC531_NOTAGERR);					
	temp=rc531_register_read(ErrorFlag);
	if ((temp & 0x01)==0x01)
		return(RC531_COLLERR);
	if ((temp & 0x02)==0x02)
		return(RC531_PARITYERR);
	if ((temp & 0x04)==0x04)
		return(RC531_FRAMINGERR);
	if ((temp & 0x08)==0x08)
		return(RC531_CRCERR);
														
	temp=Command_Send(0,buffer,Authent2);				//AUTHENT2
	if(temp==FALSE)
		return(RC531_NOTAGERR);
	temp=rc531_register_read(ErrorFlag);
	if ((temp & 0x01)==0x01)
		return(RC531_COLLERR);
	if ((temp & 0x02)==0x02)
		return(RC531_PARITYERR);
	if ((temp & 0x04)==0x04)
		return(RC531_FRAMINGERR);
	if ((temp & 0x08)==0x08)
		return(RC531_CRCERR);
	temp1=rc531_register_read(Control);
	temp1=temp1 & 0x08;						//Crypto1on=1,验证通过
	if (temp1==0x08)
		return(RC531_OK);
	else 
		return(RC531_AUTHERR);	
}

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

/********************************************************************************************************/
/*名称: MIF_Write                                                                     	     	  	*/
/*功能: 该函数实现写MIFARE卡块的数值                                                  			*/                           	             
/*												      	*/											
/*输入:                                                                                                	*/
/*      buff: 缓冲区首地址										*/
/*	Block_Adr: 块地址										*/
/*输出:                                                                                                	*/
/*	RC531_NOTAGERR: 无卡			               						*/
/*	RC531_BYTECOUNTERR: 接收字节错误								*/
/*	RC531_NOTAUTHERR: 未经权威认证									*/
/*	RC531_EMPTY: 数据溢出错误									*/

⌨️ 快捷键说明

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