你的位置:首頁 > RF/微波 > 正文

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

發(fā)布時間:2018-06-07 責任編輯:wenwei

【導讀】為了滿足日益增長的近場通信 (NFC) 功能需求,開發(fā)人員需要快速構建優(yōu)化的設計。傳統(tǒng)方法拖慢了開發(fā)進程,因為設計人員需應對各種挑戰(zhàn),如射頻電路優(yōu)化、NFC 協(xié)議管理、功耗、以及最小化設計封裝。
 
為了幫助開發(fā)人員克服這些困難,NXP 等公司推出了 IC 以及支持性軟硬件,提供了一種更簡單的方法為應用增加 NFC 功能。
 
本文將簡要探討 NFC 如何演變到超越基本收銀機 (POS) 應用范疇。接著,本文將介紹 NXP LPC8N04 NFC 解決方案,然后討論如何利用它構建高效 NFC 設計以支持各種應用。
 
為何選擇 NFC
 
NFC 已超出其原始的收銀機支付應用范圍,發(fā)展成為各種應用的重要特性。如今,開發(fā)人員利用智能手機和其他移動設備對 NFC 的普遍支持,簡化消費者產(chǎn)業(yè)、工業(yè)和其他領域的設備控制。
 
只需將智能手機靠近智能玩具、家用電器或者網(wǎng)絡設備,用戶就能輕松、安全地配置并控制目標系統(tǒng)。來自啟動器(稱為接近耦合器件,PCD)的智能手機射頻場啟動目標(稱為接近感應耦合卡,PICC)。
 
通過這種方法,任何兼容 ISO 14443 的 PCD 和 PICC 都能根據(jù)標準中規(guī)定的調制和編碼方案,利用數(shù)據(jù)調制射頻場,進行雙向通信。
 
NFC MCU
 
NXP LPC8N04 MCU 為 NFC 設計提供了一個高性價比解決方案。這種 4 x 4 mm 24 引腳 MCU 基于 Arm® Cortex®-M0+ 處理器核心,結合了全套 NFC/RFID 子系統(tǒng)和串行接口、GPIO、存儲器,包括 32 Kb 閃存、8 Kb SRAM 以及 4 Kb EEPROM。該產(chǎn)品本身功耗要求低,可以僅通過采集的射頻能量運作,因而非常適合用于物聯(lián)網(wǎng) (IoT) 無電池連接系統(tǒng),獨立式系統(tǒng)中的智能標簽,或者任何需要優(yōu)化 NFC 解決方案的應用。
 
為了簡化開發(fā),LPC8N04 集成了 Arm 嵌套向量中斷控制器 (NVIC) 和串行線調試 (SWD)。其中的 SWD 采用兩個觀察點比較器和四個斷點比較器,可為 JTAG 測試和調試提供雙向數(shù)據(jù)連接,并提供運行時系統(tǒng)內(nèi)存訪問,無需在設備上增加額外軟件。此外,LPC8N04 固件為擦除閃存分區(qū)、復制數(shù)據(jù)到閃存、讀取出廠設置的唯一設備序列號等提供完整應用編程接口 (API)。
 
當然,本文主要討論的重點功能是其 NFC 子系統(tǒng)。該器件旨在支持不斷增長的具有 NFC 功能的應用,可通過 13.56 MHz 接近信號傳輸提供完整的 NFC 雙向通信能力。該器件兼容各種 NFC 規(guī)范,包括 NFC/RFID ISO 14443A、NFC Forum 2 型和 MIFARE Ultralight EV1 PICC 標準。
 
該子系統(tǒng)同時為硬件和軟件連接提供簡單的接口模型(圖 1)。對于硬件接口,子系統(tǒng)的 50 皮法 (pF) 內(nèi)部電容兼容標準 NFC 天線,如 Molex 1462360021。因此,開發(fā)人員可以將現(xiàn)成的天線連接到 LPC8N04 的 LA-LB 引腳。并且,該設備可從射頻場恢復其時鐘,無需額外的時鐘元件。
 
如何在任何應用中快速添加 NFC 功能
圖 1:NXP LPC8N04 MCU 的集成射頻子系統(tǒng)通過 LA-LB 引腳提供天線連接,以及一個訪問寄存器和 SRAM 的軟件接口。(圖片來源:NXP)
 
