XIAO nRF52840 NFC标签模拟实战:从原理到动态应用开发

📅 2026/8/2 18:15:59
XIAO nRF52840 NFC标签模拟实战:从原理到动态应用开发
1. 项目概述为什么要在XIAO nRF52840上玩NFC如果你手头有一块Seeed Studio XIAO nRF52840或者带传感器的Sense版本除了用它做蓝牙项目、跑TinyML有没有想过它内置的NFC功能能玩出什么花样这块小小的板子核心是一颗Nordic Semiconductor的nRF52840 SoC它集成了一个完整的NFC标签前端NFCT。这意味着你不需要外接任何模块就能让这块开发板变身成一个可编程的NFC标签或者读取其他NFC标签的信息。听起来可能有点抽象我举几个实际的例子。你可以用它做一个智能名片手机一碰就自动弹出你的联系方式、个人主页可以做一个智能家居的触发开关手机碰一下就自动打开客厅的灯或者播放音乐甚至可以结合板载的传感器做一个“碰一碰记录环境数据”的数据记录器。前段时间网上很火的“NFC音乐墙”原理上完全可以用这块板子来实现——每个板子预存一首歌的链接或指令手机靠近不同的板子就能播放不同的音乐。这比用静态的NTAG标签酷多了因为你的程序可以动态改变NFC标签里的内容或者根据传感器数据做出不同的响应。这个项目就是带你彻底吃透XIAO nRF52840上这颗NFCT外设的用法。我会从最基础的原理讲起手把手带你完成Arduino环境下的配置、代码编写再到几个有代表性的实战应用。无论你是想快速实现一个点子还是想深入理解NFC-A Type 2 Tag的底层通信这篇文章都能给你一份可以直接“抄作业”的指南。2. 核心硬件与NFC原理浅析在动手写代码之前我们得先搞清楚手头的“武器”和它工作的“战场”。XIAO nRF52840的核心是nRF52840芯片而NFC功能则由其内部的NFCTNFC Tag外设实现。2.1 nRF52840的NFCT外设能力边界首先必须明确一点nRF52840的NFCT是一个标签前端。这是一个关键定位它决定了我们能做什么、不能做什么。它能做什么Tag Emulation模式模拟一个符合NFC Forum Type 2 Tag标准的被动NFC标签。在这种模式下开发板就像一个普通的NFC贴纸比如NTAG213等待NFC读卡器最常见的就是你的手机来靠近、供电并读取数据。板子本身不需要额外供电理论上但为了运行程序通常需要能量由读卡器通过射频场提供。这是我们将要主要使用的模式。它不能做什么它不是一个完整的NFC读卡器。这意味着你不能直接用这块板子去主动读取另一张NFC卡片或标签的信息。如果你想实现读卡功能通常需要外接一个专用的NFC读卡器芯片如PN532并通过I2C或SPI与XIAO通信。为什么这么设计主要是成本和功耗。对于很多物联网设备它们只需要被手机便捷地识别和交互例如配对、获取URL模拟标签是最高效、最省电的方式。nRF52840的NFCT被设计用来优化这种场景。2.2 NFC-A与Type 2 Tag通信的基础协议我们的板子模拟的是NFC-A (ISO/IEC 14443 Type A)接口下的Type 2 Tag。你可以把它理解为一套标准的“对话规则”。NFC-A规定了射频场的频率13.56MHz、调制方式、编码规则等物理层和链路层的细节。手机和我们的板子就在这个“频道”上通话。Type 2 Tag规定了内存结构、访问命令和权限。它把标签的存储空间想象成一个个“块”Block每个块通常16字节。有专门的命令来读READ写WRITE这些块。一个Type 2 Tag的内存布局大致如下块号 (Block)用途说明0厂商信息块。包含NFC Forum规定的标识、唯一IDUID的一部分等。通常只读。1容量块。定义标签的总存储大小例如NTAG213是144字节。2数据块开始。从这里开始才是我们可以自由读写用来存放URL、文本等信息的地方。当你的手机靠近一个模拟成功的标签时底层会发生一系列复杂的交互激活射频场、选择标签类型、读取UID、然后根据应用需求读取特定块的数据。幸运的是Arduino库为我们封装了这些底层细节我们只需要关心“我要在标签里存什么数据”2.3 XIAO nRF52840的硬件连接这部分非常简单因为NFCT功能已经集成你不需要连接任何额外的导线。NFC天线被直接集成在XIAO nRF52840开发板的PCB上就是板上那个方形的线圈。你唯一要确保的是通过USB-C口为板子正常供电或使用电池。在编程时避免有大型金属物体紧贴线圈区域以免影响天线性能。注意XIAO nRF52840 Sense版本额外集成了麦克风、IMU等传感器但其NFC部分与基础版完全相同本教程完全适用。3. 开发环境搭建与核心库解析我们将使用最广泛的Arduino IDE进行开发。虽然也可以用PlatformIO但Arduino库的支持目前最为直接。3.1 安装板卡支持与核心库安装Arduino IDE从Arduino官网下载并安装最新稳定版如1.8.x或2.x。建议使用2.x版本库管理更友好。添加板卡支持打开Arduino IDE进入“文件” - “首选项”。在“附加开发板管理器网址”中填入https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json然后打开“工具” - “开发板” - “开发板管理器”。搜索“Seeed nRF52”找到“Seeed nRF52 Boards by Seeed Studio”点击安装。这个过程会下载nRF52840所需的编译工具链和核心框架可能需要一些时间。选择开发板与端口安装完成后在“工具” - “开发板”中选择“Seeed XIAO nRF52840 (Sense)”。将板子通过USB连接电脑在“工具” - “端口”中选择对应的串口通常显示为XIAO nRF52840或类似。3.2 理解并安装NFC库Adafruit_PN532的“变体”这里有一个非常重要的点我们使用的是Adafruit_PN532库但不是用来驱动PN532读卡器而是利用它内部已经实现的、与NFC标签通信的高级逻辑。nRF52840的底层驱动NFCT会将自己“伪装”成一个PN532兼容的设备供上层库调用。安装库打开“工具” - “管理库...”。搜索“Adafruit PN532”。选择由Adafruit维护的版本进行安装。安装时通常会提示你同时安装依赖库Adafruit BusIO一并确认安装。库的适配性这个库原本是为PN532硬件读卡器设计的但Nordic在其nRF5 SDK的示例中通过实现一组相同的底层接口如_readPassiveTargetID使得这个库可以在nRF52840上无缝工作用于标签模拟。这是开源生态中一种巧妙的“代码复用”。3.3 验证基础NFC功能一个简单的“Hello NFC”示例在深入复杂应用前我们先上传一个最简单的测试程序确保整个链路是通的。#include Adafruit_PN532.h // 定义必要的引脚对于XIAO nRF52840这些是虚拟的但库需要 #define PN532_IRQ (2) #define PN532_RESET (3) // 未连接但需要定义 Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // 等待串口连接仅用于调试 Serial.println(Hello! XIAO nRF52840 NFC Tag Emulation Test); nfc.begin(); uint32_t versiondata nfc.getFirmwareVersion(); if (! versiondata) { Serial.println(Didnt find PN53x board); while (1); // 停住 } // 打印固件版本信息 Serial.print(Found chip PN5); Serial.println((versiondata24) 0xFF, HEX); Serial.print(Firmware ver. ); Serial.print((versiondata16) 0xFF, DEC); Serial.print(.); Serial.println((versiondata8) 0xFF, DEC); // 配置板子以模拟Type 2 Tag nfc.SAMConfig(); // 定义NDEF消息一个纯文本 Serial.println(Setting tag data to Hello from XIAO!); uint8_t ndefUri[] { 0xD1, // MB/ME/CF/1/IL/TNF 字段组合表示这是一个NDEF记录 0x01, // 类型长度 0x0C, // 载荷长度 (12字节) T, // 类型为 T (文本) 0x02, // 状态字节语言编码为2字节en e, n, H,e,l,l,o, ,f,r,o,m, ,X,I,A,O,! }; // 开始模拟标签 nfc.startPassiveTargetIDDetection(PN532_MIFARE_ISO14443A); Serial.println(Waiting for an NFC reader (e.g., your phone)...); } void loop(void) { // 等待手机靠近 if (nfc.tagPresent(100)) { // 检查100毫秒内是否有读卡器 Serial.println(Tag detected by reader!); // 这里可以添加更复杂的交互逻辑 delay(1000); // 简单延时避免频繁触发 } }上传与测试将代码上传到XIAO nRF52840。打开串口监视器波特率设为115200。你应该看到“Found chip PN5...”和等待读卡器的提示。用一部支持NFC的安卓手机确保NFC功能已打开靠近板子上的天线线圈。串口监视器会打印“Tag detected by reader!”。同时你的手机通常会弹出一个通知显示它读取到了一段文本“Hello from XIAO!”。如果手机安装了NFC工具类App如“NFC Tools”可以更清晰地看到读取到的NDEF记录内容。这个例子虽然简单但验证了从库初始化、标签模拟到被手机识别的完整流程。如果这一步成功了恭喜你硬件和基础环境已经就绪。4. 深入NDEF让NFC数据被手机智能识别上一节我们硬编码了一段字节数组作为NDEF消息。但要让手机或其他NFC设备能智能地识别并做出相应动作如打开浏览器、添加联系人我们需要遵循标准的NDEFNFC Data Exchange Format格式。4.1 NDEF记录结构解析NDEF消息由一个或多个NDEF记录组成。一个记录就像一封信包含信封记录头和信纸载荷。记录头包含重要标志如是否为消息的起始/结束记录、载荷类型等。最重要的字段是TNF类型名称格式和类型Type。载荷实际存放的数据比如URL、文本、电话号码。对于最常见的场景URI网址TNF0x01 (Well-Known)TypeU。载荷的第一个字节是URI前缀码例如0x01代表http://www.后面跟着URI的剩余部分。文本TNF0x01 (Well-Known)TypeT。载荷的第一个字节是状态字节包含语言编码长度后面是语言代码和实际文本。手动构造这些字节数组非常繁琐且容易出错。因此我们使用一个更高级的库来帮忙。4.2 使用ArduinoNDEF库简化操作为了更方便地创建NDEF消息我们引入另一个库ArduinoNDEF。它可能不在Arduino库管理器中需要手动安装。下载库从GitHub如don的ArduinoNDEF仓库下载ZIP文件。安装库在Arduino IDE中点击“项目” - “加载库” - “添加.ZIP库...”选择下载的ZIP文件。编写更清晰的代码以下示例展示如何创建一个包含URL的NDEF消息。#include Adafruit_PN532.h #include NDEF.h #include NDEFMessage.h #include NDEFRecord.h #define PN532_IRQ (2) #define PN532_RESET (3) Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); void setup(void) { Serial.begin(115200); while (!Serial); nfc.begin(); nfc.SAMConfig(); // 1. 创建一个NDEF消息容器 NDEFMessage message; // 2. 创建一个URI记录 // 参数URI前缀码 URI字符串 // 0x01 代表 http://www. NDEFRecord uriRecord NDEFRecord::createUriRecord(0x01, seeedstudio.com/xiao); // 3. 将记录添加到消息中 message.addRecord(uriRecord); // 4. 获取编码后的字节数组和长度 int encodedSize message.getEncodedSize(); uint8_t ndefBuffer[encodedSize]; message.encode(ndefBuffer); // 5. 将NDEF消息设置为标签模拟的内容 // 注意这里需要调用nRF5 SDK底层函数Adafruit库未直接暴露此接口。 // 实际中我们需要使用Seeed或Nordic提供的特定示例代码。 // 以下为概念性代码 // nfc.ntag2xx_EmulateStart(ndefBuffer, encodedSize); Serial.println(NDEF Message created for URI: http://www.seeedstudio.com/xiao); Serial.println(Waiting for NFC reader...); } void loop(void) { // 模拟循环 if (nfc.tagPresent(50)) { Serial.println(Interacted!); delay(1000); } }重要提示上面的nfc.ntag2xx_EmulateStart函数在标准的Adafruit_PN532库中可能不存在。这是因为将NDEF数据注入到标签模拟引擎需要调用nRF52840更底层的驱动API如nfc_tag_emulation。Seeed Studio通常会提供一个整合好的示例。你需要去Seeed的官方Wiki或GitHub仓库查找名为“NFC_Example”或“NFCT_Emulation”的示例代码那里面包含了如何正确调用nfc_tag_emulation函数的完整流程。我们的代码展示了如何使用ArduinoNDEF库构造标准消息最后一步需要替换为官方示例中的正确函数调用。4.3 实战创建智能名片vCard一个更实用的例子是创建电子名片。当手机读取后可以直接弹出添加联系人的选项。// 假设已正确初始化nfc对象并配置为标签模拟模式 void createVCardTag() { // vCard数据简化版 String vCardData BEGIN:VCARD\r\n; vCardData VERSION:3.0\r\n; vCardData FN:Zhang San\r\n; // 姓名 vCardData ORG:Seeed Studio\r\n; // 组织 vCardData TEL;TYPECELL:86 13800138000\r\n; // 电话 vCardData EMAIL:zhangsanexample.com\r\n; // 邮箱 vCardData URL:https://www.seeedstudio.com\r\n; // 网址 vCardData END:VCARD; // 创建一个MIME类型记录。vCard的MIME类型是 text/vcard NDEFRecord mimeRecord; mimeRecord.setTnf(TNF_MIME_MEDIA); mimeRecord.setType(text/vcard); // 设置类型 // 将String转换为uint8_t数组 uint8_t payload[vCardData.length() 1]; vCardData.getBytes(payload, sizeof(payload)); mimeRecord.setPayload(payload, vCardData.length()); NDEFMessage message; message.addRecord(mimeRecord); // ... (后续编码message并启动标签模拟需参考官方完整示例) Serial.println(VCard NDEF message created.); }当手机读取到这个标签时系统识别到text/vcardMIME类型就会自动询问是否要将此联系人信息保存到通讯录。这就是NDEF标准化的威力——数据有了明确的语义接收设备就知道该如何处理它。5. 进阶应用动态NFC与传感器联动静态数据固然有用但让NFC标签的内容“活”起来才是XIAO nRF52840的真正优势。结合板载的处理器和传感器我们可以实现动态内容生成。5.1 基于环境传感器的动态URL假设我们想做一个环境监测标签手机碰一下就能看到当前的温湿度数据。我们无法在标签里存储一个实时变化的数值但可以存储一个指向云端服务的URL并将实时数据作为参数传递。思路板子读取传感器如Sense版的温湿度传感器数据。将数据通过Wi-Fi或蓝牙上传到某个云平台如Blynk、Thingspeak或者本地服务器并生成一个唯一的数据ID或页面。板子动态生成一个包含这个数据ID的URL并将其设置为NFC标签的内容。手机读取到这个URL打开浏览器即可查看实时或历史数据。由于XIAO nRF52840本身不带Wi-Fi这里以蓝牙传输数据到手机再由手机App转发到云端为例描述概念流程// 伪代码/概念流程 #include Adafruit_PN532.h #include NDEF.h // 假设有温湿度传感器库 #include Seeed_SHT35.h // 假设有蓝牙库例如ArduinoBLE #include ArduinoBLE.h SHT35 sensor; float temperature, humidity; void setup() { // 初始化传感器、NFC、蓝牙 sensor.init(); nfc.begin(); nfc.SAMConfig(); BLE.begin(); // ... 配置蓝牙服务和特征值 } void loop() { // 1. 读取传感器数据 temperature sensor.getTemperature(); humidity sensor.getHumidity(); // 2. 通过蓝牙将数据发送到已连接的手机App // BLECharacteristic.write(temperature, humidity); // 3. 假设手机App收到数据后将其上传到云端并返回一个短链接例如https://mycloud.com/data/abc123 // 这里我们模拟这个短链接。实际中这个链接需要由手机App通过蓝牙回传给板子。 String dynamicUrl https://mycloud.com/data/abc123; // 4. 创建包含此动态URL的NDEF消息 NDEFMessage msg; // 注意0x01是URI前缀码代表http://www.但我们的链接是https需要处理。 // 更通用的方法是使用前缀码0x00无前缀然后写入完整URL。 // NDEFRecord uriRec NDEFRecord::createUriRecord(0x00, dynamicUrl.c_str()); // 需要库支持 // 这里简化处理假设createUriRecord能处理完整URL msg.addRecord(NDEFRecord::createUriRecord(0x00, dynamicUrl.c_str())); // 5. 编码并更新NFC标签模拟的内容 // updateNFCTagContent(msg); // 调用底层API更新模拟标签的数据 // 6. 等待下一次交互或数据更新 delay(10000); // 每10秒更新一次数据和NFC内容 }这个例子展示了“动态”的含义NFC标签里的URL不是写死的而是根据传感器数据或外部输入实时生成的。手机每次触碰都可能读到不同的链接指向不同的数据。5.2 实现简单的交互逻辑计数器一个更简单的动态例子是触碰计数器。每次手机触碰板子内部的计数器加1并将新的计数值通过NFC标签返回给手机。这需要板子在标签模拟模式下能够响应手机的读操作并返回不同的数据。这涉及到NFCT的高级事件处理。nRF52840的NFCT支持在收到READ命令时触发中断我们可以在中断服务程序ISR中动态改变要返回的内存数据缓冲区。核心步骤配置NFCT进入仿真模式并设置好初始的NDEF消息如“Count: 0”。使能READ事件中断。在READ事件中断服务函数中递增计数器。根据新计数器值重新生成NDEF消息如“Count: 1”。更新NFCT内部用于响应的数据缓冲区RAM中特定的寄存器区域。手机下次读取时就会得到更新后的数据。这部分代码严重依赖nRF5 SDK的底层API在纯Arduino环境下实现较为复杂。通常Seeed或Nordic会提供这样的高级示例。你需要查找名为nfc_tag_emulation_callback或类似的示例它展示了如何挂钩READ事件并修改数据。5.3 功耗考量如何实现低功耗触碰唤醒一个很酷的应用是板子平时处于深度睡眠微安级功耗当NFC读卡器手机靠近时射频场产生的能量被NFCT天线接收可以产生一个唤醒事件将CPU从睡眠中唤醒。实现原理在进入深度睡眠前配置NFCT处于“感应场检测”模式。当有外部NFC场手机靠近时NFCT会触发一个中断。这个中断可以作为唤醒源将系统从深度睡眠中唤醒。唤醒后系统再初始化NFCT进入完整的标签模拟模式与手机进行通信。这种方式非常适合电池供电的物联网设备可以实现“零待机功耗”的触碰交互。在nRF5 SDK中这通常通过配置POWER和NFCT模块的低功耗模式相关寄存器来实现。在Arduino框架下你可能需要直接调用一些底层库函数或修改板支持包BSP中的电源管理代码。6. 问题排查与调试心得在实际操作中你几乎一定会遇到各种问题。这里分享一些我踩过的坑和解决方法。6.1 常见问题与解决方案问题现象可能原因排查步骤与解决方案手机完全没反应1. NFC天线损坏或屏蔽。2. 代码未成功进入标签模拟模式。3. 手机NFC功能未开启或感应区域不对。1.检查硬件确保板子供电正常天线区域无大面积金属覆盖。用另一台手机或NFC读卡器交叉测试。2.检查串口输出上传最简单的测试代码查看串口是否打印“Found chip PN5...”。如果没有说明PN532库与板子通信失败检查板卡选择、端口是否正确。3.检查手机确保NFC和读卡器模式已打开。尝试用手机读取一张公交卡确认手机本身功能正常。将手机感应中心通常在背部上方对准板子天线缓慢移动。手机有反应“滴”声或振动但无内容或提示“无法识别的标签”1. NDEF数据格式错误。2. 数据未写入标签模拟缓冲区。3. 标签类型模拟不正确。1.简化数据先用库函数创建一个最简单的URI记录如createUriRecord(0x01, example.com)进行测试。2.使用调试工具在手机上安装“NFC Tools”或“Mifare Classic Tool”等App。读取标签查看原始字节数据。对比你代码中生成的NDEF字节数组看是否一致。3.确认模拟函数确保你调用了正确的函数来启动标签模拟并传入了NDEF数据缓冲区。参考官方示例确认函数调用顺序和参数。串口打印正常但模拟不稳定时好时坏1. 电源不稳定。2. 程序中有耗时操作阻塞了NFCT响应。3. 射频干扰。1.使用稳定电源避免使用老旧的USB线或电脑前置USB口供电尝试用手机充电器或移动电源供电。2.优化主循环确保loop()中不要有长时间的delay()。标签模拟需要CPU及时响应NFCT的中断。将长时间任务拆分成非阻塞式。3.远离干扰源让板子远离显示器、大功率USB设备、无线充电器等。编译错误提示Adafruit_PN532相关函数未定义1. 库版本不兼容。2. 针对nRF52840的适配文件缺失。1.使用Seeed推荐的库有时需要特定修改版的Adafruit_PN532库。查看Seeed XIAO nRF52840的官方Wiki或示例代码仓库使用他们提供的库文件。2.检查库路径确保没有多个版本的PN532库冲突。在Arduino IDE的“项目” - “加载库” - “管理库...”中查看已安装库的版本。6.2 调试技巧利用串口和手机App串口是你的眼睛在代码的关键节点初始化成功、数据生成后、触发事件时添加Serial.println()输出状态信息。这是判断程序流是否按预期执行的最基本方法。手机NFC工具App是数据验证器NFC Tools非常适合查看NDEF记录。它能清晰地解析出URI、文本、vCard等内容。如果这里显示正确说明你的NDEF编码没问题。Mifare Classic Tool更适合查看底层数据。它可以显示读取到的所有扇区、块的内容十六进制和ASCII格式。当你需要确认写入的原始字节是否正确时这个工具非常有用。逻辑分析仪进阶如果问题非常底层如通信根本未建立可以考虑用逻辑分析仪抓取NFCT相关引脚的波形。但这需要一定的硬件知识和设备。6.3 关于“NFC中继攻击”的误解在搜索资料时你可能会看到“NFC中继攻击”这个词。这里必须澄清XIAO nRF52840的NFCT功能与此无关也无法用于此类攻击。NFC中继攻击通常需要两个设备一个靠近原卡另一个靠近读卡器两者通过远程通信如Wi-Fi接力转发信号以延长有效通信距离。这需要设备能同时模拟读卡器和标签或者进行复杂的信号转发。nRF52840的NFCT只是一个简单的标签模拟前端不具备这种双向、实时、低延迟转发复杂信号的能力。请不要尝试将其用于任何安全测试或攻击场景这超出了它的设计范围和本教程的初衷。7. 项目拓展思路与资源汇总掌握了基础之后你可以尝试将这些知识组合起来创造更有趣的项目。7.1 创意项目灵感智能设备配网器为你的ESP32智能灯做一个“碰碰配网”工具。XIAO nRF52840预先存储了Wi-Fi SSID和密码或一个配网令牌。新设备出厂时工人只需用手机碰一下这个XIAO板子就能将网络配置信息写入手机App再由App配置给智能设备。比手动输入或蓝牙配网更快捷。交互式展览标签在博物馆或画廊将XIAO nRF52840 Sense藏在展品后面。它可以检测到有人靠近通过红外或雷达传感器然后动态改变NFC标签内容。例如白天显示展品基本信息晚上显示闭馆时间或者根据参观者在展品前停留的时间显示不同深度的介绍文字链接。基于触碰的任务触发器与家庭自动化平台如Home Assistant结合。在墙上安装多个XIAO板子每个模拟不同的URL。Home Assistant可以设置一个Webhook触发器当收到特定URL的访问请求时就执行一个自动化如“关闭所有灯”、“播放睡眠音乐”。你只需用手机碰一下对应的板子就能触发场景。7.2 进一步学习的资源官方文档Seeed Studio Wiki搜索“XIAO nRF52840 NFC”这是最权威的起点通常有最基础的示例。Nordic Semiconductor Infocenter查阅nRF52840产品规格书和nRF5 SDK文档中关于NFCT外设的章节。这是理解底层原理的终极资料。代码仓库Seeed Studio GitHub查找Seeed-Studio/Seeed_Arduino_NFC或相关仓库里面可能有更完整的示例。Arduino Core for nRF5在GitHub上搜索此项目了解Arduino层是如何封装NFCT驱动的。社区与论坛Seeed Studio Forum在NFC或XIAO板块提问社区活跃度较高。Nordic DevZone如果你遇到非常底层的驱动问题这里是向Nordic工程师提问的好地方但问题需要足够具体和深入。从我个人的经验来看在XIAO nRF52840上玩转NFC最难的不是写代码而是理清“库-驱动-硬件”之间的调用关系。很多时候官方的一个完整示例代码胜过千言万语。所以当你卡住时第一件事就是去翻找Seeed或Nordic提供的示例项目仔细对照其中的初始化和数据流处理部分。一旦跑通了第一个动态NFC应用你会发现这片小小的射频天地能为你物联网项目带来的交互便捷性绝对是超值的。