您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子百科>无线通信>

NFC芯片相关的内容总结

2022年09月15日 09:44 嵌入式软件开发交流 作者:young 用户评论(0

前言

我们提到NFC的一些标准,这些标准主要是读卡器和标签卡之间的通信协议。所以我们要对标签卡进行读写就需要了解相关协议。我们先从ISO14443A开始了解,因为目前市面上使用该标准的卡最多。

ISO14443简介

ISO14443分为4个部分协议,这4个部分对应不同的分层。

ISO14443-1: 定义物理特性,可以理解为物理层。

ISO14443-2射频电源信号接口

ISO14443-3: 初始化和防碰撞。

ISO14443-4: 传输协议。

注意:ISO14443A和ISO14443B都是分成这4个部分,大多数是共用的,只是里面有部分是描述A的,部分是描述B的。

名词解析 PCD: Proximity Coupling Device, 近耦合设备, 简单理解就是读写卡设备。 PICC: Proximity Card, 感应卡,简单理解就是标签卡。 SAK: Select Acknowledge

UID: Unique Identifier, 唯一标识符

命令介绍

对于软件开发者而言,我们主要是研究ISO14443-3和ISO14443-4协议。初始化和防碰撞相关内容在ISO14443-3上。

ISO14443-3协议中定义了相关的时序和命令,我们先不探讨时序,本文主要来了解命令(Command)定义。

REQA/WUPA

读卡器发送REQA或WUPA命令来检查是否有卡存在。命令码如下:

02c649c4-348d-11ed-ba43-dac502259ad0.png

*注意: 只有7个bit

那这两条命令有什么区别呢?

WUPA命令是处于IDLE或HALT状态的卡都会应答,而REQA命令只有处于IDLE状态的卡会应答。标签卡刚上电就处于IDLE状态,当读卡器发送HALT命令之后,标签卡就进入HALT状态(就是休眠状态)。

ANTICOLISION和SELECT

这两条命令是用来进行防碰撞的,所谓的防碰撞就是当有多张卡被检查到时,要如何选择卡。命令格式如下:

Byte1 Byte2 Byte3~Byte7
SEL NVB UID

(1) SEL:选择码,选择代码分成三个层次,级别一选择代码为0x93,级别二为0x95,级别三为0x97。为什么会有三级呢? 因为一张卡的UID有可能是4Byte,7Byte或10Byte。可能有些人又会有疑问,上面UID字段不是才5Byte吗,如何读出7个和10个字节呢?下面内容会解释。

(2) NVB:有效比特数,指PCD传输了的字节数和比特位数。NVB的高4位表示已经传输的字节数,低4位表示已经传输的bit。比如:00100001, 就是2byte+1bit,总共传输了17bit。当NVB为0x70时,则表示的是SELECT命令。

(3)UID: 唯一ID,  传输的长度根据具体的碰撞情况而定,传输范围在0~40个比特位之间,它会由NVB指出。

防碰撞是用来确定要选择的卡的一个过程,它会循环轮询UID的每个bit,最终确定卡的UID。

HALT

HALT命令用来让卡进入休眠状态。命令格式如下:

02ec2928-348d-11ed-ba43-dac502259ad0.png

CRC_A为两个字节, 这条指令是没有应答的!

ATQA

ATQA命令是REQA或WUPA命令的应答。命令格式如下:

0304ee18-348d-11ed-ba43-dac502259ad0.png

(1)Proprietary coding:这几位留给厂家自定义

(2)UID size bit frame: 指示UID的长度

0326ebf8-348d-11ed-ba43-dac502259ad0.png

(3)Bit frame anticollision:防撞比特位,不为0时表示有多张卡响应REQA或WUPA命令。

0348c6ec-348d-11ed-ba43-dac502259ad0.png

SAK

SAK是SELECT命令的应答,命令格式如下:

03976d88-348d-11ed-ba43-dac502259ad0.png

SAK字段定义如下:

03cbdaa0-348d-11ed-ba43-dac502259ad0.png

通过bit3和bit6来确定UID是否完整,以及PICC是否支持ISO14443-4。

PCD检测PICC流程

03fba49c-348d-11ed-ba43-dac502259ad0.png

PCD检测PICC的主要包含PICC检测、防碰撞和确定PICC类型三个部分。

(1)PCD发出REQA命令,如果有PICC响应ATQA,则表示找到ISO14443A类型的PICC。

(2)进行防碰撞, 防碰撞的过程分成三个级别,第一个级别必须要有,第二和第三级别根据UID的长度而定。

(3)确定PICC类型,该部分主要由PICC发送SAK,然后PCD解析SAK,从而确定PICC是否支持ISO14443-4。

防碰撞流程

0439446e-348d-11ed-ba43-dac502259ad0.png

(1)上图中的流程1~3设置了SEL和NVB, 然后PCD发送ANTICOLLISION命令。上面解释过NVB的含义,所以0x20表示两个字节,也就对应SEL和NVB这两个字节。

(2)流程4~5会根据收到的数据判断是否有bit冲突。有冲突则要选择该位是0,还是1,然后继续发送ANTICOLLISION命令,直到没有冲突。

(3)没有bit冲突之后,PCD发送SELECT命令,最后收到PICC的SAK。

防碰撞级别

上面说过防碰撞级别,通过下图来更直观地理解。

046e2468-348d-11ed-ba43-dac502259ad0.png

如果UID为4个字节,则只需发送第一级ANTICOLISION(0x93);如果UID长度为7个字节,则发完第一级ANTICOLISION(0x93),  还要继续发第二级ANTICOLISION(0x95);如果UID长度为10个字节,除了发送第一,二级,还要发送第三级ANTICOLISION(0x97)。

通过多级ANTICOLISION之后才能获取到标签卡(PICC)的完整UID。

总结

单纯看协议可能会比较枯燥,所以建议可以找一份代码,边看代码边阅读协议,比如RC522的参考代码。




审核编辑:刘清

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

( 发表人:刘芹 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!