缩略语:
- Nfa : Nfc For Android, ref: https://github.com/NfcForAndroid/NfA
- bail-out: A configuration option that allows the NFC Forum Device to conclude the Technology
Detection Activity, if the respective Bail-out parameter is set [digital 规范] - Static RF Connection A Logical Connection with a fixed Connection Identifier that always exists after NFCC initialization and is never closed. It is used by the DH to communicate with a Remote NFC Endpoint via an active RF Interface (固定的连接ID0x00,在NFCC initialization 初始化之后一直打开, 用于DH与远程NFC 端点通讯)
- Logical Connection A communication channel between the Device Host (DH) and the NFC Controller (NFCC) that is used for data communication toward the NFCC itself, an NFCEE, or a Remote NFC Endpoint(DH和NFCC直接的通讯通道,用于DH与(NFCC、NFCEE、远程端点)之间的数据通讯)
NCI 参数
配置参数 | 一般默认值 | 含义 | |
TOTAL DURATION | 0x03E8 (1S) | RF 发现周期 | |
CON_DISCOVERY_PARAM | 01 | bit0: Poll模式是否使能 bit1: 仅在NFCC支持Listen Mode Routing Table下应用,详细看规范 | |
PA_BAIL_OUT | - | NFC-A 激活后,结束Technolog Detection Activity | |
PA_DEVICES_LIMIT | 1 |
逻辑连接:
Data Messages can only be exchanged in the context of a Logical Connection. A Logical Connection has to be established before any Data Messages can be sent. One Logical Connection, the Static RF Connection, is always established during initialization of NCI. The Static RF Connection is dedicated to RF Communication. Additional Logical Connections can be created for RF and/or NFCEE Communication.
Logical Connections provide flow control for Data Messages in the direction from DH to NFCC.
- 数据消息交换只有在逻辑连接创建之后才能进行;
- static RF Connect在NCI initialization 时候就创建了,专用于RF 通讯;
- 逻辑连接为DH到NFCC的数据消息提供了流控制
动态逻辑连接用于RF接口和NFCEE接口,需要DH向NFCC发送CORE_CONN_CREATE_CMD来动态创建。对于RF接口来说,在NCI 1.0规范中只支持静态RF连接的使用,不支持动态逻辑连接。对于NFCEE接口来说,DH与NFCEE进行数据交互前,必须建立动态逻辑连接。
逻辑连接的种类:
Dynamic Logical Connection:
- DH主动发起动态连接请求,NFCC可以拒绝连接请求; DH 发起关闭动态连接请求;
- NFCC分配Conn ID;
- DH 和NFCC 可以忽略没有指定Conn ID的数据包
Static RF Connection:
- 在NCI initialization 时候就创建了,专用于RF 通讯;
- 初始Credits和 最大数据包负载在NFCC发送的RF_INTF_ACTIVATED_NTF 中
- 必须要RF接口激活后,DH才能发送数据;
Static HCI Connection:
- 前提:NFCC实现了HCI Host controller, NFCC的CORE_INIT_RSP通知中会告诉是否实现了HCI。
- 和Static RF Connection一样,在NFCC Initialization的时候创建,不会关闭
- 初始的Credits值和最大数据包负载在NFCC的CORE_INIT_RSP中给出;
接口与协议概念:
NCI 2.0中定义了2类接口,分别是:
- RF接口
- NFCEE 接口
与之对应的,NCI定义了2类协议,协议指的是通讯协议,分别是:
- RF协议
- NFCEE 协议
RF接口定义:
RF 协议定义:
NFCEE 接口和协议定义:
NFCEE协议和NFCEE接口是一对一的映射关系,因此定义了一个通用的表来表示NFCEE协议和NFCEE接口;
NCI中定义了两类接口:RF接口和NFCEE接口。RF接口用于DH和远端NFC端点通信,NFCEE接口用于DH与NFCEE通信。每一个接口都支持特定的协议。DH与远端NFC端点通信的协议称为RF协议,DH与NFCEE通信的协议称为NFCEE协议。举例来说,RF协议可以是NFC-DEP协议、ISO-DEP协议、类型1/2/3标签通信协议等,也可以LLCP协议。可以看出,RF协议的选择取决于两个通信的NFC设备或设备与标签之间所支持的技术与相应的Digital协议。由于RF协议不同,因此对应不同的RF接口。RF接口根据RF协议分为NFC-DEP RF接口、ISO-DEP RF接口、Frame RF接口等。这里需要进一步说明RF接口与RF协议之间的关系。RF协议实际上是NFCC与远端NFCC之间采用的通信协议,但是对于DH来说,该RF协议没有运行在DH上,DH无法“看到”它,因此NCI定义了RF接口的概念。DH通过RF接口控制对应的RF协议。从RF接口的概念来看,“RF接口是用于DH和远端NFC端点通信的接口”,这里强调的是,DH只有通过RF接口才能和远端NFC端点通信。上述描述来源《NFC技术原理与应用》;
RF接口和RF协议有映射关系。映射关系是DH初始化NFCC时通过配置命令配置给NFCC的。DH向NFCC发送RF发现命令,让NFCC执行RF发现过程;通过RF发现过程,NFCC把收集到的远端NFC端点的信息反馈给DH,如远端NFC端点支持的RF协议等信息。如果在RF发现过程中只发现了一个远端NFC端点,且该远端NFC端点只支持一种RF协议,NFCC将根据RF接口与RF协议的映射表自动激活对应的RF接口。激活的过程实际上就是NFCC向DH发送一个RF接口激活通告消息。如果在RF发现过程中发现了多个远端NFC端点,或者是一个远端NFC端点支持多个RF协议,NFCC将向DH通告所有端点的信息。如果一个远端NFC端点支持多个RF协议,NFCC将根据其支持的RF协议,将其看成多个远端NFC端点。举例来说,如果一个远端NFC端点既支持NFC-DEP协议,也支持ISO-DEP协议,NFCC将其看成两个不同的远端NFC端点,分别支持NFC-DEP协议和ISO-DEP协议。当DH收到NFCC发送的远端NFC端点列表后,可以选择其中一个通信。选择的过程将激活对应的RF接口。需要注意的是,NCI并没有定义选择的策略,即选择哪一个端点的规则,只是提供了选择的方法。因为如何选择,是由上层软件或用户决定的,不在NCI规范的考虑范围内。上述描述来源《NFC技术原理与应用》;
RF接口激活后,DH就可以通过RF接口向NFCC发送控制消息,以及与远端NFC端点进行数据交互。这里的控制消息在前面提到过,是NCI功能模块中的RF接口模块所属的控制消息,而不是NCI核心发送的基本控制消息。通信结束后,需要对RF接口去激活。去激活可以由DH或NFCC发起。关于RF接口的具体内容,将在10.5节介绍。NFCEE接口与RF接口原理类似,NFCC与NFCEE之间的通信协议对应NFCEE接口,DH通过NFCEE接口与NFCEE进行数据交互。上述描述来源《NFC技术原理与应用》;
同样,DH可以通过NFCEE发现模块来获取NFCC上连接的NFCEE的相关信息。在NFCEE发现过程中,NFCC为每一个NFCEE分配一个标识符。当DH想与某个NFCEE通信时,使用相应的标识符和指定NFCEE协议创建逻辑连接。此时,将自动激活相应的NFCEE接口。这一点与RF接口不同。由于NFCEE接口与NFCEE协议是一一对应的关系,因此无需像RF接口那样配置接口和协议的映射表。NFCEE接口激活后,DH就可以通过NFCEE接口与NFCEE通信了。如图10-4所示,DH可以通过NFCEE接口向NFCC发送控制消息,与NFCEE进行数据交互。这里所指的控制消息,是指NCI功能模块的NFCEE接口模块所属的控制消息。关闭与NFCEE之间的逻辑连接,将去激活NFCEE接口。上述描述来源《NFC技术原理与应用》;
NCI规范中没有定义NFCEE接口的激活和去激活命令。从NFCEE_DISCOVER_NTF获取的NFCEE ID和NFCEE协议用于逻辑连接的创建。当DH通过CORE_CONN_CREATE_CMD创建与NFCEE的逻辑连接时,就自动激活了NFCEE接口。DH发送CORE_CONN_CLOSE_CMD关闭逻辑连接的同时,去激活了NFCEE接口。如果NFCEE接口激活失败,NFCC将把CORE_CONN_CREATE_RSP消息中的状态参数设置为NFCEE_INTERFACE_ACTIVATION_FAILED。对于一个NFCEE来说,只能同时有一个NFCEE接口被激活,也就是说,在DH和一个NFCEE之间只能有一个逻辑连接。
映射关系:
DH向NFCC发送RF_DISCOVER_MAP_CMD命令来配置RF接口与RF协议之间的映射关系
一个RF协议只能映射至一个RF接口;
一个RF协议只能映射至一个RF接口;
一般情况下,未包含在RF_DISCOVER_MAP_CMD中的RF协议,默认都会映射到Frame RF接口。
侦听模式路由表:
DH通过RF_SET_LISTEN_MODE_ROUTING_CMD命令向NFCC配置侦听模式路由表。
侦听模式路由表中包含三种类型的路由条件,即基于AID的路由、基于协议的路由和基于技术的路由。
除了三种路由条件外,侦听模式路由表中还将电源状态作为路由依据。NCI规范中定义了三种电源状态:馈电状态(Battery Off)、关机状态(Switched Off)和开机状态(Switch on)。
RF Discover(发现)
RF发现过程是一个周期执行轮询和侦听的活动。
周期性discover:
- 开启poll 模式, 充当Read或者点对点模式的发起方, 去发现卡片(Tag)或者点对点target,
- 如果没有发现,进行listen模式,作为卡模拟或者点对点的target, 等待被外部读写器激活;
- 相关的NCI配置参数 TOTAL_DURATION
注: 一般来说poll模式需要消耗比较多的电量,>100ma? , 缩短polling phase 可以省电?