📄 rfid_x5558.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 + -