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

📄 trf7960.c

📁 用TI公司MSP430控制TRF7960设计TYPEA源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    
    
    TRF_7960_MOD_SEL;
    TRF_7960_MOD_OUT;
    TRF_7960_MOD_NO_DIRECT;

    TRF_7960_OOK_SEL;    
    TRF_7960_00K_OUT;
    //TRF_7960_ASK;
    TRF_7960_OOK;
    
    TRF_7960_IRQ_SEL;
    TRF_7960_IRQ_IN;   
   
    
    TRF_7960_EN_SEL;
    TRF_7960_EN_OUT;
    TRF_7960_EN_HIGH;

   //FOR TEST
    SPI_TX_SEL;
    SPI_TX_OUT;
    SPI_TX_LOW;
    
    SPI_RX_SEL;
    SPI_RX_OUT;
    SPI_RX_LOW;
 
    spi_delay(0x10);
    softinit();
}

char Judge_Req(char * buff)
{
	char temp1,temp2;
	
	temp1 = *buff;
	temp2 = *(buff + 1);

	if((temp1 == ATQA_BYTE0) && (temp2 == ATQA_BYTE1))
	  return(1);
	else
	  return(0);
}

/********************************************************************************************************/
/*名称: 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(1);
	return(0);
}


/********************************************************************************************************/
/*名称: 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:
			
			break;
		case 1:
			
			buffer[1]=(buffer[1] | 0x01);
			break;
		case 2:
			
			buffer[1]=(buffer[1] | 0x02);
			break;
		case 3:
			
			buffer[1]=(buffer[1] | 0x03);
			break;
		case 4:
			
			buffer[1]=(buffer[1] | 0x04);
			break;
		case 5:
			
			buffer[1]=(buffer[1] | 0x05);
			break;
		case 6:
			
			buffer[1]=(buffer[1] | 0x06);
			break;
		case 7:
			
			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;
	single_register_write(0x01,0x88); 	//关闭rx_crc
	buffer[0]=mode;					//Request模式选择
	temp=data_transceive(/*byte_count*/0,/*broken_bit*/7,/*any_crc*/0x90,buffer);
	_NOP();
        if(temp!=TRF7960_OK)
           return(temp);
        temp=Judge_Req(buffer);				//判断应答信号是否正确
	if (temp==1)
	{
		tagtype[0]=buffer[0];
		tagtype[1]=buffer[1];
		return(TRF7960_OK);
	}
	else
		return(TRF7960_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;
	single_register_write(0x01,0x88); 	//关闭rx_crc
        
	row=0;
	col=0;
	pre_row=0;
	single_register_read(0x0E);
	buffer[0]=RF_CMD_ANTICOL;
	buffer[1]=0x20;
        temp=data_transceive(2,0,0x90,buffer);
	while(1)
	{	
		if((temp!=TRF7960_ANTICOLLERR)&&(temp!=TRF7960_OK))
			return(temp);
		Save_UID(row,col,rec_length);     //将收到的UID放入UID数组
                if(temp==TRF7960_OK)
		{
		    temp=Check_UID();			//校验收到的UID
		    if(temp==0)
                        return(TRF7960_SERNRERR);
                    else
			return(TRF7960_OK);
		 }
		else
		{      
		     temp=single_register_read(0x0E);				//读取冲突检测寄存器
		     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;
                        _NOP();
			temp=data_transceive(row+1,col,0x90,buffer);
		}
	}
}

/********************************************************************************************************/
/*名称: 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];
		single_register_write(0x01,0x08); 	//开启rx_crc				//开启CRC,奇偶校验校验
		temp=data_transceive(7,0,0x91,buffer);
		
		if(temp!=TRF7960_OK)
			return(temp);
		else
		{	
			if (temp!=1)
				return(TRF7960_BYTECOUNTERR);
			if (*buffer==SAK_BYTE0 || *buffer==SAK_BYTE1)	//判断应答信号是否正确
				return(TRF7960_OK);
			else 
				return(TRF7960_SELERR);
		}
}

#endif

⌨️ 快捷键说明

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