如何在任何应用中快速添加 NFC 功能

投稿人:DigiKey 北美编辑

为了满足日益增长的近场通信 (NFC) 功能需求,开发人员需要快速构建优化的设计。传统方法拖慢了开发进程,因为设计人员需应对各种挑战,如射频电路优化、NFC 协议管理、功耗、以及最小化设计封装。

为了帮助开发人员克服这些困难,NXP 等公司推出了 IC 以及支持性软硬件,提供了一种更简单的方法为应用增加 NFC 功能。

本文将简要探讨 NFC 如何演变到超越基本收银机 (POS) 应用范畴。接着,本文将介绍 NXP LPC8N04 NFC 解决方案,然后讨论如何利用它构建高效 NFC 设计以支持各种应用。

为何选择 NFC

NFC 已超出其原始的收银机支付应用范围,发展成为各种应用的重要特性。如今,开发人员利用智能手机和其他移动设备对 NFC 的普遍支持,简化消费者产业、工业和其他领域的设备控制。

只需将智能手机靠近智能玩具、家用电器或者网络设备,用户就能轻松、安全地配置并控制目标系统。来自启动器(称为接近耦合器件,PCD)的智能手机射频场启动目标(称为接近感应耦合卡,PICC)。

通过这种方法,任何兼容 ISO 14443 的 PCD 和 PICC 都能根据标准中规定的调制和编码方案,利用数据调制射频场,进行双向通信。

NFC MCU

NXP LPC8N04 MCU 为 NFC 设计提供了一个高性价比解决方案。这种 4 x 4 mm 24 引脚 MCU 基于 Arm® Cortex®-M0+ 处理器核心,结合了全套 NFC/RFID 子系统和串行接口、GPIO、存储器,包括 32 Kb 闪存、8 Kb SRAM 以及 4 Kb EEPROM。该产品本身功耗要求低,可以仅通过采集的射频能量运作,因而非常适合用于物联网 (IoT) 无电池连接系统,独立式系统中的智能标签,或者任何需要优化 NFC 解决方案的应用。

为了简化开发,LPC8N04 集成了 Arm 嵌套向量中断控制器 (NVIC) 和串行线调试 (SWD)。其中的 SWD 采用两个观察点比较器和四个断点比较器,可为 JTAG 测试和调试提供双向数据连接,并提供运行时系统内存访问,无需在设备上增加额外软件。此外,LPC8N04 固件为擦除闪存分区、复制数据到闪存、读取出厂设置的唯一设备序列号等提供完整应用编程接口 (API)。

当然,本文主要讨论的重点功能是其 NFC 子系统。该器件旨在支持不断增长的具有 NFC 功能的应用,可通过 13.56 MHz 接近信号传输提供完整的 NFC 双向通信能力。该器件兼容各种 NFC 规范,包括 NFC/RFID ISO 14443A、NFC Forum 2 型和 MIFARE Ultralight EV1 PICC 标准。

该子系统同时为硬件和软件连接提供简单的接口模型(图 1)。对于硬件接口,子系统的 50 皮法 (pF) 内部电容兼容标准 NFC 天线,如 Molex 1462360021。因此,开发人员可以将现成的天线连接到 LPC8N04 的 LA-LB 引脚。并且,该设备可从射频场恢复其时钟,无需额外的时钟元件。

NXP LPC8N04 MCU 的集成射频子系统示意图

图 1:NXP LPC8N04 MCU 的集成射频子系统通过 LA-LB 引脚提供天线连接,以及一个访问寄存器和 SRAM 的软件接口。(图片来源:NXP)

从功能上而言,NFC 读/写操作中用到的寄存器(CMDIN、DATAOUT、SR)和 SRAM 都映射到共享存储器中,访问权由集成仲裁单元进行管理。通信会话期间,外部 NFC/RFID 启动器读写寄存器或 SRAM。反过来,在 LPC8N04 Arm Cortex-M0+ 核心上运行的固件会评估寄存器和 SRAM,解析信息,并使用相同的共享资源酌情回复。为了保护通信通道,开发人员可以使用 MIFARE 协议的密码验证方法,根据需要允许或阻止访问。

当外部启动器发射的射频场处于 LPC8N04 范围内时,整个通信序列启动。射频场可用于将 LPC8N04 从低功耗休眠模式唤醒,并如下方所述用作其唯一电源。

电源管理

功耗通常是这些应用的关键考虑事项。过去,开发人员为了将功耗最小化,不得不在功能和性能上折衷。借助 LPC8N04,开发人员能利用多种器件特性协调功耗和性能,以满足要求。