從功能上而言,NFC 讀/寫操作中用到的寄存器(CMDIN、DATAOUT、SR)和 SRAM 都映射到共享存儲器中,訪問權由集成仲裁單元進行管理。通信會話期間,外部 NFC/RFID 啟動器讀寫寄存器或 SRAM。反過來,在 LPC8N04 Arm Cortex-M0+ 核心上運行的固件會評估寄存器和 SRAM,解析信息,并使用相同的共享資源酌情回復。為了保護通信通道,開發(fā)人員可以使用 MIFARE 協(xié)議的密碼驗證方法,根據(jù)需要允許或阻止訪問。
 
當外部啟動器發(fā)射的射頻場處于 LPC8N04 范圍內(nèi)時,整個通信序列啟動。射頻場可用于將 LPC8N04 從低功耗休眠模式喚醒,并如下方所述用作其唯一電源。
 
電源管理
 
功耗通常是這些應用的關鍵考慮事項。過去,開發(fā)人員為了將功耗最小化,不得不在功能和性能上折衷。借助 LPC8N04,開發(fā)人員能利用多種器件特性協(xié)調功耗和性能,以滿足要求。
 
在降低功耗的典型方法中,開發(fā)人員通常會修改系統(tǒng)時鐘頻率。通過 LPC8N04,開發(fā)人員能使用此方法顯著降低功耗(圖 2)。在最大時鐘頻率 8 MHz 下,LPC8N04 消耗約 900 微安 (µA) 電流。時鐘速率降低至 1 MHz 時,功耗將降至 200 µA 左右。除了調整系統(tǒng)時鐘速率外,開發(fā)人員還可使用多種不同的功耗模式,通過選擇性地關閉 LPC8N04 的某些部分來降低功耗。
 
如何在任何應用中快速添加 NFC 功能
圖 2:通過將系統(tǒng)時鐘從最大頻率 8 MHz(曲線 6)降低至 4 MHz (5)、2 MHz (4)、1 MHz (3)、500 kHz (2) 甚至 250 kHz (1),開發(fā)人員能顯著降低 LPC8N04 電流消耗。(圖片來源:NXP)
 
正如大多數(shù)復雜器件一樣,LPC8N04 針對存儲器和模擬外設、數(shù)字核心和外設、實時時鐘 (RTC) 和欠壓檢測器 (BOD) 等需要持續(xù)電源的電路,將子系統(tǒng)分配到不同的功率域(圖 3)。反過來,集成電源管理單元 (PMU) 可啟用或禁用為模擬和數(shù)字功率域供電的低壓差 (LDO) 穩(wěn)壓器。
 
如何在任何應用中快速添加 NFC 功能
圖 3:在 NXP LPC8N04 MCU 的電源架構中,電源管理單元 (PMU) 支持多種低功率模式,可選擇性地啟用或禁用為模擬和數(shù)字功率域供電的低壓差 (LDO) 穩(wěn)壓器。(圖片來源:NXP)
 
通過設置 LPC8N04 電源控制 (PCON) 寄存器的位數(shù),開發(fā)人員可對 PMU 編程,以三種低功率模式控制這些域的供電:
 
● 休眠模式中,PMU 保持兩個域的供電——降低功耗的同時,允許快速恢復處理器功能和指令執(zhí)行。
● 深度休眠模式中,PMU 只禁用模擬域——提供維持處理器狀態(tài)、外設寄存器和內(nèi)部 SRAM 的最低功率模式,但需要增加開機時間,以訪問非易失性存儲器。
● 深度省電模式中,PMU 同時關閉模擬和數(shù)字域,將功耗降低至僅 3 µA,代價則是處理器狀態(tài)和指令執(zhí)行恢復的延遲更長。
 
在所有這三種低功耗模式中,PMU 關閉處理器核心。因此,使用低功耗模式將增加返回到完全活動模式所需的喚醒時間。當然,低功耗模式越深,喚醒時間就越長。但實際上,喚醒時間對于大多數(shù) NFC 應用而言都已經(jīng)足夠快。最糟糕的情況下,從打開電源到上電復位以達到活動模式的總啟動時間僅 2.5 毫秒 (ms) 左右。
 
射頻能量收集
 
