最近使用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;
}
|