NFC之PN532使用

作者:华清远见讲师

一、简介

PN532是一个高度集成的非接触读写芯片,它包含80C51微控制器内核,集成了13.56MHz下的各种主动/被动式非接触通信方法和协议。

工作模式:

● 读写器模式,支持ISO/IEC 14443A / MIFARE®机制

● 读写器模式,支持 FeliCa机制

● 读写器模式,支持ISO/IEC 14443B机制

● 卡操作模式,支持ISO 14443A / MIFARE®机制

● 卡操作模式,FeliCa机制

● ISO/IEC18092,ECM340点对点

特性

● 带40 kB ROM和1 kB RAM的80C51微控制器内核

● 高度集成的模拟电路,解调和译码响应

● 输出缓冲驱动器通过最少量的外部无源器件连接天线

● 集成了RF场检测器

● 集成了数据模式检测器

● 支持ISO/IEC 14443A / MIFARE®

● 只在读写器模式中支持ISO/IEC 14443B

● 在读写器模式中典型工作距离超过50mm,具体距离由天线尺寸、调谐和电源决定

● 在NFCIP-1模式下工作距离高达50mm,具体视天线的尺寸、调谐以及电源而定

● 在卡操作模式中典型工作距离约为100mm,具体距离由天线尺寸、调谐和外部场强度决定

● 在读写器模式中,支持Mifare Classic加密,可支持212 kbit/s和424 kbit/s两种更高数据传输速率

● FeliCa模式下,支持106kbit/s 、212kbit/s和424kbit/s的通信波特率

● 集成了NFCIP-1的RF接口,传输速率高达424kbit/s

● 支持主机接口:

-SPI接口

-I2C接口

-串行UART

● 灵活的中断模式

● 低功耗模式 一硬件掉电模式 一软件掉电模式

● 当器件处于掉电模式时能够通过I2C、HSU和SPI接口自动唤醒

● 可编程定时器

● 石英晶体振荡器

● 2.7V~5.5V的电源

二、通信接口

PN532和主机之间有三种方式进行通信:I2C 、SPI、 HSU,这样几乎满足了所有的主控芯片。下图是通信方式的选择

需要注意的是:

SPI只能选择工作模式0。也就是说SPI的空闲电平为 高电平、数据总是在SCK的第一个边沿采样、数据发送格式总是LSB在前。只要NSS引脚拉低,芯片就会被唤醒。

HSU高速串口的默认配置是:8个数据位,1个停止位,LSB先发送,波特率115200,无校验

I2C模式下,默认的从机地址是0x48,先发送MSB,最高支持速率400KHz

三、数据包格式

PN532与主机之间的通信数据有固定的格式,只要我们按照规定的格式发送数据,就可以完全控制PN532。这样大大提高我们开发的效率

1、 正常数据包

00 序列头

00 FF 起始号

LEN 数据包的长度,包含TFI

LCS 数据长度校验和, LEN+LCS=0

TFI 命令

PD0 PD1 … PDn 数据

DCS 数据校验和 TFI+PD0+…PDn = 0

00 序列结尾

2、 PN532应答包

00 序列头

00 FF 起始号

00 FF 应答包

00 结束序列

3、 非应答包

00 序列头

00 FF 起始号

FF 00 没有应答

00 结束序列

4、 加长数据包

正常的情况下,只能发送256个字节的数据,PN532提供一种特殊的格式,可以发送更多的数据。当然我们在使用的时候要依据实际的情况去选择

00 序列头

00 FF 起始号

FF 正常模式下的包长度,这里是FF

FF 正常模式下的包长度校验和,这里是FF

LENM 数据包的长度高字节,

LENL 数据包的长度低字节,包含TFI

LCS 数据长度校验和,LENM + LENL +LCS=0

TFI 命令

PD0 PD1 … PDn 数据

DCS 数据校验和 TFI+PD0+…PDn = 0

00 序列结尾

四、唤醒PN532

将芯片唤醒必须满足以下3个条件

1)PVDD引脚拉高

2)I2C模式下发送地址48h,SPI模式下将NSS拉低,串口模式下的其实数据头必须为0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0xFD,0xD4,0x14,0x01,0x17,0x00

3)主机必须发送命令14 02 00(虚拟模式)或者14 01(正常模式)

五、读写S50卡片过程