在降低功耗的典型方法中,开发人员通常会修改系统时钟频率。通过 LPC8N04,开发人员能使用此方法显著降低功耗(图 2)。在最大时钟频率 8 MHz 下,LPC8N04 消耗约 900 微安 (µA) 电流。时钟速率降低至 1 MHz 时,功耗将降至 200 µA 左右。除了调整系统时钟速率外,开发人员还可使用多种不同的功耗模式,通过选择性地关闭 LPC8N04 的某些部分来降低功耗。

通过降低系统时钟频率减小 NXP LPC8N04 电流消耗图片

图 2:通过将系统时钟从最大频率 8 MHz(曲线 6)降低至 4 MHz (5)、2 MHz (4)、1 MHz (3)、500 kHz (2) 甚至 250 kHz (1),开发人员能显著降低 LPC8N04 电流消耗。(图片来源:NXP)

正如大多数复杂器件一样,LPC8N04 针对存储器和模拟外设、数字核心和外设、实时时钟 (RTC) 和欠压检测器 (BOD) 等需要持续电源的电路,将子系统分配到不同的功率域(图 3)。反过来,集成电源管理单元 (PMU) 可启用或禁用为模拟和数字功率域供电的低压差 (LDO) 稳压器。

NXP LPC8N04 MCU 电源架构示意图

图 3:在 NXP LPC8N04 MCU 的电源架构中,电源管理单元 (PMU) 支持多种低功率模式,可选择性地启用或禁用为模拟和数字功率域供电的低压差 (LDO) 稳压器。(图片来源:NXP)

通过设置 LPC8N04 电源控制 (PCON) 寄存器的位数,开发人员可对 PMU 编程,以三种低功率模式控制这些域的供电:

  • 休眠模式中,PMU 保持两个域的供电——降低功耗的同时,允许快速恢复处理器功能和指令执行。
  • 深度休眠模式中,PMU 只禁用模拟域——提供维持处理器状态、外设寄存器和内部 SRAM 的最低功率模式,但需要增加开机时间,以访问非易失性存储器。
  • 深度省电模式中,PMU 同时关闭模拟和数字域,将功耗降低至仅 3 µA,代价则是处理器状态和指令执行恢复的延迟更长。

在所有这三种低功耗模式中,PMU 关闭处理器核心。因此,使用低功耗模式将增加返回到完全活动模式所需的唤醒时间。当然,低功耗模式越深,唤醒时间就越长。但实际上,唤醒时间对于大多数 NFC 应用而言都已经足够快。最糟糕的情况下,从打开电源到上电复位以达到活动模式的总启动时间仅 2.5 毫秒 (ms) 左右。

射频能量收集

LPC8N04 相对快速的唤醒时间使开发人员有机会利用器件的能量收集能力从启动器的射频场收集能量。当 VNFC(从射频场获得的电压)上升到阈值之上,该器件的电源架构中的电源选择器自动将器件电源从电池模式切换到由采集能量供电(见图 3)。开发人员可以仅通过此电源操作 LPC8N04,或者只使用射频能量收集作为电池备份电源。尽管能源选择器单元可自动选择最佳电源,开发人员能根据应用要求强制选择 VBAT 或 VNFC。

实际上,通过采集射频能量为 LPC8N04 供电的功能取决于外部读取器发射的射频场强度、以及连接到 LPC8N04 的接收天线电路的能效。如前所述,开发人员仅需将适当的天线连接到 LPC8N04 的 LA-LB 引脚。但实际上,接收能量最大化的功能取决于经过设计优化的天线电路。

无论何种 RFID/NFC 设计,天线电感均会与射频前端总输入电容(天线、接收器和连接寄生电容)形成谐振电路。该组件的总电阻决定了品质因素,它与谐振电路的性能和场强度有关。例如,更高的连接电阻会降低品质因素,从而降低射频发射器的有效传输范围。

由于输入电容及输入电阻与输入电压(对于 LPC8N04 就是 VLA-LB)有关,设计适当的天线变得更加复杂。输入电压改变时,输入电容的相关改变造成谐振频率改变,同时输入电阻的相关改变造成品质因素改变。天线设计专家通常采用最小输入电压设计以应对这些变化。

快速开发平台

