最近使用RC522讀取RFID卡的UID,發現網上大部分都是4字節的UID讀取,7字節很少說明,查閱資料發現是要二次防沖撞,但具體怎么操作呢,我嘗試了但是一直是防沖撞失敗。第一次是0x93、0x20 第二次是0x95、0x20 但就是第二次防沖撞失敗 求教大佬具體需要怎么操作,下面是執行部分單片機代碼
void RC522_Handel(u8 mode)
{
u8 len = 0;
IWDG_Feed();//喂狗
status = PcdRequest(PICC_REQALL,CT);//尋卡
if(status == MI_OK )//尋卡成功
{
if(CT[0] == 0x04 && CT[1] == 0x00)
{
/** M1卡 **/
status = MI_ERR;
status = PcdAnticoll(SN,PICC_ANTICOLL1);//防沖撞
if (status==MI_OK)//防衝撞成功
{
status=MI_ERR;
printf("UUID:%02X%02X%02X%02X\r\n",SN[0],SN[1],SN[2],SN[3]);
}
else
{
RC522_Handel(0);
}
}
else if(CT[0] == 0x44 && CT[1] == 0x00)
{
/** NTAG卡 **/
printf("TYEP:%02X%02X\r\n",CT[0],CT[1]);
status = MI_ERR;
status = PcdAnticoll(SN,PICC_ANTICOLL1);//防沖撞
if (status==MI_OK)//防衝撞成功
{
printf("UID:%02X%02X%02X",SN[1],SN[2],SN[3]);
status = MI_ERR;
status = PcdRequest(PICC_REQALL,CT);//尋卡
status = PcdRequest(PICC_REQALL,CT);//尋卡
if(status == MI_OK)
{
status = MI_ERR;
status = PcdAnticoll(SN1,PICC_ANTICOLL2);
if(status == MI_OK)//防沖撞
printf("%02X%02X%02X%02X\r\n",SN1[0],SN1[1],SN1[2],SN1[3]);
else
{
printf("\r\n2次防沖撞失敗:%d\r\n",status);
}
}
}
else
{
RC522_Handel(0);
// TODO
}
}
}
CT[0] = 0;
CT[1] = 0;
}
char PcdAnticoll ( u8 * pSnr ,u8 PICC_ANTICOLL)
{
char cStatus;
u8 uc, ucSnr_check = 0;
u8 ucComMF522Buf [ MAXRLEN ];
u32 ulLen;
ClearBitMask ( Status2Reg, 0x08 ); //清MFCryptol On位 只有成功執行MFAuthent命令后,該位才能置位
WriteRawRC ( BitFramingReg, 0x00); //清理寄存器 停止收發
ClearBitMask ( CollReg, 0x80 ); //清ValuesAfterColl所有接收的位在沖突后被清除
ucComMF522Buf [ 0 ] = PICC_ANTICOLL; //卡片防沖突命令
ucComMF522Buf [ 1 ] = 0x20;
cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, & ulLen);//與卡片通信
if ( cStatus == MI_OK) //通信成功
{
for ( uc = 0; uc < 4; uc ++ )
{
* ( pSnr + uc ) = ucComMF522Buf [ uc ]; //讀出UID
ucSnr_check ^= ucComMF522Buf [ uc ];
}
if ( ucSnr_check != ucComMF522Buf [ uc ] )
cStatus = MI_ERR;
}
SetBitMask ( CollReg, 0x80 );
return cStatus;
}
|