找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 259|回复: 2
打印 上一主题 下一主题
收起左侧

RC522如何读取7字节的UID,附单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:250869 发表于 2023-12-7 17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用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;

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:250869 发表于 2023-12-7 18:29 | 只看该作者
我晓得了  顺序是一次防冲撞后  进行选卡随后二次防冲撞
回复

使用道具 举报

板凳
ID:250869 发表于 2023-12-7 18:30 | 只看该作者
已解决,一次寻卡防冲撞后,进行选卡,选卡成功在进行二次防冲撞(0x95)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表