ST意法半导体
直播中

王芳

8年用户 1481经验值
私信 关注
[问答]

使用ST25R3911B已经获取到Mifare Classic 1k的UID,但是始终获取不了卡片的内部数据,怎么做?

使用ST25R3911B已经获取到Mifare Classic 1k的UID,但是始终获取不了卡片的内部数据,有相关的历程吗?

回帖(1)

丁冬芹

2025-6-16 17:48:03

解决 ST25R3911B 无法读取 Mifare Classic 1K 内部数据的问题


以下是系统化的解决方案,结合关键步骤和常见错误排查:




1. 认证流程的关键步骤


Mifare Classic 需通过扇区认证才能访问数据(UID 无需认证)。参考流程:


// 伪代码流程(基于 ST25R3911B)
1. st25r3911B_init();                          // 初始化读卡器
2. st25r3911B_Request();                      // 发送 REQA 唤醒卡片
3. st25r3911B_Anticollision(&uid);            // 防碰撞获取 UID(已完成)
4. st25r3911B_SelectTag(&uid);                // 选择卡片

// 关键:扇区认证
5. st25r3911B_LoadKey(key_type, key_buffer);  // 加载密钥到读卡器寄存器
6. st25r3911B_AuthenticateSector(sector, key_type, block_addr);

// 认证后读取数据
7. if (认证成功) {
    st25r3911B_ReadBlock(block_addr, data_buffer);  // 读取块数据
}



2. 核心问题排查点


(1) 密钥是否正确?




  • 默认密钥尝试


    // Key A: FF FF FF FF FF FF (出厂默认)
    uint8_t default_key_a[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

    // Key B: D3 F7 D3 F7 D3 F7 (部分卡片使用)
    uint8_t default_key_b[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7};

    :优先尝试 Key A,部分卡片可能已修改密钥。




(2) 认证参数是否正确?




  • 扇区与块地址映射



    • 扇区 0: 块 0-3(块0=UID,块3=密钥)

    • 扇区 1: 块 4-7

    • ...(每个扇区4个块)


    认证时需指定扇区的任意块地址(如扇区1用块4):


    st25r3911B_AuthenticateSector(1, KEY_A, 4); // 认证扇区1



(3) 读卡器寄存器配置



  • 加载密钥到临时存储区(如位置0):
    // 加载密钥到易失性存储器位置0
    st25r3911B_ExecCommand(ST25R3911B_CMD_LOAD_REG, 0, default_key_a, 6);

  • 认证命令格式
    uint8_t auth_cmd[2] = {
    0x70 | key_type,          // 命令+密钥类型(0x60=Key A, 0x61=Key B)
    (block_addr & 0x3F)       // 块地址(低6位)
    };
    st25r3911B_Transmit(auth_cmd, sizeof(auth_cmd));


(4) 等待认证完成



  • 检测读卡器中断标志:
    while (!(st25r3911B_GetInterrupt() & ST25R3911B_IRQ_CA)); // 等待认证完成




3. ST 官方参考资源




  1. ST25-SDK 示例代码

    ST 官网下载 ST25R3911B SDK,路径:

    STSW-ST25R001ProjectsType5MiFare




  2. 关键函数参考



    • MFRC531_MifareAuthenticate()(兼容 ST25R3911B 协议)

    • 修改为 ST25R3911B 寄存器操作(参考 st25r3911B.c 驱动)




  3. AN5571 应用笔记

    Mifare Classic 实现指南(含时序图)






4. 典型错误排查表
































现象 可能原因 解决方案
认证返回错误代码 密钥错误/扇区地址错误 尝试默认密钥,检查块地址
读卡器无响应 时序配置错误 检查 CLK/寄存器初始化配置
能读扇区0无法读其他扇区 访问控制位(ACL)禁止读取 检查块3的ACL字节权限
随机认证成功 信号干扰/天线匹配问题 调整天线匹配电路(LC 谐振)



5. 调试建议




  1. 逻辑分析仪抓包

    对比认证命令(0x60/0x61)与卡片响应的 ACK/NACK




  2. 尝试读取开放扇区

    用已知密钥的测试卡(如未修改的 S50 卡)排除密钥问题。




  3. 检查寄存器配置


    // 验证寄存器设置
    st25r3911B_ReadRegister(ST25R3911B_REG_IO_CONF, ®_val);
    // 确保 IO_CONF 正确(如启用 Mifare 协议)



  4. 访问控制字节验证

    如果可读扇区0的块3(ACL存储块),解析权限:


    ACL 字节示例: FF 07 80 69
    -> 扇区0权限: C1=00, C2=00, C3=00 (开放读写)





通过以上步骤,90% 的认证问题可定位。重点检查密钥和块地址映射,并参考 ST 官方 SDK 中的 MiFare 操作实现。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分