NXP MCU 技术论坛
直播中

陈敏

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

PICC为什么不响应ATTRIB命令?

我们已经在硬件中使用了一段时间的芯片 PN512 和基于库 NFCrdlib-SW297940 (NXPNFCRDLIB SW PACKAGE: v4.040.05.011646_20161115) 的驱动程序,它一直运行良好。然而,最近我们遇到了一个 PICC 未能激活。 我们发现,尽管该卡对读取器芯片完全可见,但对 ATTRIB 命令没有响应。
PICC 发送 ATQB 字节:50 D6 FD E5 FC 00 00 00 00 77 83 B3。协议合规性位等于 3。该卡似乎支持两个版本的通信协议:一个符合 ISO/IEC 14443-4 标准,另一个不符合该标准。是否需要在 ATTRIB 命令中明确选择协议?NfcRdLib 只是将协议信息从 ATQB 复制到 ATTRIB 命令中,无需选择。因此,PICC 没有回应。
我们尝试明确选择兼容 ISO 的协议,PICC 确实做出了响应,但后来 APDU 通信在某个时候停滞了。
任何建议都值得赞赏。看起来需要更新 NfcRdLib,但我们找不到它。

回帖(1)

vinww特烦恼

2025-3-2 13:16:20

针对PICC不响应ATTRIB命令的问题,以下是逐步分析与解决方案:




1. 解析ATQB与Protocol Info


用户提供的ATQB字节为:50 D6 FD E5 FC 00 00 00 00 77 83 B3。根据ISO/IEC 14443-3,ATQB结构如下:



  • PUPI (4字节): 50 D6 FD E5

  • Application Data (1字节): FC

  • Protocol Info (4字节): 00 00 00 77

  • CRC: 83 B3


关键字段:Protocol Info (00 00 00 77)  



  • Protocol Type 由Protocol Info的第一个字节的低两位(b1-b0)定义:

    • 00: 仅支持ISO 14443-4

    • 01: 支持专有协议

    • 02: 同时支持ISO 14443-4和专有协议


  • 用户提到协议合规性位为3(二进制11),但需确认是否指代Protocol Type字段。若Protocol Info第一个字节为00(即00000000),则Protocol Type为00,表示仅支持ISO 14443-4,可能用户对协议合规性位的描述有误。需重新确认Protocol Info的解析。




2. ATTRIB命令参数配置


ATTRIB命令的格式为:


ATTRIB (PUPI) + Param1 + Param2 + Param3 + Param4 + [Higher Layer Info]


  • Param1 (1字节) 包含关键协议参数:

    • b8-b7: Protocol Type(必须与卡支持的协议匹配)

    • b6-b5: Max Frame Size (FSCI)

    • b4: NAD 支持

    • b3: CID 支持

    • b2-b0: 保留



问题根源

如果NfcRdLib直接将Protocol Info从ATQB复制到ATTRIB命令的Param1,可能导致以下问题:



  • Protocol Type字段未正确设置(例如设置为00以外的值)。

  • 未根据卡支持的协议类型选择正确的参数。




3. 解决方案


(1) 强制选择ISO 14443-4协议


在ATTRIB命令的Param1中,明确设置Protocol Type为00(ISO 14443-4):


// 修改Param1的Protocol Type位(b8-b7)
param1 = (original_param1 & 0x3F) | 0x00; // 强制设置为00

即使Protocol Info指示支持多种协议,也应优先选择ISO标准协议。


(2) 检查Max Frame Size (FSCI)


确保Param1中的FSCI值与卡支持的Max Frame Size匹配。若ATQB中Protocol Info的FSCI为00(默认256字节),则Param1的FSCI字段应设置为000(对应256字节)。


(3) 验证CID/NAD支持


如果卡不支持CID或NAD,需在Param1中禁用相关位:


param1 &= ~0x10; // 禁用NAD (b4=0)
param1 &= ~0x08; // 禁用CID (b3=0)

(4) 调试与日志



  • 捕获ATTRIB命令:使用逻辑分析仪或调试工具,确认发送的ATTRIB命令参数是否符合预期。

  • 对比正常与异常ATQB:分析不同卡的Protocol Info差异,确认是否因协议类型冲突导致失败。




4. NfcRdLib代码调整


检查库中生成ATTRIB命令的代码(通常在phacDiscLoop.c或类似文件中),确保Protocol Type和FSCI正确设置。例如:


// 原始代码可能直接复制Protocol Info
param1 = (pAtqbBuffer[4] & 0xFF); // 直接使用Protocol Info第一个字节

// 修改为强制选择ISO 14443-4
param1 = (pAtqbBuffer[4] & 0x3F); // 清除Protocol Type位(b8-b7=00)



5. 验证卡兼容性


某些卡片可能在ATTRIB命令中要求特定参数(如特定时序或FWI值)。参考卡片数据手册,确认其支持的协议和参数范围。




结论


PICC不响应ATTRIB命令的主要原因是协议类型或参数配置不匹配。需在ATTRIB命令中明确选择ISO 14443-4协议,并确保Max Frame Size、CID/NAD等参数与卡的能力一致。建议修改NfcRdLib中ATTRIB参数的生成逻辑,强制设置Protocol Type为00,并验证其他参数的正确性。

举报

更多回帖

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