虽然概念很简单,但对于利用具有 NFC 功能的智能手机普及性的应用,如果开发人员希望快速部署应用,从头实现高效 NFC 设计会减缓其进度。通过在基于 NXP LPC8N04 的 OM40002 开发板上搭建,开发人员可以即刻开始开发 NFC 应用,无需创建自己的系统。LPC8N04 板和相关 NXP 软件开发套件的组合提供了一种直接的 NFC 解决方案,以及用于构建自定义硬件设计和软件应用的平台。

OM40002 板包括两部分,由可拆分的接口分隔(见图 4 中凹口之间的垂直线)。主处理器 (MP) 部分包括位于板顶部的 LPC8N04(图 4A,右)和底部的集成天线(图 4B,右)。调试探头 (DP) 部分包括 NXP Arm Cortex-M0 LPC11U35FHI33 MCU 和调试资源(图 4A,左)。在 DP 部分的底部(图 4B,左),5 x 7 LED 阵列和表面贴装扬声器为开发套件中所含的示例应用提供简单的用户界面机制。开发期间,工程师能将整块开发板用作一个完整的系统。对于定制设计,开发人员能使用整块开发板调试其应用软件,并可在稍后拆下 MP 部分,用作独立 NFC 子系统。

NXP OM40002 板图片

图 4:NXP OM40002 板结合了调试探头 (DP) 部分(A 和 B 左侧)和主处理器 (MP) 部分,开发人员可以拆分 MP 部分,将此完整 NFC 子系统添加到自己的设计中。(图片来源:NXP)

该开发板预装示例应用,在 LPC11U35FHI33 MCU 上作为固件来运行。利用该开发板的 LED 阵列和扬声器并并运行一个 NXP 提供的免费 Android 应用,此应用展示了 LPC8N04 和支持 NFC 功能的智能手机之间如何进行双向 NFC 数据交换格式 (NDEF) 消息传输。NDEF 用于大多数具有 NFC 功能的智能手机和其他移动设备,是一种轻量级格式,单一消息内可包含任意数据。通过示例 Android 应用,开发人员能更清晰地了解可在智能手机和 OM40002 板之间以 NDEF 交换的数据类型和大小。

NDEF 处理

除了能直接演示功能,示例应用为开发人员提供了使用 LPC8N04 处理 NDEF 信息的关键设计模式。NXP 软件开发套件中包含低层服务例程,用于处理寄存器层级的事务,而示例应用则用于展示高层操作。开发套件中包含主例程,用于向开发人员展示如何在主处理循环之前初始化 LPC8N04 硬件和相关软件结构(列表 1)。

int main(void)

