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

📄 rfid_x5558.c

📁 找的一个用U2270B开发的射频卡项目文件
💻 C
字号:
// $Id: rfid_x5558.c,v 1.7 2007/01/24 21:44:15 tprescott Exp $
/*****************************************************
Project : rfid_x5558.c
Date    : 9/08/2006
Author  : Toby Prescott                   
Company : Atmel                           
Comments: AVR Studio GCC

Revisions:
	v1.0 - Started written for CodeVision 
	v2.1 - 1/19/06 Changed from ASCII + stored
		vars in EEPROM
	v2.3 - 3/14/06 Trying to fix read/write routines
	v2.4 - 4/6/06  Add new working R/W routines   
	v2.5 - 5/23/06 Add command routines
	v2.6 - Clean for WinAVR
*****************************************************/

 #include "rfid_x5558.h"

//**** Configuration Block Hard Code ****//
//unsigned char x5558_ConfigReg[4] EEMEM = {0x60,0xFA,0xF0,0x1F};    //Public Mode, 96bit ID, RF/32, All Blocks
//unsigned char x5558_ConfigReg[4] EEMEM = {0x60,0x7A,0xF0,0x1F};    //ITF Mode, 96bit ID, RF/32, All Blocks, Clear not possible
unsigned char x5558_ConfigReg[4] EEMEM = {0x90,0x7A,0xF0,0x1F};    //ITF Mode, 96bit ID, RF/32, All Blocks, Clear possible

unsigned int x5558_SGap EEMEM = 300;
unsigned int x5558_Gap EEMEM = 100;
unsigned int x5558_Ref EEMEM = 120;

unsigned int x5558_ShortL EEMEM = 50;
unsigned int x5558_ShortH EEMEM = 210;
unsigned int x5558_LongL EEMEM = 210;  
unsigned int x5558_LongH EEMEM = 350;  

unsigned char TagCount=0, Target_Tag_ID[12] = {0}, Target_Tag_PWD[4] = {0};        
                                                             
//**** Load New values for Write Timings ****//                                                              
void x5558_Set_SGap(unsigned int iSGap){eeprom_write_word(&x5558_SGap,iSGap);}
void x5558_Set_Gap(unsigned int iGap){eeprom_write_word(&x5558_Gap,iGap);}
void x5558_Set_Ref(unsigned int iRef){eeprom_write_word(&x5558_Ref,iRef);}

//**** Return Status of Write Timings ****//                                                              
unsigned int x5558_Get_SGap(void){return eeprom_read_word(&x5558_SGap);}
unsigned int x5558_Get_Gap(void){return eeprom_read_word(&x5558_Gap);}
unsigned int x5558_Get_Ref(void){return eeprom_read_word(&x5558_Ref);}

//**** Load New values for Read Timings ****//                                                              
void x5558_Set_ShortL(unsigned int iShortL){eeprom_write_word(&x5558_ShortL,iShortL);}
void x5558_Set_ShortH(unsigned int iShortH){eeprom_write_word(&x5558_ShortH,iShortH);}
void x5558_Set_LongL(unsigned int iLongL){eeprom_write_word(&x5558_LongL,iLongL);}
void x5558_Set_LongH(unsigned int iLongH){eeprom_write_word(&x5558_LongH,iLongH);}

//**** Return Status of Read Timings ****//                                                              
unsigned int x5558_Get_ShortL(void){return eeprom_read_word(&x5558_ShortL);}
unsigned int x5558_Get_ShortH(void){return eeprom_read_word(&x5558_ShortH);}
unsigned int x5558_Get_LongL(void){return eeprom_read_word(&x5558_LongL);} 
unsigned int x5558_Get_LongH(void){return eeprom_read_word(&x5558_LongH);} 

unsigned char DataBuffer[14] = {0};        

// *******************************************************************************
// Pass in new Configuration Block data
// ******************************************************************************/
void x5558_Set_Config_Reg(unsigned char *cConfig)
{
	unsigned char i;
	for(i=0; i<4; i++)				// Loop for all bytes in block
	{
		eeprom_write_byte(&x5558_ConfigReg[i],*cConfig++);        // Save new byte
	}
}

// *******************************************************************************
// Program the Configuration Block in the 5558 using specified Reader
// ******************************************************************************/
void x5558_WriteConfigReg(unsigned char Target_Reader)
{
  	unsigned char i,tempByte;
	unsigned char writeBuff[6] = {0};
	unsigned char cOpCode = 0x01; 		
	unsigned char cLock = 0x00;
			
	writeBuff[0] = cOpCode<<4;	// First two bits are SOC next two are Cmd
	writeBuff[0] |= 0x3F>>2;	// Shift in Address 63 for Config Reg
	writeBuff[1] |= 0x3F<<6;
	writeBuff[1] |= cLock<<4;	// Add in two lock bits
	for(i=1; i<5; i++)
	{
		tempByte=eeprom_read_byte(&x5558_ConfigReg[i-1]);  // Get the Configuration Block Data
		writeBuff[i] |= tempByte>>4;  	// Load into the buffer with shift for Op Code, address, and Lock
		writeBuff[(unsigned char)(i+1)] |= tempByte<<4;
	}
	
	//Select Reader, Currently only supports U2270
	if(Target_Reader == 70){U2270_QuadWriteBlock(44, &writeBuff[0]);} 	// Call Write Block Routine
	Timer_delay_us(10000);
	  	
	snd_Play(BEEPFREQ1,BEEPFREQ0,BEEPTIME);	// return Audio feedback
}

