1. 项目概述与核心价值
如果你正在寻找一个能够通吃市面上绝大多数高频RFID和NFC标签的读写器解决方案,并且希望从零开始,亲手搭建一个稳定、可二次开发的硬件平台,那么基于德州仪器TRF7970A的方案,绝对值得你投入时间深入研究。我花了相当长的时间,在多个嵌入式项目里折腾过这颗芯片,从最初的“点不亮”到后来的稳定量产,踩过的坑和积累的经验,今天系统地分享出来。
TRF7970A本质上是一个高度集成的13.56MHz RFID/NFC模拟前端(AFE)和协议处理器。它的核心价值在于,把原本需要分立元件搭建的射频调制解调、功率放大、数据成帧等复杂电路,全部塞进了一颗芯片里。这意味着,你不需要成为射频专家,也能做出性能不错的读写器。它原生支持ISO/IEC 14443 A/B(也就是我们常说的Mifare、身份证等Type A/B卡)、ISO/IEC 15693(Vicinity卡,识别距离较远)、ISO/IEC 18092(Felica,日本常用的标准)以及NFC Forum的Type 1-5标签协议。简单说,从门禁卡、公交卡到手机NFC模拟的标签,它基本都能读写。
这个项目的目标,就是利用TI官方提供的评估板(如MSP430F5529 LaunchPad + DLP-7970ABP BoosterPack)和开源固件库,构建一个功能完整的读写器演示系统。你不仅能通过PC上的GUI工具直观地操作标签,更能深入底层,理解从射频场开启、协议层轮询、标签激活、数据交换到NDEF报文解析的完整链条。这对于想深入物联网、智能硬件、支付终端等领域的开发者来说,是一次绝佳的学习和实践机会。
2. 硬件平台选型与电路设计要点
2.1 核心芯片:TRF7970A深度解析
TRF7970A之所以强大,在于其高度的可配置性。它内部集成了完整的13.56MHz振荡器、功率放大器(PA)、接收解调器,以及负责处理ISO层帧结构的数字状态机。通过SPI接口,你可以配置一系列寄存器,来调整发射功率、接收灵敏度、编码解码方式等。对于读写器模式,我们主要关心以下几个关键寄存器:
- ISO控制寄存器(0x01):这是协议切换的“总开关”。你需要根据当前要轮询的标签类型(如NFC-A, NFC-B, NFC-F, NFC-V)和通信速率(106kbps, 212kbps等),动态写入不同的值。例如,
0x88用于NFC-A 106kbps的防碰撞阶段(接收不带CRC),而0x08用于激活后的数据交换阶段(接收带CRC)。 - 芯片状态控制寄存器(0x00):控制RF场的开启与关闭。发送
0x20或0x21(分别对应3.3V和5V供电)可以开启射频场,这是与标签通信的前提。 - 特殊功能寄存器(0x10)等:用于一些特定场景,比如对Type 2标签进行写操作时,需要特殊的时序控制。
实操心得:TRF7970A对电源纹波非常敏感。如果发现读卡距离短或不稳定,第一个要排查的就是电源。务必使用LDO(低压差线性稳压器)为其提供干净的3.3V或5V电源,并在芯片的VDD引脚附近放置足够容量的去耦电容(例如10uF钽电容+100nF陶瓷电容)。天线匹配网络(通常由几个电感和电容组成的π型或T型网络)的精度也至关重要,必须严格按照数据手册的参考设计,并用矢量网络分析仪(VNA)进行调试,确保天线谐振在13.56MHz。
2.2 微控制器搭档:MSP430与MSP432如何选
TI的示例固件主要基于两款MCU:MSP430F5529(16位,低功耗)和MSP432P401R(32位Cortex-M4F,性能更强)。选择哪款,取决于你的应用场景。
- MSP430F5529 LaunchPad + DLP-7970ABP BoosterPack:这是最经典的入门组合。BoosterPack直接插在LaunchPad上,硬件连接已通过排针定义好,几乎不需要飞线。MSP430F5529的优点是超低功耗,适合电池供电的便携设备。它的SPI、GPIO等外设配置简单,固件库成熟。缺点是处理复杂协议栈或需要高级加密功能时,性能可能吃紧。
- MSP432P401R LaunchPad + DLP-7970ABP BoosterPack:性能更强的组合。MSP432的Cortex-M4内核带硬件浮点单元,主频更高,内存更大。如果你计划在读写器基础上集成复杂的用户界面、网络通信或数据加密算法,MSP432是更好的选择。其连接方式是通过背面的UART接口进行通信。
硬件连接速查表: 以下是基于官方文档整理的连接关系,在自行设计PCB时务必核对:
| DLP-7970ABP引脚 | MSP430F5529 LaunchPad引脚 | 功能说明 |
|---|---|---|
| TRF7970A EN1 | P4.1 | 芯片使能,高电平有效 |
| TRF7970A IRQ | P2.2 | 中断请求,低电平触发 |
| MOSI | P3.0 | SPI主出从入 |
| MISO | P3.1 | SPI主入从出 |
| CLK | P3.2 | SPI时钟 |
| Slave Select | P4.2 | SPI片选 |
| I/O_2 | P6.6 | 特殊直通模式(通常不用) |
| I/O_3 | P2.0 | 特殊直通模式(通常不用) |
| I/O_5 | P1.6 | 特殊直通模式(通常不用) |
注意事项:
IRQ引脚的中断服务程序(ISR)响应速度必须足够快。TRF7970A在接收完一帧数据或发送完成后,会通过IRQ通知MCU。如果MCU响应太慢,可能导致数据丢失。建议将IRQ中断优先级设为最高,并在ISR中只做标志位设置,繁重的数据处理放到主循环中。
2.3 天线设计与匹配:决定性能的关键
天线是读写器的“嘴巴”和“耳朵”,其设计直接决定了通信距离和稳定性。TRF7970A推荐使用PCB环形天线,其电感量通常在1-3uH之间。
- 天线参数计算:天线的谐振频率由电感L和匹配电容C共同决定,公式为
f = 1 / (2π√(LC))。目标是让这个频率等于13.56MHz。你需要先测量或计算PCB天线的电感值L,然后通过匹配网络(通常是串联和并联电容)来调整总电容C。 - 匹配网络调试:这是最考验耐心的一步。你需要一个VNA。将天线连同匹配网络连接到VNA的端口,观察S11参数(回波损耗)曲线。理想情况下,在13.56MHz处,S11应该有一个很深的“凹陷”(例如<-20dB),这表示能量被天线有效辐射出去,而不是反射回来。通过微调匹配电容的值(通常使用可调电容或更换不同值的电容),使这个凹陷点精确落在13.56MHz。
- 布局与屏蔽:天线区域下方和周围最好做铺铜隔离,并远离数字信号线、晶振等噪声源。如果空间允许,可以为天线增加一个金属屏蔽罩,以减少环境干扰。
3. 固件架构与初始化流程拆解
3.1 NFC协议栈整体架构
TI提供的NFCLink固件库采用分层设计,结构清晰,便于理解和修改。从上到下大致分为:
- 应用层:用户自定义的业务逻辑,比如决定读卡后做什么(点亮LED、通过串口发送数据等)。
- NDEF层:负责NFC数据交换格式的编码与解码。这是将二进制数据转化为可读的文本、URI等记录的关键。
- 协议处理层:这是核心,包含了针对不同标签类型(T2T, T3T, T4T, T5T)的状态机。每个状态机负责处理对应协议的激活、选择、读、写等命令序列。
- ISO标准层:实现了ISO14443-3/4, ISO15693, ISO18092等底层通信协议。
- TRF7970A驱动层:最底层,直接通过SPI操作TRF7970A的寄存器和FIFO,负责比特流的发送与接收。
这种分层的好处是,当你需要支持一种新的私有协议时,通常只需要在“协议处理层”添加一个新的状态机,而无需改动底层驱动和上层应用。
3.2 系统初始化代码逐行解读
让我们深入main.c,看看一个典型的启动流程。以下代码基于MSP430平台,但思路通用。
#include "msp430.h" #include "nfc_controller.h" #include "tag_header.h" // 全局配置结构体 t_sNfcRWMode g_sRWSupportedModes; // 支持的模式(NFC-A/B/F/V) t_sNfcRWCommBitrate g_sRWSupportedBitrates; // 支持的通信速率 t_sIsoDEP_RWSetup g_sRWSetupOptions; // ISO-DEP协议相关设置 void main(void) { // 1. 微控制器基础初始化 MCU_init(); // 设置系统时钟、关闭看门狗等 __enable_interrupt(); // 开启全局中断 // 2. 通信接口初始化(如用于调试的UART) Serial_init(); // 3. TRF7970A硬件初始化(SPI、GPIO) TRF79x0_init(); // 4. 初始化NFC协议栈核心数据结构 NFC_init(); // 5. 配置NFC工作模式(这里是重点!) NFC_configuration(); // 6. 初始化各标签类型的状态机,并分配缓冲区 T2T_init(g_ui8TxBuffer, 256); T3T_init(g_ui8TxBuffer, 256); T4T_init(g_ui8TxBuffer, 256); T5T_init(g_ui8TxBuffer, 256); // 7. 主循环:运行NFC调度器,开始轮询标签 while(1) { NFC_run(); // 这个函数内部实现了图7所示的轮询状态机 // ... 可以在这里添加用户应用代码,如处理读取到的数据 } }关键在于第5步的NFC_configuration()函数。你需要在这里明确告诉系统,你希望读写器支持哪些协议和速率。
void NFC_configuration(void) { // 启用读写器支持的协议模式 g_sRWSupportedModes.bits.bNfcA = 1; // 启用NFC-A (Type 2/4A) g_sRWSupportedModes.bits.bNfcB = 1; // 启用NFC-B (Type 4B) g_sRWSupportedModes.bits.bNfcF = 1; // 启用NFC-F (Type 3, Felica) g_sRWSupportedModes.bits.bISO15693 = 1; // 启用NFC-V (Type 5) // 配置NFC-A支持的比特率 g_sRWSupportedBitrates.bits.bNfcA_106kbps = 1; // 必须开启,用于初始激活 g_sRWSupportedBitrates.bits.bNfcA_848kbps = 1; // 开启高速模式,激活后可切换 // 配置NFC-B支持的比特率 g_sRWSupportedBitrates.bits.bNfcB_106kbps = 1; // 必须开启 g_sRWSupportedBitrates.bits.bNfcB_848kbps = 1; // 配置NFC-F支持的比特率 g_sRWSupportedBitrates.bits.bNfcF_212kbps = 1; // g_sRWSupportedBitrates.bits.bNfcF_424kbps = 1; // 如需424kbps则开启 // 配置ISO15693比特率(通常只有26.48kbps) g_sRWSupportedBitrates.bits.bISO15693_26_48kbps = 1; }核心原理:为什么NFC-A和NFC-B的106kbps必须开启?这是因为ISO14443标准规定,标签的唤醒(Wake-up)和防碰撞(Anticollision)过程必须在106kbps的速率下进行。只有在标签被成功选中(SELECTED)后,读写器和标签才能通过PPS(Protocol and Parameter Selection)或ATTRIB命令协商切换到更高的速率(如212kbps, 424kbps, 848kbps)。固件库会自动处理这个速率切换过程。
3.3 初始RF碰撞避免机制
当两个读写器靠得太近时,如果同时发射射频场,会产生干扰。TRF7970A通过检测外部RSSI(接收信号强度指示)来避免这个问题。流程如下:
- 在准备开启自己的RF场前,先将TRF7970A配置为接收模式(写
0x02或0x03到寄存器0x00)。 - 发送
0x19(测试外部RF)直接命令。 - 延迟至少50微秒,让芯片完成场强测量。
- 读取寄存器
0x0F(RSSI与振荡器状态)。检查低3位(Active Channel RSSI值)。 - 如果RSSI值大于0,说明附近有其他读写器在工作,此时应继续等待或退避一段时间。
- 如果RSSI值等于0,说明信道空闲,可以开启自己的RF场,进入发起者(Initiator)模式。
这个机制在NFC_run()函数的初始阶段被调用,确保了多设备环境下的基本共存。
4. 标签激活与通信协议实战解析
4.1 轮询(Polling)机制:如何发现标签
读写器上电并初始化后,就进入了一个永不停止的轮询循环。这个循环依次尝试与各种可能存在的标签“打招呼”。顺序是固定的:NFC-A -> NFC-B -> NFC-F -> NFC-V。每种技术的“招呼”都是一个特定的命令帧:
- NFC-A: 发送
SENS_REQ(REQA) 或ALL_REQ(WUPA) 命令。 - NFC-B: 发送
SENSB_REQ(REQB/WUPB) 命令。 - NFC-F: 发送
SENSF_REQ命令。 - NFC-V: 发送
Inventory命令。
固件会在发送命令后,监听一个预设的时间窗口(Guard Time),看是否有标签回复。如果有回复,就锁定该技术,进入下一步的激活流程;如果没有,就切换到下一种技术继续尝试。
踩坑记录:Guard Time设置得太短,可能导致某些“慢热”的标签(特别是从完全无电状态唤醒的标签)还没来得及响应,就被误判为不存在。TI的示例固件有意将NFC-A/B的Guard Time设置为5ms,比协议规定的最小值长,就是为了提高兼容性。如果你的应用场景对轮询速度要求极高,可以尝试缩短这个时间,但务必进行充分的兼容性测试。
4.2 针对不同标签的激活与选择流程
成功收到标签回复后,就进入了协议特定的激活流程。这是整个通信中最复杂、也最容易出错的部分。
4.2.1 NFC-A (Type 2/4A) 激活流程
- 防碰撞与UID获取:如果回复
SENS_RES的标签支持防碰撞(UID长度>4字节),则需要进入SDD(Single Device Detection)流程。读写器发送SDD_REQ命令,通过比特帧碰撞检测,逐位获取标签的完整NFCID1(UID)。这个过程在固件的iso14443aStateMachine()中实现。 - 选择(SELECT):获得完整UID后,发送
SELECT命令,携带该UID。标签回复SEL_RES(SAK)。通过SAK可以判断标签类型:0x00或0x20通常表示Type 4A(支持ISO-DEP),0x08表示Type 2(Mifare Ultralight等)。 - Type 4A专属:RATS和PPS:
- 如果标签是Type 4A,需要发送
RATS(Request for Answer To Select)命令。标签回复ATS,其中包含了它支持的最高通信速率等信息。 - 随后,读写器可以发送
PPS(Protocol and Parameter Selection)请求,与标签协商并切换到ATS中共同支持的最高速率(如848kbps)。
- 如果标签是Type 4A,需要发送
4.2.2 NFC-B (Type 4B) 激活流程
- 激活:发送
SENSB_REQ,标签回复SENSB_RES(ATQB)。 - 选择:发送
ATTRIB命令,将标签的PUPI(伪唯一标识符)等信息包含在命令中,并指定通信参数(如速率)。标签回复ATTRIB_RES进行确认。速率切换也是在ATTRIB命令中指定的。
4.2.3 NFC-F (Type 3) 激活流程
流程相对简单。发送SENSF_REQ,标签回复SENSF_RES,其中包含了标签的系统码(IDm)等信息。读写器随后可以通过POLLING命令选择该标签进行通信。Type 3标签的通信速率在初始激活时就是212kbps或424kbps。
4.2.4 NFC-V (Type 5) 激活流程
发送Inventory命令(带或不带防碰撞标志)。标签回复其UID。随后可以通过Get System Information命令获取标签的详细信息,如内存大小、支持的协议扩展等。
关键细节:每次切换轮询的技术类型时,必须重新配置TRF7970A的ISO控制寄存器(0x01)。例如,从NFC-A轮询切换到NFC-B轮询前,需要将寄存器值从
0x88改为0x0C。忘记这一步是导致“能读A卡不能读B卡”的常见原因。固件库的TRF79x0_setupInitiator()函数封装了这个操作。
4.3 NDEF数据格式的读写解析
成功激活标签后,就进入了数据交换阶段。对于支持NDEF的标签,我们的目标是读写结构化的NDEF消息,而不是原始的二进制块。
4.3.1 读取NDEF消息的通用逻辑
无论哪种标签类型,读取NDEF消息都遵循一个相似的逻辑:
- 定位能力容器(Capability Container, CC)或属性块:这是标签的“目录”,告诉读写器NDEF数据存放在哪里、有多大、有什么访问权限。
- Type 2/5:CC位于Block 3(4字节块结构)。
- Type 3:属性信息块位于Block 0(16字节块结构)。
- Type 4:CC是一个独立的文件,文件ID为
0xE103,需要通过SELECT FILE命令选择后才能读取。
- 解析CC:读取CC数据,检查“Magic Number”(Type 2/4/5通常是
0xE1),确认是NDEF格式标签。从CC中获取NDEF文件/区域的位置和大小。 - 读取NDEF TLV:根据CC的指引,找到NDEF数据区。数据通常以TLV(Type-Length-Value)格式存储。
Type=0x03表示这是NDEF消息TLV,后面的Length字段指明了NDEF消息的长度。 - 解析NDEF消息:提取出Value字段,这就是完整的NDEF消息。再根据NDEF规范,解析出里面的记录(Record),比如文本记录(Text RTD)或URI记录(URI RTD)。
4.3.2 写入NDEF消息的注意事项
写入操作是读取的逆过程,但需要格外小心:
- 检查写权限:首先必须检查CC中的访问条件字节,确认标签是可写的。如果被设置为只读(例如
0x0F),则写入操作会失败。 - 准备NDEF消息:先将你要存储的文本、URI等数据,按照NDEF规范封装成NDEF消息。
- 封装TLV:将NDEF消息作为Value,前面加上TLV头(
0x03+ 长度),后面加上终止符TLV(0xFE)。 - 执行写操作:调用对应标签类型的写命令(如Type 2的
WRITE,Type 4的UPDATE BINARY),将数据写入正确的位置。 - 验证:写入完成后,强烈建议重新读取一遍数据,进行校验,确保写入成功。
实操心得:Type 2标签的写操作陷阱:Type 2标签(如NTAG213)的写操作有特殊要求。在写一个块(4字节)之前,必须确保该块当前的内容是全
0xFF(已擦除状态)。如果你尝试写入一个非0xFF的块,操作会失败。此外,写操作后需要一定的“编程时间”(典型值5ms),在此期间发送任何命令都可能损坏数据。TRF7970A的“特殊功能寄存器(0x10)”就是用来控制这个编程时序的,固件库中的TRF79x0_writeRaw()函数已经处理了这些细节。
5. 开发环境搭建与调试技巧
5.1 软件工具链准备
- 集成开发环境(IDE):推荐使用TI的Code Composer Studio (CCS),它对MSP430和MSP432的支持最好,内置了TI的编译器、调试器和很多示例项目。也可以选择IAR Embedded Workbench或开源的MSP430-GCC。
- NFCLink固件库:从TI官网下载
SLOA227软件包。解压后,你会看到完整的源代码、文档和预编译的二进制文件。\nfclink\Source目录下是核心的协议栈源码,\nfclink\Examples下是示例工程。 - TI NFC Tool GUI:这是一个运行在PC上的图形化工具,随固件库安装。它可以通过USB虚拟串口(CDC)或UART连接到你的评估板,让你可以直观地选择模式、读写标签、查看原始数据,是前期调试的利器。
5.2 编译与下载第一个示例
- 在CCS中导入
\nfclink\Examples\MSP430F5529下的示例工程。 - 确保你的开发板通过USB线连接电脑,且BoosterPack已正确插好。
- 在工程属性中,选择正确的编译器版本和器件型号(MSP430F5529)。
- 点击编译,然后点击调试按钮。CCS会自动将程序下载到板载的MSP430中并进入调试模式。
- 运行程序,打开TI NFC Tool GUI,选择对应的COM口连接。你应该能看到GUI界面显示“Connected”。
5.3 调试实战:常见问题与排查方法
即使按照步骤操作,也难免遇到问题。下面是一个快速排查清单:
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 开发板连接不上GUI | 1. 驱动未安装 2. 串口号错误 3. 固件未运行 | 1. 检查设备管理器,确认MSP430 USB CDC串口驱动已安装。 2. 在GUI中尝试不同的COM口。 3. 确认程序已成功下载并运行(观察板载LED是否按预期闪烁)。 |
| GUI显示连接成功,但读不到任何标签 | 1. 天线未连接或损坏 2. 电源问题 3. 协议未使能 | 1. 检查天线连接器是否插紧,天线线圈有无断裂。 2. 用万用表测量TRF7970A的VDD引脚电压是否稳定(3.3V/5V)。 3. 检查 NFC_configuration()函数,确认你尝试读取的标签类型已被启用(bNfcA=1等)。 |
| 只能读某一类标签,其他读不到 | 1. 协议配置错误 2. 寄存器切换遗漏 3. 天线匹配对不同频偏协议敏感 | 1. 确认在轮询循环中,切换协议时正确调用了TRF79x0_setupInitiator()。2. 使用逻辑分析仪抓取SPI总线,对比读写成功与失败时,发送给TRF7970A的寄存器配置序列是否一致。 3. 检查天线匹配网络,确保在13.56MHz的各个谐波点都有良好表现。 |
| 读卡距离非常近(<1cm) | 1. 天线匹配严重失调 2. 发射功率不足 3. 外部干扰 | 1.这是最常见原因。必须用VNA重新调试天线匹配,确保13.56MHz处谐振。 2. 检查TRF7970A的 0x09寄存器(调制与系统时钟控制),确认输出功率设置正确(参考数据手册)。3. 将读写器远离金属物体、液晶屏、开关电源等干扰源。 |
| 写操作失败,但读操作正常 | 1. 标签写保护 2. NDEF格式错误 3. 写时序问题 | 1. 先读取CC字节,检查写访问条件是否为0x00(可写)。2. 使用TI NFC Tool GUI的“Write Tag”功能尝试写入一个简单文本,排除自己组包的错误。 3. 对于Type 2标签,确认写之前目标块已被擦除(全0xFF)。 |
高级调试工具:
- 逻辑分析仪:连接SPI的CLK, MOSI, MISO, SSn四根线,可以清晰地看到MCU与TRF7970A之间所有的寄存器读写和命令发送数据。这是分析通信时序和协议交互的最有力工具。
- 示波器:观察TRF7970A的
IRQ引脚波形,可以判断芯片是否在正常工作周期内产生中断。观察天线两端的波形,可以粗略判断射频信号是否正常发射(注意需使用高频探头并做好隔离)。
6. 从示例到产品:自定义功能开发
官方示例提供了一个完美的起点,但真正的项目需求往往是定制化的。以下是几个常见的扩展方向:
6.1 精简固件体积
示例固件默认包含了读写器、卡模拟、点对点三种模式。如果你的产品只需要读写器功能,可以通过修改nfc_config.h文件中的宏定义来禁用其他模式,显著减少代码体积和内存占用。
// 在 nfc_config.h 中 #define NFC_P2P_MODE_DISABLE // 禁用点对点模式 #define NFC_CE_MODE_DISABLE // 禁用卡模拟模式 // #define NFC_RW_MODE_DISABLE // 确保读写器模式是启用的6.2 实现多标签防碰撞
TI的示例固件为了简化,没有实现完整的防碰撞算法(即同时读取多个同类型标签)。如果你需要这个功能,需要自己实现。以NFC-A(ISO14443-3)为例,防碰撞流程是一个基于比特仲裁的树状搜索过程。你需要修改iso14443aStateMachine(),在收到SENS_RES后,如果发现UID不完整(SAK指示需要级联),则进入一个循环,发送SDD_REQ命令,根据回复中的冲突位信息,不断调整发送的UID比特,直到完整获取一个标签的UID。这个过程较为复杂,需要仔细阅读ISO14443-3标准。
6.3 集成自定义应用逻辑
示例固件将读取到的数据通过串口发送给PC GUI。在实际产品中,你可能需要将数据交给本地MCU处理。以读取到NDEF文本为例,你可以在对应的状态机(如T2T_stateMachine)中找到数据被完整接收并解析的位置(通常在调用Serial_printBuffer函数附近)。在这里,你可以将数据复制到自己的应用缓冲区,并设置一个标志位。
// 在 T2T_stateMachine 或类似函数中 if (/* NDEF消息解析完成 */) { // 示例原有的发送到PC的代码 // Serial_printBuffer("NDEF Text: ", (uint8_t*)&g_sMyTextRecord, textLength); // 新增:复制到应用缓冲区 memcpy(g_appBuffer, (uint8_t*)&g_sMyTextRecord, textLength); g_appBuffer[textLength] = '\0'; // 添加字符串结束符 g_newDataFlag = 1; // 设置新数据标志 // 触发你的应用处理函数 processNewNdefData(g_appBuffer); }然后在主循环中,检查g_newDataFlag,执行你的业务逻辑,比如控制继电器、更新显示屏、通过Wi-Fi上传数据等。
6.4 低功耗优化
对于电池供电的设备,功耗是关键。TRF7970A本身有低功耗模式,MCU也可以通过休眠来省电。一个简单的轮询策略是:
- 让MCU进入低功耗模式(LPM3)。
- 配置一个定时器,每500ms唤醒一次MCU。
- MCU唤醒后,初始化TRF7970A,开启RF场,执行一轮快速的轮询(比如只轮询NFC-A)。
- 如果没检测到标签,立即关闭RF场,让TRF7970A进入休眠,MCU也再次进入LPM3。
- 如果检测到标签,则完成完整的读/写流程,然后再进入休眠。
这样可以大大降低系统平均电流,延长电池寿命。
基于TRF7970A开发NFC/HF RFID读写器,是一个融合了射频硬件、底层协议和嵌入式软件的综合项目。它不像操作一个现成的读卡器模块那么简单,但正是这种“从芯片开始”的深度,让你能完全掌控设备的每一个细节,能够诊断和解决最底层的问题,并能够根据产品需求进行最灵活的定制。希望这篇指南能帮你扫清入门路上的障碍,顺利搭建起属于自己的高性能读写器平台。在实际开发中,最宝贵的经验往往来自于解决那些数据手册里没写的“怪问题”,多动手,多测量,善用调试工具,你一定会有所收获。