1. 前言
NCF3321 是世平集團代理的 NXP 所研發的新一代車規級 NFC 前端 IC,相比上代 NFC 前端 IC 性能提升巨大、支持多類型多協議卡檢測、支持手機模擬 NFC 識別、支持手機與卡共同檢測、寬範圍工作溫度工作更加穩定。
NCF3321 是一款高度集成的高性能、完全符合 NFC 論壇標準的 13.56 MHz 非接觸式通信前端 IC,它採用了出色的調製和解調概念,完全集成了不同類型的非接觸式通信方法和協議。NCF3321 可確保與下一代 NFC 手機的最大互操作性。NCF3321 針對門把手應用進行了優化,並實現了具有超低功耗卡檢測的大功率發射器功能。下圖為世平集團所設計 NCF3321Demo 板需要搭配 S32K144EVB 使用。
由於環境搭建、工程配置等已在博文《NXP NCF3321 卡保護應用示例講解》中介紹,因此不在此贅述,本文將從代碼流程講述發現卡與 APDU 應用。
2. APDU
2.1 APDU 簡介
APDU(Application Protocol Data Unit——應用協議數據單元)。PDU(Protocol Data Unit)協議數據單元是指對等層次之間傳遞的數據單位,協議數據單元(Protocol Data Unit)物理層的 PDU 是數據位(bit),數據鏈路層的 PDU 是數據幀(frame),網絡層的 PDU 是數據包(packet),傳輸層的 PDU 是數據段(segment),其他更高層次的 PDU 是數據(data)。
2.2 APDU命令與響應格式
2.2.1 命令格式
APDU命令由命令頭和命令體組成:
命令頭 |
命令體 | |||||
CLA |
INS |
P1 |
P2 |
Lc |
DATA |
Le |
命令可以被分為以下四種情況:
格式 |
命令組成 |
CASE 1 |
CLA INS P1 P2 |
CASE 2 |
CLA INS P1 P2 Le |
CASE 3 |
CLA INS P1 P2 Lc Data |
CASE 4 |
CLA INS P1 P2 Lc Data Le |
- CASE 1:
- 命令中沒有數據送到卡(Lc)中,也沒有數據從卡中返回(Le)。
- 不含安全報文的命令:CLA|INS|P1|P2。
- 含安全報文的命令:CLA|INS|P1|P2|Lc|MAC。
- 註:Lc=MAC 的長度,4 字節。
- CASE 2:
- 命令中沒有數據發送到卡(Lc)中,有數據從卡中返回(Le)。
- 不含安全報文的命令:CLA|INS|P1|P2|Le。
- 含安全報文的命令:CLA|INS|P1|P2|Lc|MAC|Le。
- 註:Lc=MAC 的長度,4 字節。
- CASE 3:
- 命令中有數據送到卡(Lc)中,沒有數據從卡中返回(Le)。
- 不含安全報文的命令:CLA|INS|P1|P2|Lc|Data。
- 含安全報文的命令:CLA|INS|P1|P2|Lc|Data+MAC。
- 註:Lc=數據的長度+ MAC 的長度(4 字節)。
- CASE 4:
- 命令中既有數據送到卡(Lc)中,也有數據從卡中返回(Le)。
- 不含安全報文的命令:CLA|INS|P1|P2|Lc|Data|Le。
- 含安全報文的命令:CLA|INS|P1|P2|Lc|Data+MAC|Le。
- 註:Lc=數據的長度+ MAC 的長度(4 字節)。
2.2.2 通用 APDU 命令集
指令名稱 |
CLA |
INS |
說明 |
READ BINARY |
00/04 |
B0 |
讀出帶有透明結構的 EF 內容的一部分。 |
WRITE BINARY |
|
D0 |
將二進制值寫入 EF。 |
UPDATE BINARY |
00/04 |
D6 |
啟動使用在命令 APDU 中給出的位來更新已呈現在 EF 中的位。 |
ERASE BINART |
|
0E |
順序地從給出的偏移開始,將 EF 的內容的一部分置為其邏輯擦除的狀態。 |
READ RECORD |
00/04 |
B2 |
給出了 EF 的規定記錄的內容或 EF 的一個記錄開始部分的內容。 |
WRITE RECORD |
|
D2 |
WRITE RECORD命令報文啟動下列操作之一: a.寫一次記錄; b.對早已呈現在卡內的記錄數據字節與在命令 APDU 中給出的記錄數據字節進行邏輯“或”運算; c.對早已呈現在卡內的記錄數據字節與在命令 APDU 中給出的記錄數據字節進行邏輯“和”運算。 |
APPEND RECORD |
00/04 |
E2 |
啟動在線性結構 EF 的結束端添加記錄,或者在循環結構的 EF 內寫記錄號 1。 |
UPDATE RECORD |
00/04 |
DC |
啟動使用命令 APDU 給出的位來更新特定記錄。 |
GET DATA |
|
CA |
可在當前上下文(例如應用特定環境或當前 DF)範圍內用於檢索一個原始數據對象,或者包含在結構化數據對象中所包含的一個或多個數據對象。 |
PUT DATA |
|
DA |
可在當前上下文(例如應用特定環境或當前 DF)範圍內用於存儲一個原始數據對象,或者包含在結構化數據對象中的一個或多個數據對象正確的存儲功能(寫一次和/或更新和/或添加)通過數據對象的定義和性質來引出。 |
SELECT FILE |
00 |
A4 |
設置當前文件後續命令可以通過那個邏輯信道隱式地引用該當前文件。 |
VERIFY |
00/04 |
20 |
啟動從接口設備送入卡內的驗證數據與卡內存儲的引用數據(例如口令)進行比較。 |
INTERNAL AUTHENTICATE |
00 |
88 |
啟動卡使用從接口設備發送來的詢問數據和在卡內存儲的相關秘密(例如秘鑰)來計算鑑別數據,當該相關秘密被連接到 MF 時,命令可以用來鑑別整個卡當該相關秘密被連接到另一個 DF 時命令可以用來鑑別那個 DF。 |
EXTERNAL AUTHENTICATE |
00 |
82 |
使用卡計算的結果(是或否)有條件地來更新安全狀態而該卡的計算是以該卡先前發出(例如通過 GET CHALLENGE 命令)的詢問在卡內存儲的可能得秘密密匙以及接口設備發送的鑑別數據為基礎的。 |
GET CHALLENGE |
00 |
84 |
要求發出一個詢問(例如隨機數)以便用於安全相關的規程(例 EXTERNAL AUTHENTICATE 命令)。 |
MANAGE CHANNEL |
|
70 |
打開和關閉邏輯信息。 |
GET RESPONSE |
00 |
C0 |
用於從卡發送至接口設備用可用的協議不能傳送的那一些的 APDU(或 APDU 的一部分)。 |
ENVOLOPE |
80 |
C2 |
用來發送那些不能由有效協議來發送的 APDU 或 APDU 的一部分或任何數據串。 |
2.2.3 響應格式
APDU響應格式:
數據 |
狀態字 | |
DATA |
SW1 |
SW2 |
DATA:想用數據。
SW1、SW2:卡片執行命令的返回值。
2.2.4 常見狀態字
狀態字 (SW1SW2) |
含義 |
狀態字 (SW1SW2) |
含義 |
狀態字 (SW1SW2) |
含義 |
9000 |
執行成功 |
6981 |
命令與文件結構不相容,當前文件非所需文件 |
6A86 |
不正確的參數(P1,P2) |
6100 |
數據被截斷 |
6982 |
要 PIN 驗證 |
6A88 |
引用數據沒找到 |
6200 |
警告,信息未提供 |
6983 |
文件無效,PIN 被鎖定 |
6B00 |
錯誤的參數(P1,P2) |
6281 |
警告,回送數據可能出錯 |
6984 |
數據無效,隨機數無效,引用的數據無效 |
6C00 |
長度錯誤 (Le) |
6282 |
警告,文件長度小於 Le |
6985 |
條件不滿足 |
6D00 |
INS 不支持 |
6283 |
應用無效 |
6986 |
不允許該命令 |
6E00 |
CLA 不支持 |
6284 |
FCI 格式與 P2 指定的不符 |
6987 |
安全消息丟失 |
6F00 |
位置錯誤 |
6300 |
認證失敗 |
6988 |
安全消息不正確 |
9301 |
資金不足 |
63Cx |
校驗失敗 (x- 允許重試次數) |
6999 |
應用選擇失敗 |
9302 |
MAC 無效 |
6400 |
原因不明 |
6A80 |
數據錯誤 |
9303 |
應用被永久鎖定 |
6581 |
內存失敗 |
6A81 |
功能不支持 |
9401 |
交易金額不足 |
6700 |
長度不對 |
6A82 |
文件找不到 |
9402 |
交易計數器達到最大值 |
6900 |
不能處理 |
6A83 |
記錄找不到 |
9403 |
秘鑰索引不支持 |
6901 |
命令不接受 (無效狀態) |
6A84 |
沒有足夠的空間 |
9406 |
所需 MAC 不可用 |
3. 檢測卡應用示例
檢測卡應用示例有使用發現循環(WithDiscLoop/ WithDiscLoop_Release)和不使用發現循環(NoDiscLoop/ NoDiscLoop_Resease)兩種檢測機制,兩種檢測機制可以工程內切換選擇不同的預定義宏來進行切換編譯不同代碼執行檢測機制。
3.1 使用發現循環檢測流程
使用發現循環檢測的應用具有輪詢以下列出技術的特性。在輪詢之前,發現循環將會執行低功耗檢卡操作(取決於運行時的配置)。
- 無源 NFC-A
- 無源 NFC-B
- 無源 NFC-F 212
- 無源 NFC-F 424
- 無源 NFC-V
- 設備會顯示或列印發現的標籤信息(例如:UID,SAK,Mifare 卡的產品類型),並在外部啟動器或讀取器將其作為目標激活時的列印信息。
- 當發現多種技術時,示例將選擇發現的第一種技術進行解析。
- 每當發現多個設備時示例將激活在索引 0 的設備。
使用工程配置內的“WithDiscLoop”或“WithDiscLoop_Release”來激活該特性。
使用發現循環流程示意圖
3.2 不使用發現循環檢測流程
使用工程配置內的“NoDiscLoop”或“NoDiscLoop_Resease”來禁用發現循環特性。那樣將會使用一種簡單的方式輪詢發現卡與卡激活,以下卡類型將會被發現:
- ISO 14443A
- ISO 14443B
- Felica 212
- Felica 424
- ISO 15693
不使用發現循環流程示意圖
這個示例應用程序不符合 NFC 論壇,但是它可以選擇較小的代碼尺寸。然而,它並不遵循 NFC 論壇兼容的行為。
這個示例顯示A 類型、B 類型、F 類型和V 類型的卡信息(例如 UID,SAK,產品類型)。
4. 運行演示
4.1 工程配置
打開 EB 配置工具,選擇 File->Import->General->Existing Projects into Workspace 將工程導入到 EB 配置工具查看 S32K144EVB 的 port 口配置,如需修改配置也再次修改。在導入時需勾選 Search for nested projects 選項,如下圖所示。
打開 Port 模塊即可觀察到工程的相關配置,如需修改相關配置也在此頁面。
4.2 代碼編譯
打開 S32 Design Studio for ARM Version 2018.R1,選擇 File->Import->General->Existing Projects into Workspace 將工程導入到 IDE 內,同樣在導入時需勾選 Search for nested projects 選項。打開工程列表,雙擊 AutosarEnvironment.bat 打開代碼頁,將紅框內代碼路徑更改成安裝位置路徑後即可編譯工程生成 .elf 文件。
4.3 調試演示
生成 .elf 文件後即可進行 debug 測試,測試結果如下所示。
A 類型卡檢測結果
B 類型卡檢測結果
V 類型卡檢測結果
F 類型卡檢測結果
綜上所述 NCF3321 卡檢測應用示例可精確檢測各類型卡片,並與支持 APDU 功能卡片進行 APDU 通訊。如想了解 NCF3321 卡檢測應用示例更多資料與設計,請聯繫我們 atu.sh@wpi-group.com。
5. 參考文獻
[1] DS787721-Data Sheet NCF3321(2.1).pdf,NXP
[2] UM-SCA11222-AUTOSAR_Demonstration_Guideline_for_aNFC_Reader_Library.pdf,NXP
[3] UM-SCA11840-RTD_AUTOSAR_Demonstration_Guideline_for_aNFC_Reader_Library.pdf,NXP
歡迎在博文下方留言評論,我們會及時回復您的問題如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com
作者:Hobo /許寧
評論