1、唤醒模块,主机发送命令

0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0xFD,0xD4,0x14,0x01,0x17,0x00

模块回应

0x00,0x00,0xFF,0x02,0xFE,0xD5,0x15,0x16,0x00

在唤醒模块的过程中,数据的包头有些特殊,而这个包头是有芯片手册中找到的。

注意,为了简略,下面的命令只包含数据包格式中的TFI\DATA,其他的请读者自行加上

2、扫描卡片并获取到卡片ID,主机发送

0xd4,0x4A(列出卡片),0x02(数量最多2个),0x00(波特率)

Response

0xd5,0x4b,0x02两个设备

0x01(一号设备),0x04,0x00,0x08,0x04(长度),id1,id2,id3,id4,

0x02(二号设备),0x04,0x00,0x00,0x04(长度),id1,id2,id3,id4,

3、验证A秘钥,主机发送

0xd4,0x40(交换数据),0x01(1号设备),0x60(验证A),0x03(地址)

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF(keyA),0xC1,0x32,0x77,0x03(id)

Response

0xd5,0x41,0x00(成功)

4、验证B秘钥,主机发送

0xd4,0x40(交换数据),0x01(1号设备),0x61(验证B),0x03(地址)

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF(keyB),0xC1,0x32,0x77,0x03(id)

Response

0xd5,0x41,0x00(成功)

5、读卡,主机发送

0xd4,0x40(交换数据),0x01(1号设备)1,0x30(读16Bytes),0x02(地址)

Response

0xd5,0x41,0x00(成功),byte1,btyte2…

6、写卡,主机发送

0xd4,0x40(交换数据),0x01(1号设备)1,0xA0(写16Bytes),0x02(地址),Data1,data2…

Response

0xd5,0x41,0x00(成功)

03-17
### PN532 NFC模块的使用说明、驱动与开发文档 #### 1. 模块概述 PN532 是一款高度集成的 NFC 和 RFID 控制器芯片,支持多种非接触式通信方式和协议。该模块内置了一个 80C51 微控制器内核,并能够在 13.56 MHz 下运行,兼容 ISO/IEC 14443 A/B 类型以及 MIFARE 协议等多种标准[^3]。 #### 2. Windows 下 libnfc 的配置与使用 为了在 Windows 平台上操作 PN532 模块并实现完整的 NFC 功能,可以借助 `libnfc` 库完成开发工作。以下是具体流程: - **安装依赖环境** 需要先下载并编译适合目标平台版本的 `libnfc` 库文件。可以从官方仓库获取最新源码,并按照其提供的构建指南进行设置[^1]。 - **硬件连接** 将 PN532 模块通过 SPI 或 I²C 接口接入计算机 USB 转串口适配器中;或者直接利用 Arduino 板载接口来简化电路设计过程。 - **初始化设备** 编写一段简单的 C/C++ 测试代码以确认基本功能正常运作情况如下所示: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <nfc/nfc.h> int main(int argc, char *argv[]) { nfc_device *pnd; nfc_context *context; nfc_init(&context); if (NULL == context) { printf("Unable to init libnfc\n"); exit(EXIT_FAILURE); } const size_t iDeviceCount = nfc_list_devices(context, NULL, 0); if(iDeviceCount){ pnd = nfc_open(context, NULL); // Open first found device. if(pnd != NULL){ printf("NFC reader: %s opened\n", nfc_get_device_name(pnd)); /* Add your application logic here */ nfc_close(pnd); }else{ printf("No supported devices found.\n"); } } nfc_exit(context); return EXIT_SUCCESS; } ``` 此脚本展示了如何打开已检测到的第一个可用读卡器实例,并打印出名称信息作为调试反馈。 #### 3. STM32 平台上的 PN532 驱动程序 对于嵌入式系统而言,在 ARM Cortex-M 架构处理器(如 STM32 系列)上部署 PN532 更加常见。为此目的专门定制了一套开源解决方案——即上述提到过的 GitCode 存储库链接指向的内容[^2]。其中包含了详细的 API 文档描述以及实际案例演示片段供参考学习之用。 开发者可以根据自身需求调整参数选项从而满足特定应用场景的要求。例如修改波特率设定值以便适应不同传输速率条件下的稳定通讯性能表现等方面均有所涉及。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值