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 /许宁
评论