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

📄 rc531.c

📁 采用TI公司MSP430来控制RC531的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
//	 buff, 指向待发送数据的指针                                            //
//       Comm_Set, 命令码                                                      //
//									       //
//输出:                                                                        //
//	TRUE, 命令被正确执行                                                   //
//	FALSE, 命令执行错误  	                                       	       //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
char Command_Send(char count,char * buff,char Comm_Set)
{
	char  j,temp;
	rc531_register_write(Command,Idle);
	Clear_FIFO();
	Write_FIFO(count,buff);			
	rc531_register_write(Command,Comm_Set);			//命令执行
        RC531_Transceive_FLAG_HIGH;	  //FOR TEST
	for(j=0;j<RF_TimeOut;j++)				//检查命令执行否
	{
	    temp=rc531_register_read(Command);
	    if(temp==0x00)
		{     RC531_Transceive_FLAG_LOW;   //FOR TEST
			return(TRUE);
	        }
	}
	return(FALSE);	
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: Judge_Req                                                              //
//功能: 该函数实现对卡片复位应答信号的判断                                     //        	             
//									       //								
//输入:                                                                        //
//       *buff, 指向应答数据的指针                                             //
//                                                                             //
//输出:                                                                        //
//	 TRUE, 卡片应答信号正确                                                //
//      FALSE, 卡片应答信号错误                                                //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
char Judge_Req(char * buff)
{
	char temp1,temp2;
	
	temp1 = *buff;
	temp2 = *(buff + 1);

	if((temp1 == ATQA_BYTE0) && (temp2 == ATQA_BYTE1))
	  return(TRUE);
	else
	  return(FALSE);
}

/********************************************************************************************************/
/*名称: Save_UID                                                                     	                */
/*功能: 该函数实现保存卡片收到的序列号                                                  	        */                           	             
/*												        */											
/*输入:                                                                                                 */
/*       row: 产生冲突的行									 	*/
/*       col: 产生冲突的列										*/						
/*       length: 接収到的UID数据长度                                                                    */
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 N/A                                                   		                		*/
/********************************************************************************************************/
void Save_UID(char row,char col,char length)
{
	char i;
	char temp;
	char temp1;
	
	if(row==0x00 && col==0x00)
		for(i=0;i<length;i++)
			UID[i]=buffer[i];
	else
	{	
		temp=buffer[0];
		temp1=UID[row-1];
		switch(col)
		{
			case 0:
				temp1=0x00;
				row=row+1;
				break;
			case 1:
				temp=temp & 0xFE;
				temp1=temp1 & 0x01;
				break;			
			case 2:
				temp=temp & 0xFC;
				temp1=temp1 & 0x03;
				break;
			case 3:
				temp=temp & 0xF8;
				temp1=temp1 & 0x07;
				break;
			case 4:
				temp=temp & 0xF0;
				temp1=temp1 & 0x0F;
				break;
			case 5:
				temp=temp & 0xE0;
				temp1=temp1 & 0x1F;
				break;
			case 6:
				temp=temp & 0xC0;
				temp1=temp1 & 0x3F;
				break;
			case 7:
				temp=temp & 0x80;
				temp1=temp1 & 0x7F;
				break;
			default:
				break;
		}
		buffer[0]=temp;
		UID[row-1]=temp1 | temp;
		for(i=1;i<length;i++)
		{
			UID[row-1+i]=buffer[i];
		}
	}
}

/********************************************************************************************************/
/*名称: Check_UID                                                                     	               	*/
/*功能: 该函数实现对收到的卡片的序列号的判断                                                       	*/               	             
/*												        */		
/*输入:                                                                                                	*/
/*       N/A                                                                      		 	*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	 TRUE: 序列号正确                                                 		                */
/*       FALSE: 序列号错误              								*/
/********************************************************************************************************/
char Check_UID(void)
{
	char temp;
	char i;
	
	temp=0x00;
	for(i=0;i<5;i++)
	{
		temp=temp ^ UID[i];
	}
	if(temp==0)
		return(TRUE);
	return(FALSE);
}


/********************************************************************************************************/
/*名称: Set_BitFraming                                                                     	        */
/*功能: 该函数实现对收到的卡片的序列号的判断                                                       	*/               	             
/*												        */		
/*输入:                                                                                                	*/
/*       row: 产生冲突的行                                                                     		*/
/*	 col: 产生冲突的列										*/
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*       N/A      											*/
/********************************************************************************************************/
void Set_BitFraming(char  row,char  col)
{	
	switch(row)
	{
		case 0: 
			buffer[1]=0x20;
			break;
		case 1:
			buffer[1]=0x30;
			break;
		case 2:
			buffer[1]=0x40;
			break;
		case 3:
			buffer[1]=0x50;
			break;
		case 4:
			buffer[1]=0x60;
			break;
		default:
			break;
	}	
	
	switch(col)
	{
		case 0:
			rc531_register_write(Bit_Frame,0x00);
			break;
		case 1:
			rc531_register_write(Bit_Frame,0x11);
			buffer[1]=(buffer[1] | 0x01);
			break;
		case 2:
			rc531_register_write(Bit_Frame,0x22);
			buffer[1]=(buffer[1] | 0x02);
			break;
		case 3:
			rc531_register_write(Bit_Frame,0x33);
			buffer[1]=(buffer[1] | 0x03);
			break;
		case 4:
			rc531_register_write(Bit_Frame,0x44);
			buffer[1]=(buffer[1] | 0x04);
			break;
		case 5:
			rc531_register_write(Bit_Frame,0x55);
			buffer[1]=(buffer[1] | 0x05);
			break;
		case 6:
			rc531_register_write(Bit_Frame,0x66);
			buffer[1]=(buffer[1] | 0x06);
			break;
		case 7:
			rc531_register_write(Bit_Frame,0x77);
			buffer[1]=(buffer[1] | 0x07);
			break;
		default:
			break;
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: Request                                                                //
//功能: 该函数实现对放入RC531操作范围之内的卡片的Request操作                   //                       	             
//									       //								
//输入:                                                                        //
//       mode: WUPA(监测所以RC531操作范围之内的卡片)			       //
//	       REQA(监测在RC531操作范围之内不处于HALT状态的空闲卡片)           //
//                                                                             //
//输出:                                                                        //
//	 RC531_NOTAGERR: 无卡                                                  //
//       RC531_OK: 应答正确                                                    //
//	 RC531_REQERR: 应答错误						       //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
char Request(char mode)
{
	char  temp;	
	buffer[0]=mode;					//Request模式选择
	rc531_register_write(Bit_Frame,0x07);		//发送7bit
	rc531_register_write(ChannelRedundancy,0x03);	//关闭CRC校验		
	rc531_register_write(Control,0x00);		//屏蔽CRYPTO1位
	temp=Command_Send(1,buffer,Transceive);
	if(temp == FALSE)
	{
		return(RC531_NOTAGERR);
	}	
	Read_FIFO(buffer);				//从FIFO中读取应答信息
	temp=Judge_Req(buffer);				//判断应答信号是否正确
	if (temp==TRUE)
	{
		tagtype[0]=buffer[0];
		tagtype[1]=buffer[1];
		return(RC531_OK);
	}
	else
		return(RC531_REQERR);
} 


/********************************************************************************************************/
/*名称: AntiColl                                                                     	        	*/
/*功能: 该函数实现对放入RC531操作范围之内的卡片的防冲突检测                                             */                           	             
/*												       	*/											
/*输入:                                                                                                	*/
/*       N/A                                                                        		        */
/*                                                                                                     	*/
/*输出:                                                                                                	*/
/*	RC531_NOTAGERR: 无卡                                                 		                */
/*      RC531_BYTECOUNTERR: 接收字节错误                                                                */
/*	RC531_SERNRERR: 卡片序列号应答错误								*/
/*	RC531_OK: 卡片应答正确                                                                          */
/********************************************************************************************************/
char AntiColl(void)
{
	char temp;
	char i;
	char row,col;
	char pre_row;
	
	row=0;
	col=0;
	pre_row=0;
	
	buffer[0]=RF_CMD_ANTICOL;
	buffer[1]=0x20;
	rc531_register_write(Bit_Frame,0x00);
	rc531_register_write(ChannelRedundancy,0x03);					//关闭CRC,打开奇偶校验
	temp=Command_Send(2,buffer,Transceive);
   
	while(1)
	{	
		if(temp==FALSE)
			return(RC531_NOTAGERR);
		temp=rc531_register_read(FIFO_Length);
		if (temp==0) 
			return(RC531_BYTECOUNTERR);
		Read_FIFO(buffer);
		Save_UID(row,col,temp);				//将收到的UID放入UID数组中		
		temp=rc531_register_read(ErrorFlag);					//判断接収数据是否出错
		_NOP();
		if((temp & 0x01)==0x00)
		{
		   if((temp & 0x02)==0x02)
			return(RC531_PARITYERR);
                   if((temp & 0x04)==0x04)
			return(RC531_FRAMINGERR);
		   else
		     {
			temp=Check_UID();			//校验收到的UID
			if(temp==FALSE)
				return(RC531_SERNRERR);
			return(RC531_OK);
		      }	
		 }
		else
		{       w++;
			temp=rc531_register_read(CollPos);				//读取冲突检测寄存器

⌨️ 快捷键说明

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