📄 rfid_u2270.c
字号:
j = numBits; // Store number of bits needed
j = j>>3; // Convert to number of bytes
dataPtr = inDataPtr; // Store beginning pointer in temp pointer
// Loop until 2x number of bits have been checked //
for(k=0; k<(j*2); k++)
{
tmp1 = inDataPtr[cBytes]; // Store first byte to be checked
tmp2 = inDataPtr[cBytes+1]; // Store the next byte that will be shifted into first
for(cBits=0; cBits<8;) // Check all bits in the byte for header match
{
if(tmp1 == 0x00 && (tmp2&0xE0) == 0x20) // Found matching Header
{
// Reload data with beginning of data located at the inital pointer location //
for(i=0; i<j; i++)
{
tmp1 = inDataPtr[cBytes+i]<<cBits; // Shift bytes to start of data
tmp1 = tmp1 | inDataPtr[cBytes+i+1]>>(8-cBits); // found by previous search
inDataPtr[i] = tmp1; // Store back at beginning pointer location
}
// Load remaining buffer with all zeros //
for(i=(unsigned char)(j); i< (unsigned char)((j+1)*2); i++)
{
inDataPtr[i] = 0x00;
}
k = (numBits*2)+1; // break search loop
cBits = 8; // break search loop
return 0; // return successful
}
else // Header not found
{
tmp1 = tmp1<<1; // Shift first byte right
if(tmp2&0x80){tmp1 = tmp1|0x01;} // Move MSB of second byte to LSB of first
tmp2 = tmp2<<1; // Shift second byte right
cBits++; // Increment bits checked
}
}
cBytes++; // Increment bytes checked
}
return SeqTermErr; // Pattern not found, Return error code
}
// *******************************************************************************
// Read Routine Using the U2270
// Pass in the number of Tag Type, data encoding, and type of synch.
// Pass in the number of bits being sent and the data buffer
// ******************************************************************************/
unsigned char U2270_ReadData(unsigned char Target_Tag,unsigned char **cDatPtr,unsigned char cEncoding,unsigned char cSyncType,unsigned int numBits)
{
unsigned char cBit = SeqTermErr;
unsigned char cError = 0;
unsigned char cQuit = 0;
unsigned int timeOut0, cNumBits = 0, cNumBytes = 0;
unsigned char *cDataBuffPtr,i;
for(i=0; i < 129; i++){cDataBuff[i]=0x00;} //Reset Buffer
RFIDTimer_Set(0xFF, 0xFF); // Zero Read Timer Count
RFIDTimer_RD_Init(); // Start the Read Timer
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
if(RFIDTimerFlag == 2) // Overflow
{
cError = TagErr;
cQuit = 1;
}
timeOut0 = 0; // Start Timeout counter
// Loop until error, timeout, or valid read //
while(cQuit == 0 && timeOut0++ < 1000)
{
cDataBuffPtr = &cDataBuff[0]; // Place pointer at beginning of buffer
cNumBits = 0; // Clear bit counter for new read attempt
cNumBytes = 0; // Clear byte counter for new read attempt
if(RdTime < U2270_LongH) // Check for Tag presence. IF no tag present skip bit checking
{
if(cSyncType == X555XSYNC)
{
cBit = U2270_Check555xSequenceTerm(); // Look for 555x-based terminator timing pattern
// Special processing of first bit after terminator time //
if(cBit == 1) // IF first bit starts w/ one
{
*cDataBuffPtr = *cDataBuffPtr << 1;
*cDataBuffPtr = *cDataBuffPtr | 0x01; // Store a one
cNumBits++; // Increment number of bits read
}
else if(cBit == 0) // IF first bit starts w/ zero
{
*cDataBuffPtr = *cDataBuffPtr << 1; // Store a zero
cNumBits++; // Increment number of bits read
}
}
else if(cSyncType == SOFSYNC){cBit = U2270_x5558SOFSync(1);} // Look for 5558 SOF Pattern
else {cBit = U2270_Manchester2TSync();} // Look for first logic change (10 or 01)
if(cBit == 0 || cBit == 1) // IF sync found, else exit and try again
{
// This will read and store 2 times the number of bits needed //
while(cBit != BitErr && (cNumBits+(8*cNumBytes)) < (numBits*2)+10)
{
if(cNumBits == 8) // When full byte is read
{
cDataBuffPtr++; // Increment pointer to next byte in buffer
cNumBits = 0; // Clear bit counter
cNumBytes++; // Increment byte counter
}
if(cEncoding == MANCHESTER){cBit = U2270_ManchesterDecode(cBit);} // Decode the next bit (Manchester)
else if(cEncoding == BIPHASE){cBit = U2270_BiPhaseDecode();} // Decode the next bit (BiPhase)
if(cBit == 1)
{
*cDataBuffPtr = *cDataBuffPtr << 1; // Shift byte to store previous bit
*cDataBuffPtr = *cDataBuffPtr | 0x01; // Store a one
}
else if(cBit == 0)
{
*cDataBuffPtr = *cDataBuffPtr << 1; // Store a zero
}
cNumBits++; // Increment number of bits read
}
if(cSyncType == X555XSYNC || cSyncType == SOFSYNC)
{
cQuit = 1;
if((cNumBits+(8*cNumBytes)) > (numBits)){cBit = 0;} // Check for successfull read of all needed bits
}
else if(cSyncType == HEADERSYNC)
{
if((cNumBits+(8*cNumBytes)) == (numBits*2)+10) // Check for successfull read of all needed bits
{
cBit = U2270_HeaderSearch(&cDataBuff[0], numBits, 0xE6);// Look for start of data by finding header pattern
if(cBit == 0){cQuit = 1;} // If pattern found, quit read routine with success
else{cQuit = 1;}
}
}
else if(cSyncType == X5557SYNC)
{
if((cNumBits+(8*cNumBytes)) == (numBits*2)+10) // Check for successfull read of all needed bits
{
cBit = U2270_Check5557SequenceTerm(&cDataBuff[0], numBits); // Look for start of data by finding synch pattern
if(cBit == 0){cQuit = 1;} // If synch found, quit read routine with success
else{cQuit = 1;}
}
}
else if(cSyncType == ANIMALSYNC)
{
if((cNumBits+(8*cNumBytes)) == (numBits*2)+10) // Check for successfull read of all needed bits
{
cBit = U2270_AnimalIDHeaderSearch(&cDataBuff[0], numBits); // Look for start of data by finding synch pattern
if(cBit == 0){cQuit = 1;} // If synch found, quit read routine with success
else{cQuit = 0;}
}
}
if(cBit == 0 || cBit == 1){cError = 0;} // If read was successfull quit with no errors
else{cError = cBit;} // Else, return error code
}
else {cError = SeqTermErr;}
}
else {cError = TagErr;}
}
RFIDTimer_Stop(); // Stop the Read Timer
// ERROR Processing //
if(cError != 0 || (cNumBits+(8*cNumBytes)) < numBits)
{
snd_Play(BUZZFREQ1,BUZZFREQ0,BUZZTIME); // return Audio feedback
}
else
{
cDataBuffPtr = &cDataBuff[0];
*cDatPtr = cDataBuffPtr;
snd_Play(BEEPFREQ1,BEEPFREQ0,BEEPTIME); // return Audio feedback
}
return cError; // Return error code (zero = successfull)
}
unsigned char U2270_x5558_Arbitrate(void)
{
unsigned char tmp = 2, result = 3, loop = 0, numBits = 0, numBytes = 0;
// unsigned int timeout = 0;
unsigned char *cTagIDPtr;
unsigned char i, count;
unsigned char TagFilter[12]={0}, TagFilterBits;
for(i=0; i<12; i++){Target_Tag_ID[i]=0xFF;}
TagFilter[0] = 0x00;
TagFilter[1] = 0x04;
TagFilterBits = 15;
/* numBytes = (TagFilterBits>>3);
numBits = TagFilterBits - (numBytes*8);
for(i=0; i<numBytes; i++){Target_Tag_ID[i]=TagFilter[i];}
cTagIDPtr = &Target_Tag_ID[numBytes];
*/
// PORTF &= ~0x02;
x5558_GetID(70);
// x5558_GetIDeven(70, &TagFilter[0], TagFilterBits);
// x5558_GetIDodd(70, &TagFilter[0], TagFilterBits);
RFIDTimer_Set(0xFF, 0xFF); // Zero Read Timer Count
RFIDTimer_RD_Init(); // Start Read Timer
// Timer_delay_us(1200);
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
// PORTF |= 0x02;
/*while(tmp != 1 && timeout < 20)
{
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
// Make sure edge time greater than a long and less than 1.5 long //
if(RdTime > U2270_LongL+50 && RdTime < (U2270_LongH+(U2270_LongH>>1)))
{
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
// Make sure next edge time is short //
if(RdTime > U2270_ShortL && RdTime < U2270_ShortH+100)
{
PORTF &= ~0x02;
tmp = 1; //SOF Found, return success
PORTF |= 0x02;
}
}
else {tmp = 3;} // SOF not found, return error code
timeout++;
}*/
tmp = U2270_x5558SOFSync(2);
if(tmp == 1)// || tmp == 0)
{
result = tmp;
cTagIDPtr = &Target_Tag_ID[0];
while(loop == 0)
{
if(numBits > 7)
{
numBytes++;
numBits = 0;
cTagIDPtr = &Target_Tag_ID[numBytes];
}
if(numBytes > 11){loop = 1;}
else
{
result = U2270_DualPatternDecode();
if(result == 1)
{
PORTD &= ~0x40;
Timer_delay_us(100);
PORTD |= 0x40;
// Timer_delay_us(1200);
// PORTF &= ~0x02;
// PORTF |= 0x02;
*cTagIDPtr = *cTagIDPtr<<1;
*cTagIDPtr |= 0x01;
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
tmp = 2;
/*timeout = 0;
while(tmp != 1 && timeout < 20)
{
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
// Make sure edge time greater than a long and less than 1.5 long //
if(RdTime > U2270_LongL+50)
{
RFIDTimerFlag = 0; // Clear Timer Flag
while(!RFIDTimerFlag); // Wait for next edge
// Make sure next edge time is short //
if(RdTime > U2270_ShortL && RdTime < U2270_ShortH+100)
{
PORTF &= ~0x02;
tmp = 1; //SOF Found, return success
PORTF |= 0x02;
}
}
else {tmp = 3;} // SOF not found, return error code
timeout++;
}*/
tmp = U2270_x5558SOFSync(2);
if(tmp != 1)
{
loop = 1;
result = 5;
}
count++;
}
else if(result == 0)
{
*cTagIDPtr = *cTagIDPtr<<1;
count++;
}
else{loop = 1;}
numBits++;
}
}
}
else
{
result = 5;
}
RFIDTimer_Stop(); // Stop the Read Timer
if(result == 0){result = 1;}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -