📄 prd_iso14443a_anticollision.c
字号:
// Note : g_bRFPicoReadBitCounter = (g_bPicoReadStatus & STATUS_NB_BITS) >> 4 = nb valid bits + 1
if (l_bRFPicoReadBitCounter)
{
if (l_bRFPicoReadBitCounter==0x01) l_abBuffer[l_bTemp1]&=0x01;
if (l_bRFPicoReadBitCounter<0x04) l_abBuffer[l_bTemp1]&=0x03;
if (l_bRFPicoReadBitCounter>0x03) l_abBuffer[l_bTemp1]&=0x07;
p_abUID[l_bOffsetSerial] |= l_abBuffer[l_bTemp1];
}
// INCREMENT OFFSET TO LOCATE END OF VALID SN
l_bOffsetSerial = (l_bNVB>>0x04) + l_bCurrentSerial ;
// CONFIGURE NEXT COMMAND (ANTICOLLISION OR SELECT)
memcpy(&l_abBuffer[2],&p_abUID[l_bCurrentSerial],4);
l_abBuffer[0] = l_bSEL;
// CHECK IF COLLISION
if(l_bStatus==ERR_COLL)
{
// DELAY 1MS
for(l_bDelay=5;l_bDelay>0;l_bDelay--) delay_us(200);
// SEND ANTICOLLISION COMMAND
l_abBuffer[1] = 0x20 + l_bNVB;
l_bDataBytesToSend=(l_bNVB>>0x04)+0x02;
l_bDataBitsToSend=(l_bNVB & 0x0F);
v_fnSendBuffer(0,l_bDataBytesToSend,l_bDataBitsToSend,&l_abBuffer[0],p_pStructReader);
// NUMBER OF BITS TO RECEIVE
if(l_bDataBitsToSend!=0x00) l_bBitsToReceive = 0x08-l_bDataBitsToSend;
l_bStatus = ERR_COLL;
l_bAnticolRetry++;
}
} while((l_bStatus || l_bNVB<0x40) && l_bAnticolRetry<32);
l_bBitsToReceive=0;
// NO MORE THAN 32 LOOPS
if(l_bAnticolRetry>31) goto lbl_Retry;
// SEND SELECT COMMAND
p_abUID[l_bCurrentSerial+4] = 0x00; // Clear LRC from memory
l_abBuffer[1] = 0x70;
l_abBuffer[6] = l_abBuffer[2] ^ l_abBuffer[3] ^ l_abBuffer[4] ^ l_abBuffer[5]; // LRC
v_fnSendBuffer(_SENDCRC,7,0,&l_abBuffer[0],p_pStructReader);
l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive) ;
if (l_bStatus!= ERR_NO_ERROR)
{goto lbl_Retry;}
// CHECK IF ONE OTHER STAGE FOR THE SN
if(!(bit_testChar(&l_abBuffer[0],2))) break;
// SHIFT POSITION FOR THE NEXT 4 BYTES SN STAGE
l_bCurrentSerial =l_bCurrentSerial+4;
// NEXT STAGE SELECTION 93->95->97
l_bSEL += 2;
} while(l_bCurrentSerial<=12); // loop while SAK.2 = 1 (UID not complete)
p_pStructReader->s_bRTimeoutUsed=TO_4MS83;
// NUMBER OF BYTES OF UID
*p_bUIDLength=l_bOffsetSerial-1;
// HALT CHIP IF REQUESTED
if ((p_pStructReader->s_bRAnticolOpt0 & ISOA0_HALT_0) || ((p_pStructReader->s_bRAnticolOpt0 & ISOA0_HALT_1) && !bit_testChar(&l_abBuffer[0],5)))
{
// SEND HALT COMMAND
l_abBuffer[0] = _ISOA_HALT_0;
l_abBuffer[1] = _ISOA_HALT_1;
v_fnSendBuffer(_SENDCRC,2,0,&l_abBuffer[0],p_pStructReader);
// ANTICOLLISION OK EVEN IF HALT DIDN'T WORK
l_bStatus=ERR_NO_ERROR;
return TRUE;
}
// RATS COMMAND SENT IF REQUESTED
if (bit_testChar(&l_abBuffer[0],5) && (p_pStructReader->s_bRAnticolOpt0 & ISOA0_RATS))
{
// SEND RATS COMMAND AND RECEIVE ATS RESPONSE
l_abBuffer[0] = _ISOA_RATS;
l_abBuffer[1] = p_pStructReader->s_bRFrameSizeUsed;
v_fnSendBuffer(_SENDCRC,2,0,&l_abBuffer[0],p_pStructReader);
l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
if(l_bStatus!=ERR_NO_ERROR)
{
v_fnSendBuffer(_SENDCRC,2,0,&l_abBuffer[0],p_pStructReader);
l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
if(l_bStatus!=ERR_NO_ERROR) goto lbl_Retry;
}
// CONFIGURE SPEED, FRAME SIZE AND TIMEOUT ACCORDING TO ATS RESPONSE AND READER CONFIG
if(l_abBuffer[0]>1)
{
if(p_pStructReader->s_bRFrameSizeMax & P1_USE_CHIP_FS)
{
if(((l_abBuffer[1] & 0x0F)<<0x04) > (p_pStructReader->s_bRFrameSizeMax & 0xF0)) p_pStructReader->s_bRFrameSizeUsed=p_pStructReader->s_bRFrameSizeMax & 0xFE;
else p_pStructReader->s_bRFrameSizeUsed=((l_abBuffer[1] & 0x0F)<<0x04);
}
if (bit_testChar(&l_abBuffer[1],4)) // TA present
{
if(p_pStructReader->s_bReaderSupportedSpeed & P0_USE_CHIP_BR)
{
p_pStructReader->s_bCommunicationSupportedSpeed=(l_abBuffer[2] & p_pStructReader->s_bReaderSupportedSpeed);
if (bit_testChar(&l_abBuffer[2],7)) // Same speed during emission and reception
{
p_pStructReader->s_bCommunicationSupportedSpeed &= ((p_pStructReader->s_bCommunicationSupportedSpeed & 0xF0) >> 0x04);
p_pStructReader->s_bCommunicationSupportedSpeed |= ((p_pStructReader->s_bCommunicationSupportedSpeed & 0x0F) << 0x04);
}
}
}
if (bit_testChar(&l_abBuffer[1],5)) // TB present
{
l_bSFGT=1;
v_fnDefineTimeout(l_abBuffer[2+bit_testChar(&l_abBuffer[1],4)] & 0x0F); // begin SFGT delay count
v_fnTimeOutStart();
if(p_pStructReader->s_bRTimeoutDefault & USE_CHIP_TO)p_pStructReader->s_bRTimeoutUsed=((l_abBuffer[2+bit_testChar(&l_abBuffer[1],4)]&0xF0)>>4);
else p_pStructReader->s_bRTimeoutUsed=p_pStructReader->s_bRTimeoutDefault & 0xEF;
}
// TC not take into account
}
// PPS COMMAND SENT IF SPEED NEEDS TO BE CHANGED
if ((p_pStructReader->s_bCommunicationSupportedSpeed & 0x77) != (P0_S106K | P0_R106K))
{
// SEND RATS COMMAND AND RECEIVE ATS RESPONSE
l_abBuffer[0] = _ISOA_PPS;
l_abBuffer[1] = _ISOA_PPS_0;
l_abBuffer[2] = 0x00;
if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,2)) l_abBuffer[2]=0x03;
else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,1)) l_abBuffer[2]=0x02;
else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,0)) l_abBuffer[2]=0x01;
if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,6)) l_abBuffer[2]|=0x0C;
else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,5)) l_abBuffer[2]|=0x08;
else if (bit_testChar(&p_pStructReader->s_bCommunicationSupportedSpeed,4)) l_abBuffer[2]|=0x04;
while(l_bSFGT && !bit_testTimer0MR0IF()); // end of SFGT delay
v_fnSendBuffer(_SENDCRC,3,0,&l_abBuffer[0],p_pStructReader);
l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
if(l_bStatus != ERR_NO_ERROR)
{
v_fnSendBuffer(_SENDCRC,3,0,&l_abBuffer[0],p_pStructReader);
l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
if(l_bStatus != ERR_NO_ERROR) goto lbl_Retry;
}
// CHANGE READER SPEED
v_fnConfigBitRate(p_pStructReader->s_bCommunicationSupportedSpeed,&l_bRFReceiveEOF, p_pStructReader);
}
else while(l_bSFGT && !bit_testTimer0MR0IF()); // end of SFGT delay
// DESELECT CHIP IF REQUESTED
if (p_pStructReader->s_bRAnticolOpt0 & ISOA0_DESELECT)
{
// SEND DESELECT COMMAND
l_abBuffer[0] = _ISOA_DESELECT;
v_fnSendBuffer(_SENDCRC,1,0,&l_abBuffer[0],p_pStructReader);
l_bStatus=b_fnReceiveBuffer(_CHECKCRC,&l_abBuffer[0],p_pStructReader,&l_bDataBytesReceived,&l_bDataBitsReceived,&l_bPicoReadStatus,&l_bRFReceiveEOF,&l_bBitsToReceive);
if(l_bStatus!= ERR_NO_ERROR) goto lbl_Retry;
}
}
return TRUE;
lbl_Retry:
if(l_bRetry--)
{
if(p_pStructReader->s_bRAnticolOpt1&ISOA1_RESET)
{
v_fnCS_reset();
v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1);
// DELAY 2MS
for(l_bDelay=10;l_bDelay>0;l_bDelay--) delay_us(200);
v_fnCS_reset();
v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1 | P0_RFON);
// DELAY 5MS
for(l_bDelay=25;l_bDelay>0;l_bDelay--) delay_us(200);
}
else
{
// DELAY 520US
for(l_bDelay=4;l_bDelay>0;l_bDelay--) delay_us(130);
}
goto lbl_Loop;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -