PN532 NFC读卡器使用指南
不同的NFC卡片,M1卡就是IC卡


PN532 NFC读卡器与串口助手协同使用指南
PN532是一款高性能NFC控制器芯片,支持多种RFID通信标准,包括ISO/IEC 14443 A/B、MIFARE和FeliCa等。通过串口助手与PN532模块连接,用户可以实现对NFC卡片内容的读取。这种读取过程遵循特定的通信协议和数据帧格式,需要按照唤醒模块→寻卡→读取卡片内容的流程进行操作。正确配置串口参数、掌握PN532指令格式及响应解析,是成功读取卡片内容的关键。本文将详细阐述如何利用串口助手通过PN532读取卡片内容的完整流程。
一、PN532模块与串口助手的硬件连接配置
PN532模块与串口助手连接需要特定的硬件设置。首先,需确认PN532模块的工作模式。PN532支持SPI、I2C和UART三种通信接口,用户需通过模块上的硬件开关选择UART模式。通常,模块上的SW1和SW2拨动开关需设置为SW1=OFF、SW2=ON以启用UART接口。
硬件连接方面,PN532的TX引脚应连接到USB转串口模块的RXD引脚,PN532的RX引脚连接到USB转串口模块的TXD引脚,形成交叉连接。供电方面,PN532模块支持3.3V至5.5V的供电电压,因此需确保USB转串口模块的供电与之匹配。地线(GND)连接至关重要,必须确保可靠连接以避免信号干扰。由于PN532使用TTL电平(3.3V或5V),而电脑串口通常为RS232电平(±12V),因此必须通过USB转TTL模块进行电平转换。市场上常见的USB转TTL模块如CH340、CP2102等均内置电平转换功能,无需额外添加电平转换芯片。
在连接硬件前,建议先检查模块是否支持DTR/RTS信号唤醒功能。部分PN532模块支持通过DTR信号自动唤醒,这可以通过在串口助手中启用硬件流控选项实现。若模块不支持DTR唤醒,则必须手动发送唤醒指令来激活模块。
二、PN532与串口助手的通信参数设置
在串口助手中配置PN532通信时,必须确保以下参数设置正确:
波特率设置:PN532模块的UART默认波特率为115200 bps,这是所有标准PN532模块的出厂设置。若需修改波特率,可通过特定指令实现,但通常建议保持默认设置以简化操作。
数据位设置:PN532使用8位数据位,这是标准的UART配置。
停止位设置:PN532采用1位停止位,同样符合标准UART配置。
校验位设置:PN532通信不使用任何校验位,因此应设置为"无校验"。
串口选择:在串口助手中,需选择正确的串口号(如COM3、COM4等),这取决于USB转串口模块在电脑上的实际连接端口。
发送模式设置:PN532指令需以十六进制格式发送,因此在串口助手中应选择"发送十六进制"选项,并确保数据以空格分隔格式输入。
接收模式设置:同样,PN532的响应数据也是十六进制格式,因此在串口助手中应选择"显示十六进制"选项,以便正确解析模块返回的信息。
工具选择建议:虽然多种串口工具均可用于PN532通信,但RealTerm因其直观的十六进制发送/接收界面和良好的兼容性而被推荐使用。在RealTerm中,用户可在"Port"选项卡中配置串口号和通信参数,在"Send"选项卡中设置十六进制发送模式,在"Display"选项卡中配置十六进制显示格式。
三、PN532数据帧格式与通信协议解析
PN532与主机之间的通信遵循严格的帧格式规范。理解这种格式对于正确构造和解析指令至关重要。PN532数据帧主要包含以下字段:
前序:固定为两个0x00字节,用于帧同步。
包头:固定为0x00和0xFF字节,表示数据帧的开始。
数据长度:表示后续数据的总长度(包含TFI)。
长度校验和:LCS = 0x100 - 数据长度。
传输方向标识:TFI,D4表示主机→PN532,D5表示PN532→主机。
数据:包含命令码和相关参数。
数据校验和:DCS = 0xFF - (包长度 + TFI + 数据总和) % 0xFF。
尾序:固定为一个0x00字节,表示数据帧的结束。
对于长帧(数据超过255字节),帧格式略有不同:
前序:固定为四个0x00字节。
包头:固定为0x00、0xFF、0xFF、0xFF字节。
数据长度高字节:LENH,表示数据长度的高位。
数据长度低字节:LENL,表示数据长度的低位。
长度校验和:LCS = 0x100 - (LENH + LENL)。
传输方向标识:TFI,D4表示主机→PN532,D5表示PN532→主机。
数据:包含命令码和相关参数。
数据校验和:DCS = 0xFF - (LENH + LENL + TFI + 数据总和) % 0xFF。
尾序:固定为一个0x00字节,表示数据帧的结束。
数据校验和计算是确保指令正确性的关键。DCS的计算规则为:将包长度、TFI和所有数据字节相加,然后取其补码(0xFF - sum % 0xFF)。例如,对于指令D4 4A 02 00,计算DCS为:0xFF - (0x04 + 0xD4 + 0x4A + 0x02 + 0x00) % 0xFF = 0xFF - 0x11E % 0xFF = 0xFF - 0x1E = 0xE1。
PN532响应帧也遵循特定格式:
ACK应答帧:00 00 FF 00 FF 00,表示模块已成功接收指令。
数据帧:00 00 FF [数据长度] [数据长度校验] D5 [命令码] [数据] [数据校验] 00。
错误帧:00 00 FF FF 00 00,表示模块未正确接收指令。
| 帧类型 | 格式 | 说明 |
|---|---|---|
| 标准帧 | 00 00 FF [LEN] [LCS] [TFI] [PD0-PDn] [DCS] 00 | 用于主机与PN532之间的常规指令传输 |
| 长帧 | 00 00 FF FF [LENH] [LENL] [LCS] [TFI] [PD0-PDn] [DCS] 00 | 用于传输超过255字节的数据 |
| ACK帧 | 00 00 FF 00 FF 00 00 00 FF [状态码] [其他信息] 00 | 模块接收到指令后的确认响应 |
四、PN532模块唤醒指令的构造与发送
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
其中:
55 55 00 00× 4:唤醒头,固定格式,用于激活模块。FF 03 FD:唤醒命令的前导部分。D4 14 01 17:设置模块为正常模式(D4表示主机→PN532,14表示设置命令,01表示参数,17为校验和)。00:帧尾。
发送唤醒指令后,若模块正常工作,应返回以下响应:00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
其中:
00 00 FF 00 FF 00:ACK应答帧,表示模块已接收指令。00 00 FF:数据帧头。02 FE:数据长度和校验。D5 15 16:响应命令码和状态信息。00:帧尾。
若唤醒指令发送后无响应,需检查硬件连接是否正确,尤其是地线连接和串口交叉接线。此外,部分PN532模块支持通过DTR信号唤醒,可通过在串口助手中启用硬件流控选项(如勾选"RTS/DTR"控制)实现。
五、PN532寻卡指令的构造与卡片UID获取
模块唤醒后,下一步是发送寻卡指令以检测附近的NFC卡片。寻卡指令的构造取决于目标卡片类型和需要检测的卡片数量。
寻卡指令的基本格式为:00 00 FF [数据长度] [LCS] D4 4A [卡片数量] [工作模式] [DCS] 00
其中:
00 00 FF:帧头,表示主机→PN532。数据长度:表示后续数据的总长度(D4、4A、卡片数量、工作模式)。LCS:长度校验和,LCS = 0x100 - 数据长度。D4:方向标识码,表示主机→PN532。4A:寻卡命令标识码。卡片数量:表示一次最多检测的卡片数量(最大为2)。工作模式:表示使用的通信协议(0x00为ISO14443A 106kbps)。DCS:数据校验和,DCS = 0xFF - (数据长度 + D4 + 4A + 卡片数量 + 工作模式) % 0xFF。00:帧尾。
寻卡指令示例(检测1张ISO14443A卡片):00 00 FF 04 FC D4 4A 01 00 E1 00
其中:
04:数据长度为4字节(D4、4A、01、00)。FC:LCS = 0x100 - 0x04 = 0xFC。01:卡片数量为1。00:工作模式为ISO14443A 106kbps。E1:DCS = 0xFF - (0x04 + 0xD4 + 0x4A + 0x01 + 0x00) % 0xFF = 0xFF - 0x11F % 0xFF = 0xFF - 0x1F = 0xE0(但实际示例中为E1,可能存在计算差异)。
发送寻卡指令后,若检测到卡片,PN532会返回以下格式的响应:00 00 FF 00 FF 00 00 00 FF [数据长度] [数据长度校验] D5 4B [卡片数量] [卡片类型] [卡片容量] [UID长度] [UID数据] [其他信息] 00
其中:
D5 4B:表示PN532返回的数据帧,命令码为4B。卡片类型:表示卡片支持的协议(如0x04为ISO14443A)。UID长度:表示卡片UID的长度(如4字节)。UID数据:表示卡片的唯一标识符,长度根据卡片类型而定。
对于MIFARE Classic卡片,UID通常为4字节,位于响应帧的第13至16字节位置。例如,响应帧00 00 FF 00 FF 00 00 00 FF 0C F4 D5 4B 01 01 00 04 08 04 6C 5B 74 6D 26 00中,卡片UID为6C 5B 74 6D。
若寻卡指令发送后无响应,需检查卡片是否放置在读卡器附近,以及是否已正确唤醒模块。此外,部分卡片可能需要特定的寻卡模式参数,如FeliCa卡片需将工作模式参数设为0x01,而非ISO14443A的0x00。
六、PN532读取卡片内容的指令构造与响应解析
成功获取卡片UID后,下一步是读取卡片存储的具体内容。读取卡片内容前,通常需要先进行卡片认证(特别是对于加密的MIFARE Classic卡片),然后才能读取数据块。
1. MIFARE Classic卡片读取流程
MIFARE Classic卡片读取需遵循以下步骤:
密钥认证指令:00 00 FF 0F F1 D4 40 01 60 [认证地址] [6字节密钥] [4字节UID] 00
其中:
60:表示KeyA认证(KeyB为61)。认证地址:表示需要认证的扇区地址,计算公式为扇区号 × 4 + 块号。例如,扇区0的块3地址为0x03。6字节密钥:表示用于认证的密钥,MIFARE Classic默认密钥为FF FF FF FF FF FF。4字节UID:表示卡片的唯一标识符。
读取数据块指令:00 00 FF 05 FB D4 40 01 30 [块地址] [DCS] 00
其中:
30:表示读取16字节数据块。块地址:表示要读取的块地址(0-63)。DCS:数据校验和,计算方式同上。
响应数据解析:
成功响应以D5 41开头,表示PN532返回的数据帧,命令码为41。数据部分从第3字节开始,共16字节。例如,响应帧00 00 FF 13 ED D5 41 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 72 00中,卡片数据为00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F。
2. FeliCa卡片读取流程
对于FeliCa卡片,读取流程有所不同:
读取卡片指令:00 00 FF 10 F0 D4 42 01 [IDm] [system code] [页号] [页数] [DCS] 00
其中:
IDm:表示卡片的IDm(卡片ID),需从寻卡响应中获取。system code:表示卡片的系统代码。页号:表示要读取的起始页号。页数:表示要读取的页数。
响应数据解析:
FeliCa卡片响应帧以D5 42开头,表示PN532返回的数据帧,命令码为42。数据部分包含卡片的IDm、system code和所读取的页数据。页数据从特定位置开始,长度根据卡片类型而定。
八、常见问题与解决方案
在使用PN532模块读取卡片内容时,可能会遇到以下常见问题:
1. 模块无响应
- 可能原因:模块未正确唤醒、硬件连接错误或波特率设置不正确。
- 解决方案:
- 确保已正确发送唤醒指令或启用DTR唤醒。
- 检查硬件连接,尤其是地线和串口交叉接线。
- 验证串口助手的波特率设置为115200。
2. 寻卡指令无响应
- 可能原因:卡片未放置在读卡器附近、卡片类型不支持或参数设置错误。
- 解决方案:
- 确保卡片紧贴读卡器(距离不超过20mm)。
- 检查卡片类型(如ISO14443A或FeliCa)并相应调整寻卡指令参数。
- 验证寻卡指令的校验和计算是否正确。
3. 认证失败
- 可能原因:密钥不正确、认证地址计算错误或卡片未加密。
- 解决方案:
- 确认使用的密钥(KeyA或KeyB)是否正确。
- 重新计算认证地址(扇区号 × 4 + 块号)。
- 若卡片未加密,可直接跳过认证步骤并读取数据。
4. 数据校验失败
- 可能原因:指令构造错误、校验和计算不正确或响应数据解析错误。
- 解决方案:
- 重新检查指令的每个字段是否符合协议要求。
- 重新计算校验和(LCS和DCS)。
- 根据卡片类型确定响应数据的解析方式。
5. 读取数据错误
- 可能原因:块地址计算错误、卡片存储格式不熟悉或卡片损坏。
- 解决方案:
- 确认目标块地址是否正确(需根据卡片类型确定)。
- 研究卡片的具体存储格式(如MIFARE Classic的扇区结构)。
- 尝试读取其他块或更换卡片测试。



