嵌入式NFC开发实战:PN532控制器原理、天线调优与安全应用
1. 项目概述:为什么嵌入式设备需要PN532这样的NFC控制器?
近场通信(NFC)技术,对于很多开发者来说,可能首先想到的是手机上的“碰一碰”支付或门禁卡。但在嵌入式设备的世界里,NFC扮演的角色要复杂和深刻得多。它不仅仅是数据传输的另一种方式,更是解决设备身份认证、安全启动、参数配置和简化用户交互的“瑞士军刀”。我接触过不少物联网项目,从智能家居的网关到工业现场的数据采集器,一个共同的痛点就是:设备如何安全、便捷地与外界“对话”?传统的Wi-Fi配网繁琐,蓝牙配对也不够直观,而一个简单的“刷卡”或“碰触”动作,在用户体验和系统安全性上往往能带来质的飞跃。
这就是PN532这类专用NFC控制器存在的核心价值。它不是一个简单的射频收发芯片,而是一个高度集成的解决方案。把PN532理解为一个“NFC协议处理专家”更合适。它内部集成了一个80C51内核的微控制器和固化的协议栈,这意味着你的主控MCU(比如STM32、ESP32)不需要去理解复杂的ISO/IEC 14443 A/B、MIFARE帧结构,也不需要实时处理射频载波调制解调。主控只需要通过UART、SPI或I2C发送简单的命令,比如“读取卡号”、“向标签写入数据”、“进入卡模拟模式”,PN532就会帮你搞定底层所有繁杂的通信过程,并返回处理好的结果。这种架构极大地减轻了主机处理器的负担,缩短了开发周期,让你能把精力集中在应用逻辑本身。
PN532支持的三种经典模式——读卡器/写卡器(Reader/Writer)、点对点(P2P)和卡模拟(Card Emulation)——几乎覆盖了嵌入式NFC的所有应用场景。读卡器模式可以用来识别员工卡、门禁卡,或者读取产品内置的NFC标签以获取生产信息;卡模拟模式可以让你的设备“变身”为一张卡,被其他读卡器识别,用于设备身份验证或作为虚拟凭证;点对点模式则允许两个支持NFC的设备直接交换数据,虽然速率不高(最高424kbps),但在传输配置参数、共享小文件(如联系人)时非常高效。选择PN532,本质上是在选择一种经过市场验证的、可靠的NFC接入方案,它背后是NXP在非接触式智能卡领域(如MIFARE)数十年的技术积累和庞大的生态系统。
2. PN532核心功能与硬件架构深度解析
2.1 三模一体:读懂PN532的工作模式
要玩转PN532,必须透彻理解它的三种工作模式,这决定了你的设备能做什么。
读卡器/写卡器模式:这是最常用的模式。在此模式下,PN532作为一个主动设备,产生射频场(13.56MHz),去唤醒和驱动被动式的NFC标签或卡片。它兼容的协议非常广泛:
- ISO/IEC 14443 A:这是大多数市面上13.56MHz非接触式卡的基础标准,我们常见的MIFARE Classic(S50/S70)、MIFARE Ultralight、NTAG系列标签都基于此标准。PN532可以完全模拟一个符合该标准的读卡器。
- ISO/IEC 14443 B:另一种通信标准,在国内二代身份证、部分门禁系统中应用。PN532同样支持。
- FeliCa:由索尼主导的标准,在日本移动支付(如Suica)中广泛应用。PN532的支持使其具备了进入特定区域市场的能力。
- NFC Forum Tag Types:这是NFC论坛为了统一生态定义的标签类型(Type 1-5)。PN532支持读写这些标准化标签,确保了与手机等其他NFC设备的互操作性。
卡模拟模式:在这个模式下,PN532表现得像一张被动式的NFC卡或标签。它不主动产生射频场,而是等待外部读卡器(如手机、门禁读头)的射频场来供电和通信,并做出响应。这对于需要被其他系统识别的设备至关重要。例如,一个智能手表可以用此模式模拟门禁卡,一个工业设备可以模拟一张包含设备序列号和状态的“虚拟卡片”,供维护人员的手机读取。
点对点模式:基于ISO/IEC 18092 (NFCIP-1)标准,允许两个支持NFC的设备(都处于主动模式)建立双向通信链路。PN532在此模式下支持主动和被动两种通信方式。被动模式下,一方产生射频场,另一方负载调制进行通信,更省电;主动模式下,双方轮流产生射频场。虽然速率最高只有424kbps,远低于蓝牙,但其“碰一下即连接”的零配置体验,在传输Wi-Fi密码、蓝牙配对信息、交换电子名片等场景下无可替代。
2.2 硬件拆解:从引脚到天线
PN532采用HVQFN40封装,尺寸仅为6x6x1毫米,非常小巧,适合空间受限的嵌入式设计。其硬件架构可以清晰地分为几个部分:
1. 主机接口:这是PN532与你的主控MCU对话的桥梁。它提供了三种最通用的串行接口,设计时根据主控资源和需求选择其一即可。
- SPI:最高速率可达5 Mbps,是三种接口中最快的。适合对数据传输速率有要求,或主机SPI接口空闲的场景。需要连接4根线(SCLK, MOSI, MISO, SS)。
- UART:最高速率1228.8 kbps,接线简单(TX, RX),在调试和与电脑通信时非常方便。很多开发板默认使用UART与PN532通信。
- I2C:速率最高400 kbps,只需要两根线(SDA, SCL),可以方便地在总线上挂载多个设备。适合接口资源紧张的主控。
注意:PN532的上电初始化序列对接口选择很关键。芯片有几个特定的引脚(如P70, P71)在上电时的电平状态决定了本次启动使用哪种主机接口。一旦选定,在本次上电周期内就无法更改。必须在设计电路时,通过上拉或下拉电阻将这些配置引脚固定到所需电平。
2. 核心微控制器:PN532内部集成了一颗基于80C51内核的MCU,拥有40KB的ROM和1KB的RAM。这40KB ROM中固化了NXP官方的底层固件(Firmware),实现了上述所有复杂的NFC协议解析、数据帧组装、CRC校验、冲突检测等算法。这1KB RAM用于通信缓存。正是这个内置的“小脑”,让外部“大脑”(主MCU)的指令变得简单。
3. 射频模拟前端:这是芯片与天线连接的部分,负责产生13.56MHz的载波,并对发送数据进行调制(通常是ASK或BPSK),对接收到的信号进行解调。它已经高度集成,外部只需要匹配少数几个无源元件(电感、电容、电阻)和天线线圈即可工作。
4. 天线设计:天线是NFC性能的灵魂。PN532的数据手册会提供参考天线设计(通常是一个几匝的矩形或圆形线圈)。天线的电感值(L)和与之匹配的谐振电容(C)必须精确调谐到13.56MHz,才能获得最佳的读写距离和能量传输效率。
- 天线尺寸与距离:官方标称最大距离70mm,但这取决于天线尺寸和质量。更大的天线线圈通常能获得更远的读写距离,但也会占用更多PCB面积。需要根据设备外壳尺寸和所需距离进行权衡。
- 匹配网络:在天线和芯片射频引脚之间,需要设计一个由电容和电阻组成的匹配网络(通常是π型或L型)。它的作用有两个:一是使天线的阻抗与芯片输出阻抗共轭匹配,实现最大功率传输;二是与天线电感构成LC谐振回路,滤除谐波,让能量集中在13.56MHz。匹配网络的计算和调试需要借助网络分析仪,是硬件设计中的关键难点。
3. 从零开始:PN532嵌入式开发实战指南
3.1 硬件选型与电路设计要点
拿到PN532芯片或模块后,第一步是完成硬件连接。对于大多数开发者和快速原型验证,我强烈建议从现成的PN532模块开始,比如常见的“PN532 NFC RFID模块”。这些模块已经帮你做好了天线匹配、电平转换(很多模块支持3.3V/5V),并引出了UART、I2C和SPI接口,你只需要用杜邦线连接到自己的开发板即可,避开了最棘手的射频电路调试。
如果你需要进行产品化的PCB设计,那么必须仔细阅读数据手册中的参考设计。这里有几个硬件设计上的“坑”需要提前避开:
电源与去耦:PN532的工作电压范围是2.7V-5.5V。在射频发射瞬间,电流峰值可能达到60mA以上。因此,电源必须干净、稳定。建议在芯片的VCC引脚附近放置一个容量至少为10uF的钽电容或陶瓷电容进行储能,同时并联一个0.1uF的陶瓷电容进行高频去耦。电源走线要尽量粗短。
配置引脚处理:如前所述,P70、P71等引脚决定了启动接口。例如,要让芯片从UART启动,通常需要将P70拉低,P71拉高。务必根据你选择的接口,在PCB上用电阻做好固定上拉或下拉,不要悬空。
天线部分布局:
- 天线线圈:尽量使用PCB上的走线来制作天线(通常放在板子边缘或背面层)。线宽、匝数、间距需要严格按照参考设计计算。可以使用在线PCB天线计算器进行初步估算。
- 远离干扰源:天线区域下方和周围禁止放置任何金属(包括螺丝孔、大面积铺铜)、高速数字信号线或开关电源电路,这些都会严重干扰射频场,导致距离急剧缩短甚至无法工作。
- 匹配元件:匹配网络的电容(通常是几皮法到几十皮法)必须使用高精度、高Q值、低温度系数的NP0/C0G材质陶瓷电容。普通的瓷片电容参数离散性大,会导致谐振频率偏移,性能不稳定。
3.2 软件驱动与通信协议解析
硬件就绪后,下一步就是让主控MCU和PN532“对话”。PN532有一套自己的命令-响应协议。无论你使用UART、SPI还是I2C,通信的帧格式是类似的。
一个典型的命令帧结构如下:[Preamble] [Start Code] [Length] [Length Checksum] [TFI (Frame Identifier)] [Data Bytes...] [Data Checksum] [Postamble]
- 前导码和起始码:通常是固定的0x00, 0x00, 0xFF。
- 长度和长度校验:长度字节(LEN)指示数据部分的字节数,长度校验字节(LCS)满足
LCS + LEN = 0x100。 - TFI:标识帧的方向。
0xD4表示主机到PN532的命令,0xD5表示PN532到主机的响应。 - 数据:具体的命令代码和参数。例如,读取MIFARE Classic卡号的命令代码是
0x4A。 - 数据校验和:从TFI开始到所有数据字节的累加和取反再加1(二进制补码)。
主控MCU需要按照这个格式组装命令帧发送给PN532,然后以同样的格式解析PN532返回的响应帧。响应帧中会包含一个状态码,指示命令执行成功(0x00)或何种错误。
开发流程建议:
- 使用官方库或成熟开源库:除非有极致的体积或性能要求,否则不要从零开始写驱动。Arduino社区有优秀的
Adafruit-PN532库,对于STM32,也有基于HAL库的移植版本。这些库已经封装了底层的帧组装、发送、接收和超时重试逻辑,你只需要调用高阶API,如readPassiveTargetID()、mifareclassic_ReadBlock()等。 - 从UART调试开始:将PN532模块通过USB转TTL工具连接到电脑,使用串口助手(如Putty、SecureCRT)手动发送命令帧,观察响应。这是理解协议最直观的方式。很多模块的默认通信波特率是115200。
- 分步测试:先发送最基础的诊断命令,如
GetFirmwareVersion(命令码0x02),确保物理连接和基本通信正常。然后再测试轮询寻卡InListPassiveTarget,最后进行具体的读卡、写卡操作。
3.3 典型应用场景代码实现
假设我们使用Arduino平台和Adafruit_PN532库,实现一个读取MIFARE Classic卡UID并验证密钥读取第一个区块数据的例子。
#include <Wire.h> #include <Adafruit_PN532.h> // 使用I2C接口,PN532的I2C地址默认为0x24 Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); void setup(void) { Serial.begin(115200); nfc.begin(); uint32_t versiondata = nfc.getFirmwareVersion(); if (!versiondata) { Serial.println("未找到PN532板卡,请检查连线..."); while (1); // 停住 } // 打印固件版本信息 Serial.print("找到芯片 PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); Serial.print("固件版本: "); Serial.print((versiondata>>16) & 0xFF, DEC); Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC); // 配置PN532以读取标签 nfc.SAMConfig(); Serial.println("等待一张ISO14443A卡靠近..."); } void loop(void) { uint8_t success; uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // 缓冲区存储UID uint8_t uidLength; // UID的实际长度(4或7字节) // 等待一张MIFARE Classic类型卡片 success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); if (success) { // 成功读取到卡 Serial.println("发现一张卡片!"); Serial.print("UID长度: ");Serial.print(uidLength, DEC);Serial.println(" 字节"); Serial.print("UID数值: "); nfc.PrintHex(uid, uidLength); Serial.println(""); // 尝试使用默认密钥A (0xFF 0xFF 0xFF 0xFF 0xFF 0xFF) 验证第4扇区(区块16)的0区块 // MIFARE Classic 1K卡有16个扇区,每个扇区有4个块,每个块16字节。 // 每个扇区的最后一个块(如块3,7,11...)是扇区尾块,存储密钥A、密钥B和访问控制位。 uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; uint8_t blockNumber = 4; // 我们尝试读取第4扇区的第0个块(即块16) success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, blockNumber, 0, keya); if (success) { Serial.println("扇区验证成功!"); uint8_t data[16]; success = nfc.mifareclassic_ReadDataBlock(blockNumber, data); if (success) { Serial.print("区块 ");Serial.print(blockNumber);Serial.println(" 数据:"); nfc.PrintHexChar(data, 16); } else { Serial.println("读取区块失败"); } } else { Serial.println("扇区验证失败(可能是密钥不正确或卡片已加密)"); } // 等待几秒,避免连续读卡 delay(2000); } }这段代码清晰地展示了从初始化、寻卡、获取UID到密钥验证和读数据的完整流程。在实际产品中,你需要将UID用于身份识别,并根据访问控制位决定是否进行写操作。
4. 天线调谐与性能优化实战
天线性能直接决定了NFC的读写距离和稳定性,是产品化过程中必须攻克的一关。即使使用现成模块,了解其原理也对排查问题大有裨益。
4.1 天线参数测量与计算
天线的核心参数是电感值(L)和谐振频率(f)。我们的目标是让天线在13.56MHz发生串联谐振。
- 测量天线电感:使用LCR表直接测量天线线圈(不含匹配电容)在13.56MHz下的电感值
L_ant。如果没有高频LCR表,可以用网络分析仪通过S11参数反推,或使用已知电容和信号发生器/频率计通过谐振法粗略估算。 - 计算匹配电容:对于简单的串联谐振,谐振频率公式为
f = 1 / (2π√(LC))。因此,所需的总谐振电容C_total = 1 / ( (2πf)^2 * L_ant )。这个C_total由匹配网络中的电容共同构成。 - 设计匹配网络:PN532的典型应用电路使用一个π型匹配网络(芯片端串联电容C1,天线端并联电容C2到地,中间串联天线电感)。数据手册会给出参考值,例如
C1=27pF,C2=100pF(具体值取决于天线电感)。你需要根据测量的L_ant和参考电路,微调C1和C2的值。C2主要影响谐振频率,C1主要影响阻抗匹配。
4.2 使用网络分析仪进行调试
网络分析仪是调试天线匹配的终极工具。将天线连同匹配网络连接到网络分析仪的端口1(Port 1)。
- 校准:首先在电缆末端进行开路、短路、负载校准。
- 观察S11参数:S11反映了从端口看进去的反射系数。在史密斯圆图上,理想状态是谐振点在13.56MHz处落在圆图中心(即阻抗为50欧姆,反射最小)。在幅频图上,你会看到一个凹陷的“谐振谷”,谷底对应的频率就是当前的谐振频率。
- 调谐步骤:
- 如果谐振频率低于13.56MHz,说明总电容太大,需要减小C2 或 C1。
- 如果谐振频率高于13.56MHz,说明总电容太小,需要增加C2 或 C1。
- 反复微调电容(使用可调电容或更换不同值的电容),直到谐振谷底精确对准13.56MHz,并且S11在该点的值尽可能低(例如小于-20dB),表示大部分能量都被辐射出去,反射很少。
实操心得:在没有网分的情况下,一个土办法是使用一个已知良好的读卡器(如手机)和一张标准卡片,固定距离(如1厘米),通过观察读卡是否稳定、距离是否达标来定性判断。调整电容,找到读卡最稳定、距离最远的那个电容值。虽然不精确,但对于要求不高的项目或故障排查是有效的。
4.3 环境影响因素与对策
- 金属干扰:这是最常见的问题。设备内的电池、屏蔽罩、螺丝、大面积的接地铜箔都会形成涡流,吸收或扰乱射频磁场。解决方案包括:1) 尽可能增大天线与金属物体的距离(至少5mm以上);2) 在金属表面和天线之间增加铁氧体片或磁屏蔽材料,为磁场提供低磁阻通路,引导磁场绕过金属;3) 在天线背面开槽,切断金属平面上的涡流路径。
- 多天线干扰:如果设备中有多个频率相近的天线(如2.4GHz WiFi天线),需保证足够的空间隔离,或从结构上让它们朝向不同方向。
- 外壳材料:非金属外壳(塑料、玻璃)对NFC信号影响很小。金属外壳会完全屏蔽信号,必须在对应天线区域开窗,并使用非金属材料(如塑料、陶瓷)填充。
5. 高级应用与安全考量
5.1 实现卡模拟与点对点通信
卡模拟:让PN532模拟一张MIFARE Classic卡。你需要做的是:
- 将PN532切换到卡模拟模式(发送特定配置命令)。
- 预先在PN532的缓冲区中设置好卡的UID和静态数据。
- 当外部读卡器靠近时,PN532会自动响应读卡器的指令,返回预设的UID和数据。关键点:模拟的UID必须是可变的(除非你使用特定型号支持写UID的卡片),并且无法完美模拟所有卡片的安全特性(如MIFARE Classic的加密认证过程),因此多用于不需要高安全性的场景,如设备标识、简单的信息传递。
点对点通信:基于SNEP(Simple NDEF Exchange Protocol)协议交换NDEF(NFC Data Exchange Format)消息。这是手机间“碰一碰”分享链接、联系人背后的协议。使用PN532实现P2P相对复杂,需要实现完整的LLCP(Logical Link Control Protocol)和SNEP协议栈。幸运的是,NXP提供的底层固件可能已经支持部分高层协议命令。你需要查阅更详细的应用笔记,通过发送InJumpForDep、InDataExchange等命令来建立连接和交换数据块。
5.2 MIFARE Classic卡片的安全与破解警示
MIFARE Classic是PN532最常打交道的卡片之一,但其加密算法(Crypto-1)已被公开破解。这意味着,使用默认密钥或弱密钥的MIFARE Classic卡,其数据可以被轻易读取和篡改。
对于开发者这意味着:
- 不要用MIFARE Classic存储敏感信息:如门禁系统的核心密钥、支付金额等。它只适用于低安全需求的场景,如员工卡号、物品标识ID。
- 务必修改默认密钥:出厂默认密钥(0xFF...FF, 0xA0A1A2A3A4A5等)是公开的。在产品发行前,必须用强密钥(随机生成)替换所有扇区的默认密钥A和密钥B。
- 正确设置访问控制位(ACL):每个扇区的尾块包含了该扇区4个块的访问权限控制。务必根据需求仔细配置,例如,可以设置成“密钥A可读可写,密钥B仅用于更改密钥A”,或者“密钥A验证后可读,但不可写”。错误的ACL设置可能导致扇区被意外锁死。
- 考虑更安全的替代方案:对于高安全需求,应选择MIFARE DESFire(使用AES加密)、NTAG(具有密码保护功能)或符合ISO/IEC 14443-4标准的CPU卡。
5.3 低功耗设计策略
PN532本身在休眠模式下功耗极低(12µA),但在主动轮询寻卡时,射频部分持续工作,功耗在几十mA量级。在电池供电的嵌入式设备中,需要优化功耗策略。
- 间歇性轮询:不要让PN532持续处于寻卡状态。主控MCU可以定时(例如每秒一次)唤醒PN532,发送一轮寻卡指令(
InListPassiveTarget),如果没有检测到卡片,立即让其进入低功耗休眠模式(通过发送PowerDown命令)。 - 利用中断引脚:PN532有一个IRQ(中断请求)引脚。可以将其配置为当检测到射频场活动(有卡片进入)时才触发中断,唤醒主控MCU和PN532自身。这实现了真正的“零待机功耗”,只有卡片靠近时才消耗能量。
- 降低射频场强:通过软件命令可以调节PN532的射频输出功率。在保证必要读写距离的前提下,适当降低场强可以节省功耗。
6. 开发资源与故障排查速查表
6.1 官方与社区资源
- NXP官方:在NXP官网搜索PN532,可以找到完整的数据手册(Datasheet)、用户手册(User Manual)和应用笔记(Application Notes)。其中应用笔记AN10833(天线设计指南)和AN10834(匹配网络设计)是硬件设计的圣经。
- 开发套件:NXP官方的OM5581/N5322S02设计套件包含了评估板、天线、电缆和详细的软件示例,是入门和深度开发的最佳起点。
- 开源社区:Arduino的Adafruit_PN532库、GitHub上的
libnfc(一个跨平台的NFC库)都提供了高质量的驱动和示例。对于STM32开发者,可以寻找基于HAL库的移植版本。
6.2 常见问题与解决方案速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 完全无法通信,读不到固件版本 | 1. 电源电压不对或电流不足。 2. 接口模式(UART/SPI/I2C)配置引脚电平错误。 3. 接线错误或接触不良。 4. 波特率不匹配(UART模式)。 | 1. 用万用表测量VCC和GND电压,确保在2.7-5.5V之间,并用示波器观察电源噪声。 2. 检查P70, P71等配置引脚的上下拉电阻是否符合目标接口模式。 3. 重新检查并插拔所有连接线。对于SPI,确认SS片选信号有效。 4. 尝试常见的波特率:9600, 115200, 1228.8k等。 |
| 能读到固件版本,但无法检测到卡片 | 1. 天线未谐振在13.56MHz。 2. 天线附近有金属干扰。 3. 卡片类型设置错误。 4. 射频场未开启。 | 1.这是最常见原因。使用网络分析仪检查天线谐振点。若无仪器,尝试微调匹配电容C2。 2. 移除天线附近的金属物体,或增加距离/加磁屏蔽材料。 3. 确认寻卡命令中指定的卡片类型(如14443A)与实际卡片一致。 4. 发送 RFConfiguration命令确保RF场已开启。 |
| 读写距离非常近(<1cm) | 1. 天线匹配严重失调。 2. 天线电感量过大或过小。 3. 电源驱动能力不足,射频输出功率低。 4. 环境干扰强。 | 1. 重点调试天线匹配网络,使用网分精确调谐。 2. 检查天线线圈的匝数、直径是否符合设计,用LCR表测量电感值。 3. 检查电源路径上的电阻和电感,确保能提供峰值电流。可尝试外接稳压电源测试。 4. 更换测试地点,远离电脑显示器、大功率电源等设备。 |
| 读卡不稳定,时好时坏 | 1. 电源上有噪声或纹波过大。 2. 天线匹配处于临界状态。 3. 通信时序受到其他中断干扰。 | 1. 在PN532的VCC引脚就近增加一个大容量(如47uF)电解电容缓冲。 2. 重新精细调整匹配电容,确保谐振峰陡峭且中心频率准确。 3. 在读写卡的关键时序段,暂时关闭MCU的其他高优先级中断。 |
| 能读UID,但验证密钥失败 | 1. 使用的密钥不正确。 2. 该扇区已被其他密钥保护。 3. 卡片不是MIFARE Classic类型。 4. 访问控制位设置导致该密钥无权进行此操作。 | 1. 确认使用的密钥(Key A或Key B)是否正确。尝试出厂默认密钥。 2. 如果卡片被初始化过,密钥可能已被更改。需要知道当前密钥。 3. 确认卡片类型。MIFARE Ultralight等卡片没有密钥验证机制。 4. 读取扇区尾块,解析访问控制位,确认当前密钥的权限。 |
| 写卡失败 | 1. 密钥验证未通过(同上)。 2. 试图写入写保护的块(如厂商块、已设置写保护的块)。 3. 写命令格式或参数错误。 4. 卡片在写过程中被移开。 | 1. 确保先成功完成认证(Authentication)。 2. MIFARE Classic卡的块0(厂商信息)不可写。检查目标块的访问权限。 3. 核对写数据命令的格式,确保块地址、16字节数据格式正确。 4. 写操作需要卡片持续在场,确保操作期间卡片稳定。 |
调试NFC项目,尤其是天线部分,需要耐心。从确保基础通信开始,逐步验证寻卡、读卡、写卡功能。遇到性能问题,十之八九出在天线上。一份清晰的原理图、一个网络分析仪和一套可调电容套装,是你解决这些问题最得力的工具。
