You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MFRC522与Mifare Classic 1K读取块时CRC校验不匹配问题求助

MIFARE块读取CRC不匹配问题修复

问题分析

你遇到的核心问题是:读取MIFARE Classic块时,16字节全0数据对应的CRC计算结果与卡返回的0x4F68不匹配(模块计算出0x4937),但数据本身正确,且其他NFC流程(防碰撞、认证等)正常。

问题根源在于MFRC522的CRC模块初始值未按MIFARE协议要求设置:MIFARE使用ISO/IEC 14443-3 Type A标准CRC-16,要求初始值为0x6363,而你的代码中未设置该初始值,导致模块使用默认的0x0000进行计算,最终结果与卡的计算值不符。

另外,你的CRC_ResultRead()字节组合逻辑(先取Buf[17]高字节再取Buf[16]低字节)是正确的,符合MIFARE CRC的传输格式。

修复代码

修改CalculateCRC函数,添加设置CRC初始值的步骤:

unsigned short RC522::CalculateCRC(unsigned char * Data, unsigned char Dlen)
{
    CommandWrite(CMD_Idle);
    CRC_InterruptStatus();// Clear CRC interrupt and return it
    FIFO_Flush();

    // 设置MIFARE协议要求的CRC初始值0x6363
    WriteReg(RegCRCInitLo, 0x63);
    WriteReg(RegCRCInitHi, 0x63);

    for (unsigned char i = 0; i < Dlen; i++)
        FIFO_Write(Data[i]);

    CommandWrite(CMD_CalcCRC);

    for (unsigned short c = 100; c > 0; c--)
    {
        if (CRC_InterruptStatus())
            break;

        delay.Mili(1);
    }

    // 显式读取CRC寄存器,确保字节顺序正确
    unsigned char crcLo = ReadReg(RegCRCResultLo);
    unsigned char crcHi = ReadReg(RegCRCResultHi);
    unsigned short Result = (crcHi << 8) | crcLo;

    CommandWrite(CMD_Idle);

    return Result;
}

关键修改点

  • 新增WriteReg(RegCRCInitLo, 0x63)和WriteReg(RegCRCInitHi, 0x63),强制CRC模块使用MIFARE标准初始值。
  • 显式拆分CRC结果读取过程,避免依赖CRC_ResultRead()的潜在实现偏差。

验证

修改后,计算16字节全0数据的CRC将得到0x4F68,与卡返回的CRC值一致,此时CRC校验将正常通过。

内容的提问来源于stack exchange,提问作者ALI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 13:05:04