这里写自定义目录标题
NFC学习笔记
本片记录PN532与NTAG213调试笔记,PN532配置成UART通讯模式
PN532
PN532配置通讯模式
通过配置 Pin #16和Pin #17引脚,使得PN532工作在HSU(UART)通信模式
Mode | I0 (Pin #16) | I1 (Pin #17) |
---|---|---|
HSU | 0 | 0 |
I2C | 1 | 0 |
SPI | 0 | 1 |
RFU | 1 | 1 |
PN532 User Manua.pdf => 6.1.1 Possible links
PN532 串口通信参数
引脚
IHSU_RX (NSS) | HSU_TX (MOSI) | |
---|---|---|
PN532 Pin number | 27 | 28 |
串口参数 | |
---|---|
Data bit | 8 bits |
Parity bit | none |
Stop bit | 1 bit |
Baud rate | 115 200 bauds |
Data order | LSB first |
PN532 User Manua.pdf => 6.1.1.2 HSU interface
PN532通信协议
字节长度(byte) | 说明 | |
---|---|---|
PREAMBLE | 1 | 帧头默认 0x00 |
START CODEt | 2 | 固定 0x00 0xFF |
LEN | 1 | 从TFI到DATA的长度 |
LCS | 1 | 主机发起 - 0xD4 \ PN532应答 - 0xD5 |
DATA | 数据内容 见后文PN532命令 | |
DCS | 1 | 校验位 - LCS 到DCS数据相加为0 |
POSTAMBLE | 1 | 默认0x00 |
PN532 User Manua.pdf => 6.2.1.1 Normal information frame
示例
MCU => PN532 : 00 00 FF 03 FD D4 14 01 17 00
MCU <= PN532 : 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
这里需要说明下00 00 FF 00 FF 00响应对上一帧命令应答
PN532通信协议 - 应答帧
这个帧代表之前的命令帧已经收到
示例
MCU => PN532 : 00 00 FF 03 FD D4 14 01 17 00
MCU <= PN532 : 00 00 FF 00 FF 00
PN532 User Manua.pdf => 6.2.1.3 ACK frame
PN532通信协议 - 错误帧
这个帧是PN532响应给主机的,表明之前发送的命令有误。
示例
MCU => PN532 : 00 00 FF 04 FC D4 40 01 60 8B 00
MCU <= PN532 : 00 00 FF 01 FF 7F 81 00
PN532 User Manua.pdf => 6.2.1.5 Error frame
PN532命令 - 唤醒PN532
参考很多人写的资料都在PN532上电时候发送,但是验证过这个发不发不影响通信,姑且先做记录
MCU => PN532 : 55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00
MCU <= PN532 : 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
可以看到PN532会应答00 00 FF 00 FF 00 ,我认为是意义的,后面找资料补充,下面的命令示例都删掉00 00 FF 00 FF 00,避免影响阅读
PN532命令 - 安全访问模块配置
用户指南称为SAMConfiguration,我们设置成Normal mode
MCU => PN532 : 00 00 FF 03 FD D4 14 01 17 00
MCU <= PN532 : 00 00 FF 02 FE D5 15 16 00
PN532 User Manua.pdf => 7.2.10 SAMConfiguration
PN532命令 - 寻卡
用户指南称为InListPassiveTarget,用于检测标签,如检测到标签将返回标签UID。
请求帧
请求帧 | 字节长度(byte) | 说明 |
---|---|---|
Command | 1 | 0x4A |
MaxTg | 1 | 检测标签数,PN532最大支持2个 |
BrTy | 1 | 其他值没测试过,示例填0x00 |
LEN | 1 | 从TFI到DATA的长度 |
InitiatorData [ ] | 没测试过 |
应答帧
应答帧 | 字节长度(byte) | 说明 |
---|---|---|
Command | 1 | 0x4B |
NbTg | 1 | 检测到卡数量 |
BrTy | 1 | 其他值没测试过,示例填0x00 |
Tg | 1 | 第几张标签,第一张则为1 |
SENS_RES | 2 | 表面标签类型 NTAG21x - 0x00,0x44,为什么是0x00,0x04见下面NTAG21x |
SEL_RES | 1 | 没测试过 |
NFCIDLength | 1 | 标签ID长度 |
NFCID[] | 标签ID | |
ATS[] | 没测试过 |
MCU => PN532 : 00 00 FF 04 FC D4 4A 01 00 E1 00
MCU <= PN532 : 00 00 FF 0F F1 D5 4B 01 01 00 44 00 07 04 0E 4C 42 1D 12 91 33 00
PN532 User Manua.pdf => 7.3.5 InListPassiveTarget
PN532命令 - 卡数据交换
用户指南称为InDataExchange,用于标签数据交换,标准准NFC命令可以使用,这里需要结合标签的用户手册.
请求帧 | 字节长度(byte) | 说明 |
---|---|---|
Command | 1 | 0x40 |
Tg | 1 | 标签序号 |
DataOut[] | 标签命令,需要结合标签的用户手册 |
应答帧 | 字节长度(byte) | 说明 |
---|---|---|
Command | 1 | 0x41 |
Status | 1 | 状态 - 0x00 即正常 |
DataInt[] | 标签应答,需要结合标签的用户手册 |
MCU => PN532 : 00 00 FF 05 FB D4 40 01 30 00 BB 00
MCU <= PN532 : 00 00 FF 13 ED D5 41 00 04 E1 05 68 42 1D 12 94 D9 48 00 00 E1 10 12 00 6F 00
PN532 User Manua.pdf => 7.3.8 InDataExchange
PN532命令 - 非标准NFC命令卡数据交换
用户指南称为InCommunicateThru,同上要结合标签的用户手册,有些电子标签的操作命令不是标准NFC命令就要使用InCommunicateThru命令来操作,例如NTAG21x的GET_VERSION命令。可以用InCommunicateThru替代InDataExchange来使用
请求帧 | 字节长度(byte) | 说明 |
---|---|---|
Command | 1 | 0x42 |
DataOut[] | 标签命令,需要结合标签的用户手册 |
应答帧 | 字节长度(byte) | 说明 |
---|---|---|
Command | 1 | 0x43 |
Status | 1 | 状态 - 0x00 即正常 |
DataInt[] | 标签应答,需要结合标签的用户手册 |
MCU => PN532 : 00 00 FF 03 FD D4 42 60 8A 00
MCU <= PN532 : 00 00 FF 0B F5 D5 43 00 00 04 04 02 01 00 0F 03 CB 00
PN532 User Manua.pdf => 7.3.9 InCommunicateThru
NTAG21x
NTAG21x操作,基本上建立于PN532的InDataExchange和InCommunicateThru命令
NTAG21x支持的命令如下
Command | 说明 | NFC标准 | PN532操作命令 | PN532命令码 | NTAG命令码 |
---|---|---|---|---|---|
GET_VERSION | 获取卡片信息 | 非标准 | InCommunicateThru | 0x42 | 0x60 |
READ | 读 | 标准 | InDataExchange | 0x40 / 0x42 | 0x30 |
FAST_READ | 快读 | 非标准 | InCommunicateThru | 0x42 | 0x3A |
WRITE | 写 | 标准 | InDataExchange | 0x40 / 0x42 | 0xA2 |
COMP_WRITE | 标签命令,需要结合标签的用户手册 | ||||
READ_CNT | 标签命令,需要结合标签的用户手册 | ||||
PWD_AUTH | 标签命令,需要结合标签的用户手册 | ||||
READ_SIG | 标签命令,需要结合标签的用户手册 |
NTAG213/215/216.pdf => 9.1 NTAG21x command overview
NTAG21x命令 - 获取卡信息
NTAG21x用户指南称为GET_VERSION,可以获取NTAG产品版本、存储大小和其他产品数据,由于是非标准NFC命令,需要用PN532的InCommunicateThru来读
MCU => PN532 : 00 00 FF 03 FD D4 42 60 8A 00
MCU <= PN532 : 00 00 FF 0B F5 D5 43 00 00 04 04 02 01 00 0F 03 CB 00
其中00 04 04 02 01 00 0F 03是应答的数据,解析如下,可以看到这个是NTAG213卡
NTAG213/215/216.pdf => 10.1 GET_VERSION
NTAG21x命令 - 读
NTAG21x用户指南称为READ,可以读取NTAG21x寄存器信息、标准NFC命令,PN532的InCommunicateThru或InDataExchange来读,单次读取长度为16字节
请求帧 | 字节长度(byte) | 说明 |
---|---|---|
Cmd | 1 | 0x30 |
Addr | 1 | 页开始地址 |
以下示例读取NTAG卡从0页地址开始的数据,关于0页地址数据说明后面再介绍 |
MCU => PN532 : 00 00 FF 04 FC D4 42 30 00 00
MCU <= PN532 : 00 00 FF 13 ED D5 43 00 04 E1 05 68 42 1D 12 94 D9 48 00 00 E1 10 12 00 6D 00
NTAG213/215/216.pdf => 10.2 READ
NTAG21x命令 - 快读
NTAG21x用户指南称为FAST_READ,可以读取NTAG21x批量寄存器、非标准NFC命令,PN532的InCommunicateThru来读,PN532单次读取最长页数64Page,即252个字节
请求帧 | 字节长度(byte) | 说明 |
---|---|---|
Cmd | 1 | 0x3A |
StartAddr | 1 | 页开始地址 |
EndAddr | 1 | 页结束地址地址 |
以下示例读取NTAG卡从0页到2页的数据
MCU => PN532 : 00 00 FF 05 FB D4 42 3A 00 02 AE 00
MCU <= PN532 : 00 00 FF 00 FF 00 00 00 FF 0F F1 D5 43 00 04 E1 05 68 42 1D 12 94 D9 48 00 00 70 00
NTAG213/215/216.pdf => 10.3 FAST_READ
NTAG21x命令 - 写
NTAG21x用户指南称为WRITE,可以写入NTAG21x寄存器数据、标准NFC命令,PN532的InCommunicateThru或InDataExchange来写,PN532单次写入固定4个字节。
请求帧 | 字节长度(byte) | 说明 |
---|---|---|
Cmd | 1 | 0xA2 |
Addr | 1 | 要写入的页地址 |
Data | 4 | 固定4个字节 |
以下示例写NTAG卡0x04页
MCU => PN532 : 00 00 FF 08 F8 D4 42 A2 04 12 34 56 78 30 00
MCU <= PN532 : 00 00 FF 03 FD D5 43 02 E6 00
MCU => PN532 : 00 00 FF 05 FB D4 42 3A 04 04 A8 00
MCU <= PN532 : 00 00 FF 07 F9 D5 43 00 12 34 56 78 D4 00
NTAG213/215/216.pdf => 10.4 WRITE
NTAG21x命令 - 读计数
NTAG21x用户指南称为,可以得到电子标签读取数次,在读取之前必须使能NFC_CNT_EN
请求帧 | 字节长度(byte) | 说明 |
---|---|---|
Cmd | 1 | 0x39 - NFC计数命令 |
Addr | 1 | 0x02 - NFC计数地址 |
MCU => PN532 : 00 00 FF 04 FC D4 42 39 02 AF 00
MCU <= PN532 : 00 00 FF 06 FA D5 43 00 03 00 00 E5 00
NTAG213/215/216.pdf => 10.6 READ_CNT