// *******************************************************************************
// Program Block Data in the 5558 using specified Reader 
// Pass in the block data and the block address
// ******************************************************************************/
unsigned char x5558_WriteSingleBlock(unsigned char Target_Reader, unsigned char *inBuff, unsigned char inAddr, unsigned char confirm)
{
  	unsigned char i,tempByte,cError=0;
	unsigned char writeBuff[6] = {0};
	unsigned char cOpCode = 0x01;
	unsigned char cLock = 0x00;
//	unsigned char *tmpInBuff;
			
//	tmpInBuff = &(*inBuff); 			// Store beginning address pointer			
	writeBuff[0] = 0x00;  				// SOC first two bits
	writeBuff[0] |= cOpCode<<4;			// Load the Write Op Code into buffer
	writeBuff[0] |= inAddr>>2;			// Load the Block Address into buffer
	writeBuff[1] |= inAddr<<6;
	writeBuff[1] |= cLock<<4;			// Load the Lock Bit into buffer
	for(i=1; i<5; i++)
	{
		tempByte=inBuff[i-1];			// Copy each byte from input data
		writeBuff[i] |= tempByte>>4;		// Shift and load into the buffer
		writeBuff[(unsigned char)(i+1)] |= tempByte<<4;
	}
	
	//Select Reader, Currently only supports U2270
	if(Target_Reader == 70){U2270_QuadWriteBlock(44, &writeBuff[0]);} 	// Call Write Block Routine

	//IF confirm wanted check for successful write
	if(confirm == 1){cError = x5558_ConfirmWrite(Target_Reader);}
	return cError;
}

unsigned char x5558_WriteCommand(unsigned char Target_Reader, unsigned char *inBuff, unsigned char CMDbitLength)
{
  	unsigned char i,tempByte;
	unsigned char writeBuff[14] = {0};
//	unsigned char *tmpInBuff;
			
//	tmpInBuff = &(*inBuff); 			// Store beginning address pointer			
	writeBuff[0] = 0x00;  				// SOC first two bits
	for(i=0; i < 14; i++)
	{
		tempByte=inBuff[i];			// Copy each byte from input data
		writeBuff[i] |= tempByte>>2;		// Shift and load into the buffer
		writeBuff[(unsigned char)(i+1)] |= tempByte<<6;
	}
	
	if(Target_Reader == 70){U2270_QuadWriteBlock(CMDbitLength, &writeBuff[0]);} // Call Write Block Routine
	return 0;
}

// *******************************************************************************
// Program Entire Tag Data in the 5558 using specified Reader 
// ******************************************************************************/
unsigned char x5558_WriteAll(unsigned char Target_Reader)
{
	unsigned char block, i, cError=0;
	unsigned char tempBlock[4];
	
	// For Data Blocks 0-31 
	for(block=0; block<32; block++)
	{
		for(i=0; i<4; i++)
		{
			tempBlock[i]=Tag_Get_Block(block,i); 		  // Read the Block Data from EEPROM
		}					
		x5558_SelectTagID(Target_Reader, &Target_Tag_ID[0]);
		Timer_delay_us(10000);
		x5558_LoginWrite(Target_Reader, &Target_Tag_PWD[0]); 		  // Send Login Command with password of all zeros
		Timer_delay_us(10000);
		cError = x5558_WriteSingleBlock(Target_Reader, &tempBlock[0], block, 1); // Call Block Write for Each Block
		Timer_delay_us(10000);
		if(cError == 2){block=33;}
	}
	return cError;
} 

 // *******************************************************************************
// Verify that the Block Data was correctly written
// Pass in the intended block data and the block address
// ******************************************************************************/
unsigned char x5558_ConfirmWrite(unsigned char Target_Reader)
{
    unsigned char cError=2;
	unsigned int timeout = 0;
        
    if(Target_Reader == 70)
    {
		RFIDTimer_Set(0xFF, 0xFF);				                    // Zero Read Timer Count
		RFIDTimer_RD_Init();                                       // Start Read Timer
	
		while(cError != 1 && timeout < 20)
		{
			cError = U2270_x5558SOFSync(4);
			timeout++;
		}
		RFIDTimerFlag = 0;                                          // Clear Timer Flag
		while(!RFIDTimerFlag); 					                    // Wait for next edge
		if(cError == 1 && RdTime > 400)            // Make sure there are no errors
		{
			snd_Play(BEEPFREQ1,BEEPFREQ0,BEEPTIME);	// IF all bytes match, return Audio feedback
			cError = 1;
		}			
		else
		{
			snd_Play(BUZZFREQ1,BUZZFREQ0,BUZZTIME);
            cError = 2;
		}
        RFIDTimer_Stop();	
	}
	return cError;
}

