ST意法半导体
直播中

硬件工程师1

11年用户 1664经验值
擅长:可编程逻辑
私信 关注
[问答]

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

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

回帖(1)

王霞

2025-6-13 17:05:37

在使用ST25R3911B获取到Mifare Classic 1k的UID后无法读取内部数据,通常是由于认证(Authentication)过程失败导致的。以下是系统性的解决步骤和代码实现参考:




问题解决步骤




  1. 确认卡片状态  



    • 确保卡片未被加密或密钥已修改,尝试使用默认密钥 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF(密钥A)或 0xD3 0xF7 0xD3 0xF7 0xD3 0xF7(NXP默认NDEF密钥)。

    • 用手机NFC工具(如NFC Tools)验证卡片数据是否可读,排除硬件损坏。




  2. 检查通信流程

    Mifare Classic数据读取需严格按顺序:



    • REQUESTANTICOLLISIONSELECTAUTHENTICATIONREAD BLOCK




  3. 验证认证流程

    关键步骤:



    • 密钥加载:确保认证前正确加载密钥到ST25R3911B寄存器。

    • 认证命令:发送认证指令时需指定:

      • 密钥类型(Key A/B)

      • 块地址(绝对块号,如0x00

      • 卡片UID


    • 会话保持:认证成功后必须连续操作,不能重新寻卡。




  4. 天线与硬件配置



    • 确保天线匹配(典型值:50Ω阻抗),增大TxAnalog寄存器增益(如0x810x85)提高发射功率。

    • 用示波器检查天线信号是否完整(无过冲/欠冲)。






代码实现参考(基于ST库函数)


// 定义默认密钥
const uint8_t defaultKeyA[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void read_mifare_block(uint8_t blockAddr) {
  // 1. 寻卡请求
  if (st25r3911b_perform_request() != ERR_NONE) {
    printf("REQUEST failed.n");
    return;
  }

  // 2. 防碰撞获取UID
  uint8_t uid[4];
  uint8_t uidLen;
  if (st25r3911b_anticollision(uid, &uidLen) != ERR_NONE) {
    printf("ANTICOLLISION failed.n");
    return;
  }

  // 3. 选择卡片
  if (st25r3911b_select(uid, uidLen) != ERR_NONE) {
    printf("SELECT failed.n");
    return;
  }

  // 4. 配置认证密钥(ST内部密钥寄存器)
  st25r3911b_load_key(defaultKeyA, RFAL_MF_KEY_A);

  // 5. 认证扇区(块号转为扇区)
  uint8_t sector = blockAddr / 4; // 每个扇区4个块
  if (st25r3911b_authenticate(
        RFAL_MF_KEY_A,      // 密钥类型A
        blockAddr,          // 绝对块地址
        uid,                // UID
        uidLen,             // UID长度
        sector) != ERR_NONE) {
    printf("AUTH failed (Block %d).n", blockAddr);
    return;
  }

  // 6. 读块数据
  uint8_t data[16];
  if (st25r3911b_read_block(blockAddr, data) == ERR_NONE) {
    printf("Block %d Data: ", blockAddr);
    print_hex(data, 16);  // 自定义打印函数
  }
}



常见错误排查
































现象 可能原因 解决方案
认证失败 密钥错误/寄存器未加载 检查密钥值,用st25r3911b_load_key()加载
读取超时 块地址错误/卡片脱离场区 验证块地址范围(0-63),增大通信超时时间
数据全零/无效 未认证成功即读数据 确保认证返回值ERR_NONE
特定扇区失败 扇区密钥被修改 使用密钥B尝试,或用手机NFC工具验证密钥



ST官方参考资源




  1. ST25R3911B文档  





  2. 示例代码位置

    在ST提供的RFAL库中:



    • 函数参考:rfal_mf.c(Mifare Classic实现)

    • 示例工程:STM32CubeExpansion_NFC06_Vx.x.x/Projects/*





关键函数:  



  • rfal_mf_authenticate()  

  • rfal_mf_readBlock()




  1. 调试建议  

    • st25r3911b_debug_regs()打印寄存器状态。

    • 监听通信波形(ISO 14443-3层)。



通过以上步骤,多数认证失败问题可定位。若仍无法解决,需捕获通信日志进一步分析。

举报

更多回帖

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