TRF796x RFID/NFC读卡器芯片:从电路设计到驱动开发的完整指南

📅 2026/7/24 4:08:37
TRF796x RFID/NFC读卡器芯片:从电路设计到驱动开发的完整指南
1. 项目概述与芯片定位在非接触式识别领域13.56MHz的高频HFRFID和NFC技术因其成熟的标准、适中的读取距离和广泛的应用生态成为了门禁、支付、物流、资产管理的首选方案。这个频段的技术核心简而言之就是通过读写器天线产生一个交变电磁场为无源标签卡片或标签提供能量并通过调制这个场来双向传输数据。听起来简单但要把这套复杂的射频模拟收发、协议编解码、数据组帧全部稳定高效地实现对很多嵌入式工程师来说是个不小的挑战。这正是德州仪器TI的TRF796x系列芯片的价值所在。我接触过不少RFID项目从早期的分立元件搭建到后来的集成读卡器模块再到直接使用TRF7960这类高集成度AFE模拟前端感受最深的就是开发效率和系统稳定性的天壤之别。TRF7960/TRF7961本质上是一个“协议透明的射频调制解调器”它把最让人头疼的13.56MHz载波生成、功率放大、ASK/OOK调制解调、接收信号强度指示RSSI测量甚至包括ISO/IEC 14443 A/B、15693等协议的底层编解码和CRC校验全部集成在了一颗5mm x 5mm的QFN封装里。你只需要一个MCU比如TI自家的MSP430或者常见的STM32、ESP32等通过SPI或并口对它发号施令它就能帮你完成从“产生射频场”到“返回解码后的卡片UID或数据”的全过程。对于开发者而言这意味着你可以将绝大部分精力集中在应用逻辑和上层协议如MIFARE的认证、NDEF消息封装上而不是去调试一个容易自激的射频功放电路或者用软件抠一个严苛时序的Miller解码器。TRF7960和TRF7961的主要区别在于协议支持。TRF7960是全能选手支持ISO/IEC 14443 A/B、ISO/IEC 15693、FeliCa和Tag-it。而TRF7961则专注于ISO/IEC 15693协议通常用于更远距离的“ vicinity”卡识别场景。如果你的项目只需要管理资产标签很多资产标签采用15693协议TRF7961可能是更具性价比的选择。本文的讨论以TRF7960为主但其硬件设计和核心寄存器操作对TRF7961完全适用。2. 核心电路设计与原理图解析拿到一颗芯片第一步永远是看数据手册里的典型应用电路。TRF796x的评估板原理图给出了两种经典配置并行接口和SPI接口。对于现代嵌入式系统SPI接口因其引脚占用少、速率足够已成为绝对主流因此我们将重点剖析SPI模式的应用电路。2.1 电源与去耦网络稳定的基石射频电路对电源噪声极其敏感TRF796x内部集成了多个LDO为不同模块供电外部去耦设计至关重要。VIN (Pin 2)这是主电源输入范围2.7V至5.5V。典型应用中使用5V可以获得最大的射频输出功率200mW。在电池供电的便携设备中也可以使用3.3V但输出功率会相应降低。原理图中靠近芯片引脚处放置了一个4.7μF的钽电容或陶瓷电容C1和一个0.1μF的陶瓷电容C2分别负责低频和高频去耦。这个组合是必须的布局上要尽可能靠近VIN引脚。内部稳压器输出芯片内部有三个关键稳压输出都需要外部电容VDD_RF (Pin 3) VDD_PA (Pin 4)这是给射频功放PA供电的。VDD_RF是内部LDO的输出VDD_PA是功放级的直接输入。它们必须在外部短接在一起并通过一个2.2μFC3和一个10nFC4电容并联后接地。PA是电流突变最大的部分这里的电容质量直接影响发射信号的纯净度和效率。VDD_A (Pin 1)模拟电路电源。同样使用2.2μFC5和10nFC6组合去耦。VDD_X (Pin 32)这是一个非常有用的特性它是一个最大可输出20mA的LDO专门用于给外部MCU或其他逻辑电路供电。在原理图中它通过一个2.2μF电容C7去耦。这意味着在单5V供电的系统里你可以用VDD_X输出3.4V默认来给3.3V的MCU供电简化了电源设计。当然如果你的MCU是5V或已有其他电源也可以将VDD_I/O见下文连接到你的MCU电源轨而将VDD_X悬空或仅作为参考。VDD_I/O (Pin 16)这是数字I/O口的电平参考电源。它决定了IRQ、SYS_CLK、DATA_CLK以及所有I/O引脚的逻辑高电平电压。范围是1.8V至5.5V。通常如果MCU是3.3V就将其连接到MCU的3.3V如果是5V则连接到5V。在原理图中它通过一个0.1μF电容C8去耦。接地芯片有多个接地引脚VSS (Pin 10衬底地)、VSS_A (Pin 15模拟地)、VSS_D (Pin 29数字地)、VSS_RF (Pin 6射频功放地)、VSS_RX (Pin 7接收器地)。最佳实践是在PCB内部将所有这些地引脚直接连接到同一个完整的地平面避免形成地环路。芯片底部的Thermal Pad散热焊盘也必须可靠地连接到这个地平面它既是重要的电气地也是主要的散热路径。2.2 时钟电路系统的心跳OSC_IN (Pin 31) OSC_OUT (Pin 30)连接一个13.56MHz的石英晶体。晶体的选择有讲究数据手册推荐使用并联谐振、负载电容CL为18pF的HC49U封装晶体。频率精度建议±20ppm以保证通信频率符合标准。关键计算匹配电容C1和C2。这不是随便放两个27pF就完事的。公式是CL [(C1 * C2) / (C1 C2)] Cs。其中Cs是芯片输入输出引脚寄生电容加上PCB走线寄生电容典型值约为5pF ±2pF。假设我们选用CL18pF的晶体并令C1 C2 C则公式简化为18pF (C/2) 5pF解得C ≈ 26pF。因此原理图中使用的27pFC9 C10是合理的。如果实测频率有微小偏差可以通过微调这两个电容来校准。SYS_CLK (Pin 27)这是芯片提供给MCU的时钟输出。可以通过寄存器配置为13.56MHz、6.78MHz、3.39MHz或关闭。如果你的MCU需要外部时钟这可以节省一颗晶振。在原理图中它通过一个100Ω电阻R1连接到MCU的时钟输入引脚这个电阻有助于减少振铃和反射。2.3 天线匹配网络能量传输的桥梁这是整个设计中最具“艺术性”的部分直接决定了读卡距离和稳定性。TRF796x的射频输出TX_OUT (Pin 5)是差分形式但通常采用单端天线。原理图展示了一个经典的“Pi型”匹配网络将芯片约4Ω/8Ω取决于功率模式的输出阻抗变换到天线线圈的标称阻抗通常是50Ω或直接匹配到天线的复阻抗。L1 (150nH), L2 (330nH)这两个电感与电容组成低通滤波和阻抗变换网络。它们需要选择高Q值、自谐振频率远高于13.56MHz的绕线电感。C11, C12 (1nF), C13, C14 (1.5nF), C15, C16 (680pF), C17 (220pF)这些电容共同完成阻抗匹配和谐波抑制。C17220pF是串联在天线回路中的主要调谐电容用于将天线谐振频率精准拉到13.56MHz。R2 (0Ω)这是一个预留的阻尼电阻位置。如果天线Q值过高导致带宽过窄表现为读卡距离非常临界稍微偏移就不行可以焊接一个小阻值电阻如1-5Ω来降低Q值拓宽带宽增加稳定性代价是最大距离略有下降。“VSWR Adj”和“Phase Adj”网络这部分包含可调电容/电感在原理图中示意但在很多简化设计中如果天线参数固定可以用固定值的L和C替代。其核心目的是微调使天线端呈现纯阻性让功放输出最大功率。天线本身通常是一个几匝到几十匝的平面线圈。其电感量L和并联的谐振电容C17等决定了谐振频率f 1 / (2π√(LC))。设计时需要用网络分析仪或矢量阻抗分析仪来测量天线的S11参数并通过调整匹配网络的元件值使在13.56MHz处的阻抗接近纯电阻虚部为0且实部等于你期望的匹配值如50Ω。接收路径RX_IN1 (Pin 8) RX_IN2 (Pin 9)天线信号经过一个分压/相位调整网络后送入这两个引脚。RX_IN1用于幅度调制AM解调RX_IN2通过一个额外的RC/LC网络引入约45度相移用于相位调制PM解调。这种双路接收架构是TRF796x的亮点之一它能有效避免因标签与天线相对角度导致的“通信盲区”。2.4 接口与模式配置接口模式选择TRF796x上电时会检测I/O_0, I/O_1, I/O_2这三个引脚的电平来决定工作模式SPI模式带片选SSI/O_2 VDD, I/O_1 VDD, I/O_0 GND。这就是原理图所示模式。SPI模式无片选I/O_2 VDD, I/O_1 GND, I/O_0 GND。并行模式I/O_2, I/O_1, I/O_0全部接VDD或全部接GND。在SPI模式下I/O_7 (Pin 24)作为MOSI(Master Out Slave In) MCU数据输出。I/O_6 (Pin 23)作为MISO(Master In Slave Out) MCU数据输入。I/O_5 (Pin 22)在直接模式下用作数据时钟输出在标准SPI模式下必须通过一个10kΩ电阻R4上拉到VDD_I/O如原理图所示。I/O_4 (Pin 21)作为SS(Slave Select)低电平有效。I/O_3 (Pin 20)悬空或接固定电平。DATA_CLK (Pin 26)接MCU的SPI时钟引脚。控制与中断引脚EN (Pin 28)芯片主使能高电平有效。由MCU的GPIO控制。EN2 (Pin 25)辅助使能。如果连接到VIN则在EN0掉电模式时VDD_X和60kHz的SYS_CLK仍然保持可供MCU维持低功耗运行。它也可以用作一个唤醒引脚。IRQ (Pin 13)中断输出。当FIFO数据就绪、接收完成、发送完成、发生错误或碰撞时会触发低电平脉冲。应连接到MCU的外部中断引脚并上拉R3 10kΩ。ASK/OOK (Pin 12)在直接模式下选择调制方式ASK/OOK通常通过0Ω电阻R5接地或接VDD配置或者悬空内部有默认。3. 寄存器配置与软件驱动流程硬件搭好了接下来就是让芯片“动”起来的软件部分。TRF796x通过一套寄存器来控制所有功能MCU通过SPI读写这些寄存器。理解这套寄存器模型是编写稳定驱动的关键。3.1 上电初始化序列这是一个必须严格遵守的加电顺序错误的时序可能导致芯片无法正常工作或功耗异常。硬件上电确保VIN、VDD_I/O电源稳定。置位EN引脚将EN引脚通过MCU GPIO拉高。此时芯片内部稳压器启动晶振起振。等待稳定至少等待t_SET_PD时间数据手册典型值10ms最大值20ms确保电源和时钟稳定。简单的delay_ms(20)是可靠的做法。软件初始化通过SPI发送直接命令0x03软件初始化。这个命令的效果等同于硬件上电复位会将大部分寄存器恢复为默认值。配置基础寄存器ISO控制寄存器 (0x01)选择你要使用的协议。例如对于MIFARE Classic属于ISO14443A应设置为0x08106kbps。这会自动配置一系列与协议相关的子寄存器如滤波器带宽、定时器等。调制与系统时钟控制寄存器 (0x09)配置SYS_CLK输出频率例如0x20对应6.78MHz给MCU和ASK调制深度通常用10%或30%取决于标签类型。调节器与I/O控制寄存器 (0x0B)如果使用5V系统通常设置为0x87自动调节器模式250mV压差。如果使用3.3V系统则需相应调整。中断屏蔽寄存器 (0x0D)使能你需要的中断源。例如使能FIFO高中断、接收完成中断、无响应中断等。典型值0x3E使能了除碰撞外的所有常见中断。清除FIFO发送直接命令0x0F复位FIFO。开启射频场向芯片状态控制寄存器 (0x00)写入值同时开启接收器和发射器。例如写入0x83二进制1000 0011表示保持待机模式B71开启RF输出B51开启接收器B11。注意B7的待机位stby在初始化时通常置1在开始寻卡前再清0进入完全活动模式。3.2 卡片探测Inventory流程详解以ISO14443A Type A的寻卡为例这是一个典型的“发送命令-等待响应-处理中断”的过程。进入活动模式向寄存器0x00写入0x03二进制0000 0011清除待机位B70保持RF和接收器开启。发送REQA/WUPA命令首先发送直接命令0x0F复位FIFO。然后发送直接命令0x10无CRC发送或0x11带CRC发送。ISO14443A的REQA命令是0x26。紧接着需要连续写入TX长度和命令数据。地址0x1D是TX长度字节1高8位和中间4位0x1E是TX长度字节2低4位和“破碎字节”标志。对于单字节命令0x26长度是1个字节。所以向地址0x1D写入0x00因为长度1的高8位和中间4位都是0。向地址0x1E写入0x10二进制0001 0000。低4位0000表示长度1的低4位B0位0表示没有破碎字节。最后向FIFO寄存器0x1F写入命令数据0x26。关键点一旦第一个数据字节0x26被写入FIFO芯片会立即开始发送。因此TX长度和数据的写入必须是一个连续的SPI传输序列中间不能有大的延迟。等待并处理中断发送完成后芯片会等待标签回复。如果收到回复IRQ引脚会变低。MCU进入中断服务程序ISR。读取IRQ状态寄存器 (0x0C)。这是最重要的步骤它告诉你发生了什么。例如0x40二进制0100 0000表示接收开始B610x20表示FIFO状态变化0x01表示无响应。重要SPI模式下的“哑读”Dummy Read在SPI模式下读取IRQ状态寄存器后必须再额外进行一次读操作例如读地址0x0D才能清除IRQ状态寄存器内部的锁存状态。这是TRF796x SPI接口的一个特殊要求并行模式不需要。忽略这一步是导致后续中断无法触发的常见原因。如果IRQ状态显示接收完成通常是接收开始标志置位后再检查FIFO状态则从FIFO (0x1F) 中读取数据。先读FIFO状态寄存器 (0x1C) 的低4位获取字节数N然后连续读N次0x1F。对于REQA的回复应该是0x04ATQA。防碰撞与选卡如果探测到多张卡通过IRQ状态中的碰撞标志位0x02则需要进入防碰撞循环。这涉及到发送SELECT命令过程类似但需要根据碰撞位置可从寄存器0x0E读取来构造后续的防碰撞命令。篇幅所限这是另一个深入的话题但核心流程依然是“写命令数据到FIFO - 发送 - 等中断 - 读回复”。3.3 关键寄存器详解与调试技巧芯片状态控制寄存器 (0x00)这是总开关。stby位B7用于快速开关射频场。在连续寻卡时不要频繁开关此位而是用rf_on位B5来控制射频场。pm_on位B3用于切换主接收通道AM/PM在遇到某些角度读卡不灵时可以尝试切换。RSSI与振荡器状态寄存器 (0x0F)极其有用的调试工具。osc_ok位B6指示晶振是否稳定。rssi_2-0位B2-B0指示主接收通道的信号强度。在调试天线时你可以发送直接命令0x18测试内部RF然后读取此寄存器。RSSI值在5或6对应输入电平约1.5-1.8Vpp时表示天线匹配良好。如果值太低说明耦合差如果达到最大值7可能输入过强需要调整匹配网络衰减。RX特殊设置寄存器 (0x0A)当通信不稳定误码率高时可以手动调整接收器增益和滤波器带宽。例如在噪声较大的环境中可以尝试增加增益衰减gd1,gd2位。对于14443A 106kbps滤波器应设置为0x20启用M848位带宽450kHz-1.5MHz。TX脉冲长度控制寄存器 (0x06)如果天线Q值很高调制脉冲的边沿可能会振铃导致脉冲宽度被拉长超出标签解码窗口。此时可以微调此寄存器来缩短发射脉冲宽度单位是73.7ns。默认值0x00使用协议预设值。4. 常见问题排查与实战经验在实际项目中你几乎一定会遇到下面这些问题。4.1 问题一完全读不到卡IRQ无任何反应检查电源和时钟首先用示波器测量VDD_RF、VDD_A等电压是否正常稳定。测量OSC_IN/OUT引脚应有干净的正弦波幅度约1Vpp频率精确为13.56MHz。如果晶振不起振检查匹配电容值是否正确或尝试更换晶体。检查SPI通信用逻辑分析仪抓取MCU与TRF796x之间的SPI波形。确认片选、时钟、数据线的时序正确。特别注意TRF796x的SPI模式是CPOL0, CPHA0即时钟空闲为低数据在上升沿采样。但在读取数据时需要将SPI模式切换为CPOL0, CPHA1数据在下降沿采样这是芯片数据手册明确要求的很多驱动库的疏忽点。检查初始化序列确保严格按照“上电 - 等待20ms - 发送0x03命令 - 配置寄存器 - 清除FIFO - 开启RF”的顺序。可以在每一步后读取一个可读寄存器如0x0F的osc_ok位来验证通信是否正常。检查天线匹配这是最难的部分。如果没有网络分析仪可以用“内部RF测试”法初始化芯片后发送命令0x18然后读取寄存器0x0F的RSSI值。将一张卡片放在天线最佳位置观察RSSI值是否有显著下降因为卡片吸收了能量。如果有变化说明天线在工作。最理想的情况是无卡时RSSI在5-6有卡时下降到2-3。4.2 问题二读卡距离非常近且不稳定天线谐振频率偏移这是最常见的原因。用频谱分析仪或带跟踪源的示波器如RSA观察天线端的信号。13.56MHz的载波应该是一个干净的单峰。如果发现频谱展宽或有明显的副峰说明匹配不佳。调整匹配网络中的串联电容原理图中的C17和并联电容C15 C16使在13.56MHz处的阻抗实部最大或电压幅度最大虚部接近零。电源去耦不足在射频功放VDD_PA/VDD_RF的电源引脚处用示波器交流耦合观察在发射时不应有大的电压毛刺50mV。如果有增加并联的10nF陶瓷电容并确保其紧贴芯片引脚回路最短。输出功率设置检查寄存器0x00的rf_pwr位B4。0为全功率200mW1为半功率100mW。确保它被设置为0。调制深度不足对于某些标签ASK调制深度需要足够大。检查寄存器0x09的pm2, pm1, pm0位。对于MIFARE通常10% (000) 或30% (111) 都可以可以尝试切换看效果。4.3 问题三能读到卡但数据经常出错或防碰撞失败接收器过载或不足同样使用“内部RF测试”命令0x18。无卡时RSSI值不应为7饱和。如果饱和需要在RX_IN路径上增加衰减例如增大原理图中RX_IN1/2前的串联电阻。如果RSSI值始终很低3则可能是匹配网络导致信号过弱或者天线方向不对。调整接收器带宽和增益在噪声较大的工业环境可以尝试在寄存器0x0A中增加增益衰减gd位并确保滤波器带宽C212,C424,M848,hbt位与你的通信速率匹配。对于106kbpsM848位应设为1。检查MCU中断处理速度TRF796x的FIFO只有12字节。在较高数据速率如848kbps下MCU必须在收到“FIFO高”中断后迅速读取数据否则会发生溢出寄存器0x1C的Fove位会被置1。确保你的中断服务程序尽可能高效或者采用DMA进行SPI数据传输。4.4 问题四功耗高于预期检查电源模式在非寻卡间歇期应将芯片置于待机模式寄存器0x00的stby位设为1。此时电流应降至1.5mA左右。如果不需要保持MCU供电可以将EN引脚拉低进入完全掉电模式1μA但再次启动需要等待10-20ms的稳定时间。关闭无用时钟如果不使用SYS_CLK输出在寄存器0x09中将Clo1和Clo0设为00关闭该时钟输出。射频场管理在两次寻卡之间如果不需要持续激活场可以通过将寄存器0x00的rf_on位B5清0来关闭射频功放这将大幅降低电流从70-120mA降至约10mA。5. 进阶应用与设计考量5.1 多协议支持与自动识别TRF7960的强大之处在于单芯片支持多协议。实现自动识别卡片类型比如是14443A卡还是15693标签的流程如下先以14443A协议发送REQA命令。等待一段时间由寄存器0x07的RX无响应等待时间控制如果IRQ显示无响应0x01。切换协议到15693发送Inventory命令。根据响应来判断卡片类型。 这个过程需要MCU软件灵活地切换寄存器0x01的ISO控制位。注意每次写寄存器0x01许多子寄存器如定时器、滤波器设置会被重置为协议默认值如果你有自定义设置需要在切换协议后重新配置。5.2 使用直接模式Direct Mode实现自定义协议对于非标准协议TRF796x提供了直接模式寄存器0x01的dir_mode位。直接模式0芯片仅作为模拟前端。MOD引脚14接受外部数字信号直接控制射频调制ASK/OOK。I/O_6引脚输出解调后的原始副载波模拟信号需配置寄存器0x09的en_ana位由MCU的ADC或比较器进行采样和解码。这给了你最大的灵活性但所有编解码、组帧工作都需MCU软件完成对MCU性能要求高。直接模式1芯片完成副载波到比特流的解码根据ISO控制寄存器选择的协议但跳过组帧和CRC校验。I/O_6输出解码后的比特流I/O_5输出对应的位时钟。MCU只需按照这个时钟读取数据位并自行完成帧的拼接和校验。这适用于那些使用标准编码如Miller Manchester但帧结构不同的私有协议。5.3 PCB布局的黄金法则射频电路的布局决定了成败的80%。地平面至关重要使用完整的、无割裂的接地层作为参考平面。所有去耦电容的接地端、芯片的接地引脚、天线匹配网络的接地端都必须通过短而粗的过孔直接连接到地平面。电源分割与星型连接模拟电源VDD_A、数字电源VDD_I/O、射频功放电源VDD_PA/RF应在电源入口处用磁珠或0Ω电阻进行隔离并各自形成独立的局部电源树最后单点连接到总电源。避免数字电源的噪声串扰到敏感的模拟和射频部分。天线匹配网络布局从TX_OUT引脚到天线接口的路径应尽可能短。匹配电感和电容应使用高频特性好的器件如0402封装的NPO/COG电容高频绕线电感并紧密排列。这部分走线最好做50Ω阻抗控制虽然芯片输出不是50Ω但良好的传输线特性有助于减少反射。晶体布局晶体应尽可能靠近芯片的OSC_IN和OSC_OUT引脚走线短且对称。晶体下方的PCB各层应挖空避免寄生电容影响频率。晶体外壳要接地。5.4 固件架构建议一个健壮的驱动层应该包含以下模块硬件抽象层 (HAL)封装SPI读写、GPIO控制EN IRQ、延时函数。确保SPI的读写函数能正确处理模式切换CPHA变化。寄存器配置层提供诸如TRF796x_Init(Protocol_t proto)、TRF796x_SetRF(bool on)、TRF796x_SetModulationDepth()等函数内部封装对具体寄存器的操作。命令收发层提供TRF796x_SendFrame(uint8_t *pData, uint16_t len)和TRF796x_ReceiveFrame(uint8_t *pBuffer, uint16_t *pLen)这样的高级API。内部处理FIFO管理、中断等待、超时处理、CRC的添加与校验。协议栈层实现具体的ISO14443A、15693等协议命令如ISO14443A_Request()、ISO14443A_Anticollision()等。这一层调用命令收发层。应用层实现具体的业务逻辑如“寻卡 - 防碰撞 - 选卡 - 认证 - 读块 - 写块”。调试时充分利用TRF796x提供的状态信息。将IRQ状态、FIFO状态、RSSI值通过调试串口打印出来是定位问题最快的方法。最后耐心和细致的测量是射频电路调试的不二法门没有捷径可走。从一块参考设计如TI的TRF7960AEVM开始逐步理解并修改为自己的设计是成功率最高的路径。