LPC8N04 相對快速的喚醒時間使開發(fā)人員有機會利用器件的能量收集能力從啟動器的射頻場收集能量。當 VNFC(從射頻場獲得的電壓)上升到閾值之上,該器件的電源架構中的電源選擇器自動將器件電源從電池模式切換到由采集能量供電(見圖 3)。開發(fā)人員可以僅通過此電源操作 LPC8N04,或者只使用射頻能量收集作為電池備份電源。盡管能源選擇器單元可自動選擇最佳電源,開發(fā)人員能根據(jù)應用要求強制選擇 VBAT 或 VNFC。
 
實際上,通過采集射頻能量為 LPC8N04 供電的功能取決于外部讀取器發(fā)射的射頻場強度、以及連接到 LPC8N04 的接收天線電路的能效。如前所述,開發(fā)人員僅需將適當?shù)奶炀€連接到 LPC8N04 的 LA-LB 引腳。但實際上,接收能量最大化的功能取決于經(jīng)過設計優(yōu)化的天線電路。
 
無論何種 RFID/NFC 設計,天線電感均會與射頻前端總輸入電容(天線、接收器和連接寄生電容)形成諧振電路。該組件的總電阻決定了品質因素,它與諧振電路的性能和場強度有關。例如,更高的連接電阻會降低品質因素,從而降低射頻發(fā)射器的有效傳輸范圍。
 
由于輸入電容及輸入電阻與輸入電壓(對于 LPC8N04 就是 VLA-LB)有關,設計適當?shù)奶炀€變得更加復雜。輸入電壓改變時,輸入電容的相關改變造成諧振頻率改變,同時輸入電阻的相關改變造成品質因素改變。天線設計專家通常采用最小輸入電壓設計以應對這些變化。
 
快速開發(fā)平臺
 
雖然概念很簡單,但對于利用具有 NFC 功能的智能手機普及性的應用,如果開發(fā)人員希望快速部署應用,從頭實現(xiàn)高效 NFC 設計會減緩其進度。通過在基于 NXP LPC8N04 的 OM40002 開發(fā)板上搭建,開發(fā)人員可以即刻開始開發(fā) NFC 應用,無需創(chuàng)建自己的系統(tǒng)。LPC8N04 板和相關 NXP 軟件開發(fā)套件的組合提供了一種直接的 NFC 解決方案,以及用于構建自定義硬件設計和軟件應用的平臺。
 
OM40002 板包括兩部分,由可拆分的接口分隔(見圖 4 中凹口之間的垂直線)。主處理器 (MP) 部分包括位于板頂部的 LPC8N04(圖 4A,右)和底部的集成天線(圖 4B,右)。調試探頭 (DP) 部分包括 NXP Arm Cortex-M0 LPC11U35FHI33 MCU 和調試資源(圖 4A,左)。在 DP 部分的底部(圖 4B,左),5 x 7 LED 陣列和表面貼裝揚聲器為開發(fā)套件中所含的示例應用提供簡單的用戶界面機制。開發(fā)期間,工程師能將整塊開發(fā)板用作一個完整的系統(tǒng)。對于定制設計,開發(fā)人員能使用整塊開發(fā)板調試其應用軟件,并可在稍后拆下 MP 部分,用作獨立 NFC 子系統(tǒng)。
 
如何在任何應用中快速添加 NFC 功能
圖 4:NXP OM40002 板結合了調試探頭 (DP) 部分(A 和 B 左側)和主處理器 (MP) 部分,開發(fā)人員可以拆分 MP 部分,將此完整 NFC 子系統(tǒng)添加到自己的設計中。(圖片來源:NXP)
 
該開發(fā)板預裝示例應用,在 LPC11U35FHI33 MCU 上作為固件來運行。利用該開發(fā)板的 LED 陣列和揚聲器并并運行一個 NXP 提供的免費 Android 應用,此應用展示了 LPC8N04 和支持 NFC 功能的智能手機之間如何進行雙向 NFC 數(shù)據(jù)交換格式 (NDEF) 消息傳輸。NDEF 用于大多數(shù)具有 NFC 功能的智能手機和其他移動設備,是一種輕量級格式,單一消息內(nèi)可包含任意數(shù)據(jù)。通過示例 Android 應用,開發(fā)人員能更清晰地了解可在智能手機和 OM40002 板之間以 NDEF 交換的數(shù)據(jù)類型和大小。
 
