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
相关产品推荐
相关产品推荐

