NFC之PN532使用_pn532简介

● 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(成功)

ponse

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(成功)

<think>好的,我现在需要帮助用户查找关于PN532单片机结合使用的教程。根据用户提供的引用内容,首先得回顾已有的信息。引用[1]到[4]提到了PN532通过串口与主机通信,数据格式固定,使用通用信息帧,以及单片机配置串口即可控制。这说明用户可能已经了解PN532的基本通信方式,现在需要具体的教程步骤。 用户的问题是关于PN532单片机使用教程,所以需要整理出具体的步骤和资源。首先,我应该从硬件连接开始,比如串口接线,电源等,确保单片机PN532正确连接。然后,通信协议的配置,比如波特率设置,数据帧结构,这在引用[3]中提到了固定格式,需要详细说明如何构造命令帧。 接下来是初始化步骤,可能包括发送唤醒指令,设置工作模式等,引用[1]和[2]提到ACK响应和通用信息帧,这里需要强调正确接收和处理PN532的响应。然后是具体的功能实现,比如读卡、写卡,这部分需要示例代码,用户提供的引用中有Python示例,但单片机可能用C语言,需要调整代码结构。 资源方面,引用[4]提到单片机配置串口,可以推荐Arduino或STM32的教程链接。常见问题部分需要涵盖通信失败、数据解析错误等,引用[3]和[1]提到数据格式的重要性,这里要提醒用户检查格式是否正确。 还要确保回答结构清晰,分步骤说明,引用相关部分支持每个步骤,比如硬件连接引用[4],数据格式引用[3],响应处理引用[1][2]。同时,用户可能需要示例代码,但用户提供的引用中有Python代码,可能需要转换成单片机适用的C代码示例,或者引导用户查找具体平台的教程。 最后,生成的相关问题要围绕用户可能遇到的后续问题,比如硬件连接问题、通信协议细节、调试方法等,帮助用户深入解决问题。需要检查是否有遗漏的步骤,比如电源配置、波特率设置,或者常见的错误处理,确保回答全面。</think>以下是关于PN532单片机结合使用的分步教程说明,整合了引用资料中的技术要点: ### 一、硬件连接步骤 1. **串口引脚对接** PN532的TX/RX引脚需与单片机的RX/TX交叉连接(引用[4]),例如: ``` PN532_TX → 单片机_RX PN532_RX → 单片机_TX VCC → 3.3V/5V(根据模块型号) GND → GND ``` 2. **通信模式选择** 通过模块背面的DIP开关设置为UART模式(通常为SW1=OFF, SW2=ON) ### 二、通信协议配置 1. **波特率设置** 默认波特率为115200(引用[2]),可通过AT指令修改: ```c // 发送设置波特率命令帧(示例) uint8_t baud_cmd[] = {0x55, 0x00, 0x08, 0x02, 0x00, 0xC2, 0x01}; // 9600bps uart_send(baud_cmd, sizeof(baud_cmd)); ``` 2. **数据帧结构** 遵循通用信息帧格式(引用[1][3]): ``` | 前导码 | 起始码 | 长度 | 数据域 | 校验和 | | 0x00 | 0x00FF | LEN | DATA | SUM | ``` ### 三、基础功能实现流程 1. **模块初始化** ```c // 发送唤醒命令 uint8_t wakeup[] = {0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; uart_send(wakeup, sizeof(wakeup)); // 等待ACK响应(引用[1]) while(!uart_receive_ack()); // 检测0x00 0x00 0xFF 0x00 0xFF 0x00 ``` 2. **读卡操作示例** ```c // ISO14443A读卡指令 uint8_t read_cmd[] = {0x00, 0x00, 0xFF, 0x04, 0xFC, 0xD4, 0x4A, 0x01, 0x00, 0xE1, 0x00}; uart_send(read_cmd, sizeof(read_cmd)); // 解析返回的卡UID(引用[3]) if(response[6] == 0xD5 && response[7] == 0x4B){ uint8_t uid_length = response[12]; uint8_t uid[uid_length]; memcpy(uid, &response[13], uid_length); } ``` ### 四、开发资源推荐 1. **官方文档** 《PN532用户手册》第4章UART通信协议(引用[3]数据格式说明) 2. **开源项目参考** GitHub搜索"PN532 Arduino Library"查看核心驱动文件`pn532_uart.h` 3. **调试工具** 建议先用USB-UART工具配合串口调试助手验证通信(引用[2]) ### 五、典型问题排查 1. **无响应故障** → 检查硬件接线是否反接 → 测量模块供电电压(3.3V模块接5V会损坏) → 使用逻辑分析仪抓取波形(引用[4]硬件调试建议) 2. **数据校验错误** ```c // 校验和计算方法示例 uint8_t checksum(uint8_t* data, int len){ uint8_t sum = 0; for(int i=0; i<len; i++){ sum += data[i]; } return (0x100 - sum) & 0xFF; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值