NDEF 處理
 
除了能直接演示功能,示例應用為開發(fā)人員提供了使用 LPC8N04 處理 NDEF 信息的關鍵設計模式。NXP 軟件開發(fā)套件中包含低層服務例程,用于處理寄存器層級的事務,而示例應用則用于展示高層操作。開發(fā)套件中包含主例程,用于向開發(fā)人員展示如何在主處理循環(huán)之前初始化 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 開發(fā)軟件套件提供了全套資源庫和示例應用軟件,該軟件對關鍵 NFC 操作(如本代碼片段所示,讀取 NDEF 信息)的基本設計模式進行演示。(代碼來源:NXP)
 
首次調用時,主例程首先測試其是否是由于表示喚醒計數(shù)器已過期的特定 RTC 事件 (wakeupReason == PMU_DPD_WAKEUPREASON_RTC) 而啟動。如果不是,例程進入主循環(huán),測試讀取器的各種指令并執(zhí)行相關操作以進行響應。如果沒有 NFC 活動(例如,智能手機不再處于范圍內(nèi)),則例程最終會超時。
 
盡管概念簡單,示例應用和底層服務例程全方位介紹了使用 LPC8N04 的 NDEF 的信息處理。如列表 1 所示,示例應用的主循環(huán)闡明了處理 NDEF 信息的操作順序。
 
正常操作中,LPC8N04 共享存儲器中如果出現(xiàn)新的 NDEF 信息,則會調用中斷,且中斷將設置一個標記 (sTargetWritten)。在這一基于信號量的架構中,在加載信息 (NDEFT2T_GetMessage) 到其緩沖區(qū)之前,主例程一直等待,直到能聲明信號量 (takeMemSemaphore())。例程會審查 NDEF 信息 (NDEFT2T_GetNextRecord),提取有效載荷并解析結果。
 
在本應用中,如果有效載荷為文本字符串,例程將數(shù)據(jù)寫入到 EEPROM (eepromWriteTag) 中并開啟 LED 顯示 (startLEDDisplay)。如果有效載荷為 MIME 類型“application/octet-stream”,例程會檢查 binData[0] 的值,以查看是否數(shù)據(jù)為音樂 (binData[0] == 0x53) 或滾動速度調整 (binData[0] == 0x51)。如果是后者,則將新的滾動速度保存到 EEPROM 中。如果是前者,例程會提取音樂數(shù)據(jù) (extractMusic),將數(shù)據(jù)寫入到 EEPROM,并且如果用戶正在運行音樂播發(fā)器,還要重啟音樂播發(fā)器 (startMusic)。
 
該軟件套件提供了該應用和服務例程的全部源代碼。例如,開發(fā)人員能查看 NDEFT2T_GetMessage() 和 NDEFT2T_GetNextRecord() 函數(shù)中的源代碼,以了解讀取和處理 NDEF 信息的詳情。許多情況下,開發(fā)人員可能無需修改就能直接使用服務例程,從而專注于應用的具體細節(jié)和 main() 例程。
 
總結
 
近場通信應用正不斷擴展到收銀機系統(tǒng)以外越來越多的領域。但對于開發(fā)人員而言,要在優(yōu)化射頻性能的同時最小化功耗,其中涉及的一系列挑戰(zhàn)即使對于最有經(jīng)驗的工程師來說也十分棘手。
 
通過集成全套 NFC 子系統(tǒng),NXP LPC8N04 MCU 消除了 NFC 設計的大部分復雜性。對于尋求快速解決方案的開發(fā)人員來說,NXP 基于 LPC8N04 的開發(fā)板和軟件提供了一個完整的即用型示例應用和一個開發(fā)平臺,從而輕松構建自己的定制 NFC 解決方案。
 
 
推薦閱讀:
 
新型智能芯片:在電池沒電時仍可繼續(xù)工作!
通過能量收集延長 IoT 傳感器節(jié)點的電池續(xù)航時間
Analog Devices 實現(xiàn)了工業(yè)自動化轉型
快速實現(xiàn)精度達10厘米的實時定位系統(tǒng)
電源開關的阻容吸收器設計
特別推薦
技術文章更多>>
技術白皮書下載更多>>
熱門搜索
?

關閉

?

關閉