{

                int temp;

                uint16_t decPosition, digit, prevDigit, index, textSize;

                uint32_t tempSpeed;

                bool initDispStarted = false;

                PMU_DPD_WAKEUPREASON_T wakeupReason;

    Init();

    wakeupReason = Chip_PMU_PowerMode_GetDPDWakeupReason();

    if(wakeupReason == PMU_DPD_WAKEUPREASON_RTC) {

                /* Blink LED for second */

                LPC_GPIO->DATA[0xFFF] = 0xE60U;

                Chip_TIMER_SetMatch(LPC_TIMER32_0, 2, 1000*100 + Chip_TIMER_ReadCount(LPC_TIMER32_0));

                Chip_TIMER_ResetOnMatchDisable(LPC_TIMER32_0, 2);

                Chip_TIMER_StopOnMatchDisable(LPC_TIMER32_0, 2);

                Chip_TIMER_MatchEnableInt(LPC_TIMER32_0, 2);

                __WFI();

    }

    else {

    ...

      /* Wait for a command.Send responses based on these commands.*/

      while (hostTicks < hostTimeout) {

    ...

        if ((sTargetWritten) && takeMemSemaphore())  {

          sTargetWritten = false;

          if (NDEFT2T_GetMessage(sNdefInstance, sData, sizeof(sData))) {

            char * data;

            uint8_t *binData;

            int length;

            NDEFT2T_PARSE_RECORD_INFO_T recordInfo;

            while (NDEFT2T_GetNextRecord(sNdefInstance, &recordInfo)) {

              if ((recordInfo.type == NDEFT2T_RECORD_TYPE_TEXT) && (strncmp((char *)recordInfo.pString, "en", 2) == 0)) {

                data = NDEFT2T_GetRecordPayload(sNdefInstance, &length);

                strncpy(g_displayText, data, (size_t)length);

                g_displayText[length] = 0;

                g_displayTextLen = (uint8_t)length;

                eepromWriteTag(EE_DISP_TEXT, (uint8_t *)g_displayText, (uint16_t)(((uint16_t)length+4) & 0xFFFC));

                startLEDDisplay(true);

              }

              else if((recordInfo.type == NDEFT2T_RECORD_TYPE_MIME) && (strncmp((char *)recordInfo.pString, "application/octet-stream", 24) == 0)) {

                binData = NDEFT2T_GetRecordPayload(sNdefInstance, &length);

                if(binData[0] == 0x53) {

                  extractMusic(&binData[1]);

                  eepromWriteTag(EE_MUSIC_TONE, (uint8_t *)&binData[1], (uint16_t)(((uint16_t)length+2) & 0xFFFC));

                  if(musicInProgress) {

                    stopMusic();

                    startMusic();

                  }

                }

                else if(binData[0] == 0x51) {

                  Chip_TIMER_MatchDisableInt(LPC_TIMER32_0, 0);

                  desiredSpeed = (uint8_t)(binData[1] + 5U);

                  if((desiredSpeed < 5) || (desiredSpeed > 30)) {

                    desiredSpeed = 20;

                  }

                  Chip_TIMER_SetMatch(LPC_TIMER32_0, 0, 1000*LED_REFRESH_RATE_MS + Chip_TIMER_ReadCount(LPC_TIMER32_0));

                  Chip_TIMER_MatchEnableInt(LPC_TIMER32_0, 0);

                  eepromWriteTag(EE_SCROLL_SPEED, (uint8_t *)&binData[1], (uint16_t)(((uint16_t)length+3) & 0xFFFC));

                }

              }

            }

          }

          releaseMemSemaphore();

    ...

列表 1:NXP LPC8N04 开发软件套件提供了全套资源库和示例应用软件,该软件对关键 NFC 操作(如本代码片段所示,读取 NDEF 信息)的基本设计模式进行演示。(代码来源:NXP)

首次调用时,主例程首先测试其是否是由于表示唤醒计数器已过期的特定 RTC 事件 (wakeupReason == PMU_DPD_WAKEUPREASON_RTC) 而启动。如果不是,例程进入主循环,测试读取器的各种指令并执行相关操作以进行响应。如果没有 NFC 活动(例如,智能手机不再处于范围内),则例程最终会超时。

尽管概念简单,示例应用和底层服务例程全方位介绍了使用 LPC8N04 的 NDEF 的信息处理。如列表 1 所示,示例应用的主循环阐明了处理 NDEF 信息的操作顺序。

正常操作中,LPC8N04 共享存储器中如果出现新的 NDEF 信息,则会调用中断,且中断将设置一个标记 (sTargetWritten)。在这一基于信号量的架构中,在加载信息 (NDEFT2T_GetMessage) 到其缓冲区之前,主例程一直等待,直到能声明信号量 (takeMemSemaphore())。例程会审查 NDEF 信息 (NDEFT2T_GetNextRecord),提取有效载荷并解析结果。

在本应用中,如果有效载荷为文本字符串,例程将数据写入到 EEPROM (eepromWriteTag) 中并开启 LED 显示 (startLEDDisplay)。如果有效载荷为 MIME 类型“application/octet-stream”,例程会检查 binData[0] 的值,以查看是否数据为音乐 (binData[0] == 0x53) 或滚动速度调整 (binData[0] == 0x51)。如果是后者,则将新的滚动速度保存到 EEPROM 中。如果是前者,例程会提取音乐数据 (extractMusic),将数据写入到 EEPROM,并且如果用户正在运行音乐播发器,还要重启音乐播发器 (startMusic)。

该软件套件提供了该应用和服务例程的全部源代码。例如,开发人员能查看 NDEFT2T_GetMessage()NDEFT2T_GetNextRecord() 函数中的源代码,以了解读取和处理 NDEF 信息的详情。许多情况下,开发人员可能无需修改就能直接使用服务例程,从而专注于应用的具体细节和 main() 例程。

总结

近场通信应用正不断扩展到收银机系统以外越来越多的领域。但对于开发人员而言,要在优化射频性能的同时最小化功耗,其中涉及的一系列挑战即使对于最有经验的工程师来说也十分棘手。

通过集成全套 NFC 子系统,NXP LPC8N04 MCU 消除了 NFC 设计的大部分复杂性。对于寻求快速解决方案的开发人员来说,NXP 基于 LPC8N04 的开发板和软件提供了一个完整的即用型示例应用和一个开发平台,从而轻松构建自己的定制 NFC 解决方案。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此出版商

DigiKey 北美编辑