void x5558_ReadSingleBlock(unsigned char Target_Reader, unsigned char inAddr)
{
	DataBuffer[0]=0x40;
	DataBuffer[1]=0x00;
	
	DataBuffer[0] |= inAddr;
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], READSINGLE_LN);	
}

void x5558_ReadMultipleBlock(unsigned char Target_Reader, unsigned char inStartAddr, unsigned char inEndAddr)
{
	DataBuffer[0]=0x40;
	DataBuffer[1]=0x00;
	
	DataBuffer[0] |= inStartAddr;
	DataBuffer[1] |= inEndAddr<<2;
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], READMULTIPLE_LN);	
}

void x5558_LoginWrite(unsigned char Target_Reader, unsigned char *inBuff)
{
	unsigned char i;
	
	for(i=0; i<14; i++)
	{
		DataBuffer[i] = 0;
	}
	DataBuffer[0]=0x77;
	DataBuffer[1]=0x80;
	//add 32-bit pwd
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], LOGINWRITE_LN);
}

void x5558_LoginRead(unsigned char Target_Reader, unsigned char *inBuff)
{
	unsigned char i;
	
	for(i=0; i<14; i++)
	{
		DataBuffer[i] = 0;
	}
	DataBuffer[0]=0x76;
	DataBuffer[1]=0x80;
	//add 32-bit pwd
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], LOGINREAD_LN);
}

void x5558_GetID(unsigned char Target_Reader) 
{
	DataBuffer[0]=0x00;
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], GETID_LN);
}  

void x5558_GetIDeven(unsigned char Target_Reader, unsigned char *inBuff, unsigned char numBits)
{
	unsigned char i;
	unsigned char tmpByte;

	if((numBits & 0x01) == 0)
	{
		for(i=0; i<14; i++){DataBuffer[i]=0x00;}
	
		DataBuffer[0]=0x00;
		for(i=0; i<((numBits>>3)+1); i++)
		{
			tmpByte = *inBuff++;
			DataBuffer[i] |= (tmpByte>>4);
			DataBuffer[i+1] |= (tmpByte<<4);
		}

		x5558_WriteCommand(Target_Reader, &DataBuffer[0], (GETID_LN+numBits));
	}
} 
 
void x5558_GetIDodd(unsigned char Target_Reader, unsigned char *inBuff, unsigned char numBits)
{
	unsigned char i;
	unsigned char tmpByte;

	if((numBits & 0x01) == 1)
	{
		for(i=0; i<14; i++){DataBuffer[i]=0x00;}
	
		DataBuffer[0]=0x20;
		for(i=0; i<((numBits>>3)+1); i++)
		{
			tmpByte = *inBuff++;
			DataBuffer[i] |= (tmpByte>>3);
			DataBuffer[i+1] |= (tmpByte<<5);
		}

		x5558_WriteCommand(Target_Reader, &DataBuffer[0], (GETID_LN+numBits-1));
	}
}

void x5558_SelectTagID(unsigned char Target_Reader, unsigned char *inBuff)
{
	unsigned char i;
	
	for(i=0; i<14; i++)
	{
		DataBuffer[i] = 0;
	}
	DataBuffer[0]=0x00;
	for(i=0; i<12; i++)
	{
		DataBuffer[i] |= (*inBuff >> 4);
		DataBuffer[(unsigned char)(i+1)] |= (*inBuff << 4);
		inBuff++;
	}
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], SELECTTAG_LN);
}  

void x5558_SelectAll(unsigned char Target_Reader)
{
	DataBuffer[0]=0x80;
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], SELECTALL_LN);
}  

void x5558_SelectGroup(unsigned char Target_Reader, unsigned char *inBuff);
void x5558_SelectNGroup(unsigned char Target_Reader, unsigned char *inBuff); 

void x5558_ResetSelected(unsigned char Target_Reader)
{
	DataBuffer[0]=0xE0;
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], RESETSELECT_LN);
}
 
void x5558_ResetToReady(unsigned char Target_Reader)
{
	DataBuffer[0]=0xC0;
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], RESET2READY_LN);
}
 
void x5558_ArmClear(unsigned char Target_Reader)
{
	DataBuffer[0]=0xC8;
	DataBuffer[1]=0x00;
	
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], ARMCLEAR_LN);	
}

void x5558_ClearAll(unsigned char Target_Reader)
{
	DataBuffer[0]=0x5F;
	DataBuffer[1]=0x00;
	DataBuffer[2]=0x00;
	DataBuffer[3]=0x00;
	DataBuffer[4]=0x00;
	DataBuffer[5]=0x00;
	
	x5558_WriteCommand(Target_Reader, &DataBuffer[0], CLEARALL_LN);	
}
 

  

⌨️ 快捷键说明

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