PN532开发指南(uart)

开发环境

STM32F103C8T6   STM32f103c8t6最小系统板(typec接口)

STM32CUBEMX

PN532模块 

一、NFC简介

NFC(Near Field Communication)近场通信,是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内。其传输速度有106Kbit/秒、212Kbit/秒或者424Kbit/秒三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。

  NFC近场通信技术是由非接触式射频识别(RFID)及互联互通技术整合演变而来,在单一芯片上结合感应式读卡器、感应式卡片和点对点的功能,能在短距离内与兼容设备进行识别和数据交换。工作频率为13.56MHz.但是使用这种手机支付方案的用户必须更换特制的手机。目前这项技术在日韩被广泛应用。手机用户凭着配置了支付功能的手机就可以行遍全国:他们的手机可以用作机场登机验证、大厦的门禁钥匙、交通一卡通、信用卡、支付卡等等。

二、PN532概述

PN532是一个高度集成的非接触读写芯片,它包含80C51微控制器内核,集成了13.56MHz下的各种主动/被动式非接触通信方法和协议。
PN532传输模块支持6种不同的工作模式:
 读写器模式,支持ISO/IEC 14443A / MIFARE®机制
 读写器模式,支持 FeliCa机制
 读写器模式,支持ISO/IEC 14443B机制
 卡操作模式,支持ISO 14443A / MIFARE®机制
 卡操作模式,FeliCa机制
 ISO/IEC18092,ECM340点对点

支持主机接口:
  -SPI接口
  -I2C接口
  -串行UART

卡操作模式

读写器模式

三,读取卡的信息

1.简单用上位机读一下空白卡的种类

PN532工作模式:106 kbps type A (ISO/IEC14443 Type A)

2.寻找NFC设备,读整卡,保存为dump文件

 3.利用DUMP转txt工具提取测试卡的信息

0 扇区
0 区块: C2 99 4A 1B 0A 08 04 00 62 63 64 65 66 67 68 69
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

1 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

2 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

3 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

4 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

5 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

6 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 06 07 08 09 10 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

7 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

8 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

9 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

10 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

11 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

12 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

13 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

14 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

15 扇区
0 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2 区块: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3 区块: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

可以看出卡的UID号为:C2 99 4A 1B,不懂怎么来的,可以在这里转到另一个博客

S50非接触式IC卡性能简介(M1)

四,PN532的一些指令

打开串口助手

1.向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

如果连接没有问题的话,成功唤醒会返回以下数据

00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00

2.接下来开始寻卡,发送下列数据

00 00 FF 04 FC D4 4A 01 00 E1 00

       00 00 FF----帧头,与卡相关的所有命令都要包含该头;

  04----包长度,即“D4 4A 01 00”的长度;

  FC----包长度校验:0x100-包长度;此处0xFC=0x100-0x04;

  D4----方向标识码:数据方向是stm32(主机)至PN532

  4A----寻卡命令标识码

  01----卡数量,最大是2,PN532一次只能同时处理两张卡

  00----PN532工作模式:106 kbps type A (ISO/IEC14443 Type A)

  E1----发送的数据校验:等于:0x100-(0xff&(0xD4+0x4A+0x01+0x00))

  00----;

卡片被识别,返回下列数据

00 00 FF 00 FF 00 00 00 FF 0C F4 D5 4B 01 01 00 04 08 04 C2 99 4A 1B 0E 00 

  00 00 FF 00 FF 00----ACK(应答)指令码:千万别以为收到应答码就以为卡片正常读写了,因为不正常读写也会收到应答码哟。原因是你操作PN532芯片,只要芯片工作正常,都会有应答码的啦。所以还得往下看,看后边的命令码是否符合规则。

  00 00 FF----帧头----与卡相关的所有命令都要包含该头,所以无论是发送还是接收,都要包含帧头的。

  0C----包长度,长度12(从F4到1B正好是12)

  F4----包长度校验=0x100减去包长度

  D5----方向标识码:PN532至主控

  4B 01 01 00 04 08 04--;

  C2 99 4A 1B----卡号;卡号为8字节BCD编码,最大卡号支持16位数字。卡号小于16位数字时填充F。

  0E 00----;

此时可以看出卡的UID在这段数据的19-22位(0开始)

五,STM32串口配置

 

串口1:TX PA9/RX PA10(连接USB转TTL模块做上位机使用)

串口2:TX PA2/RX PA3(连接PN532模块)

那么根据上面命令码,很容易就写出下面命令码

#include "pn532.h"



uint8_t aRxBuffer[15];			//接收唤醒数据
uint8_t bRxBuffer[25];			//接收寻卡数据

uint8_t Enter[] = "\r\n"; //回车换行

uint8_t hello0[]="Your PN532 has woken up successfully";
uint8_t hello1[]="Your PN532 has been successfully found";
uint8_t hello2[]="UID";

uint8_t UID[4]; //存储 UID
uint8_t UID_HOST[4]={0XC2,0X99,0X4A,0X1B}; //存储 UID


/*******************************************************************************
  * @函数名称	nfc_WakeUp
  * @函数说明   PN532自带一个休眠功能,要使用PN532对NFC卡片进行读写的时候要激活一下(唤醒),一般放在程序的开头,调用一次即可。
                55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00   (24)
                成功唤醒 返回给STM32	00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00		(15)					
  * @输入参数   无
  * @输出参数   无
  * @返回参数   无
*******************************************************************************/
void nfc_WakeUp(void)//唤醒
{
	u8 adata[24]={0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0xFD,0xD4,0x14,0x01,0x17,0x00,};
	HAL_UART_Transmit(&huart2,(uint8_t *)&adata,sizeof(adata),0xFFFF); 

		
		
	HAL_UART_Receive(&huart2,(uint8_t *)&aRxBuffer,15,0xFFFF);UART2接收PN532返回给单片机的数据:       00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
	
		
		
	if (HAL_UART_GetState(&huart2) != HAL_UART_STATE_BUSY_TX)
	{
//		  HAL_UART_Transmit(&huart1, (uint8_t*)hello0,sizeof(hello0), 0xFFFF);//Your PN532 has woken up successfully
//      HAL_UART_Transmit(&huart1,(uint8_t *)&aRxBuffer,sizeof(aRxBuffer),0xFFFF);
//		  HAL_UART_Transmit(&huart1, (uint8_t*)Enter,2, 0xFFFF);
	}		
}





/*******************************************************************************
  * @函数名称	nfc_look
  * @函数说明   寻卡是涉及到卡片的第一个步骤,nfc对卡的操作都是先寻找卡的,
	              若寻不到卡,则后续的读写操作将无法进行;
								反之,若寻到卡,则后续的读写操作过程中将不再对卡片进行身份确认。
								
								寻卡命令:00 00 FF 04 FC D4 4A 01 00 E1 00 (11)
                成功找到 返回给STM32  00 00 FF 00 FF 00 00 00 FF 0C F4 D5 4B 01 01 00 04 08 04 C2 99 4A 1B 0E 00 (25)						
  * @输入参数   无
  * @输出参数   无
  * @返回参数   无
*******************************************************************************/
void nfc_look(void)//寻卡
{
	u8 i;
	u8 bdata[11]={0x00,0x00,0xFF,0x04,0xFC,0xD4,0x4A,0x01,0x00,0xE1,0x00};
	HAL_UART_Transmit(&huart2,(uint8_t *)&bdata,sizeof(bdata),0xFFFF); 

		
		
	HAL_UART_Receive(&huart2,(uint8_t *)&bRxBuffer,25,0xFFFF);
	
	
	
	if (HAL_UART_GetState(&huart2) != HAL_UART_STATE_BUSY_TX)
	{
//		  HAL_UART_Transmit(&huart1, (uint8_t*)hello1,sizeof(hello1), 0xFFFF);//"Your PN532 has been successfully found";
//      HAL_UART_Transmit(&huart1,(uint8_t *)&bRxBuffer,sizeof(bRxBuffer),0xFFFF);
		  HAL_UART_Transmit(&huart1, (uint8_t*)Enter,2, 0xFFFF);
//		
//		

									UID[0]=bRxBuffer[19];
									UID[1]=bRxBuffer[20];
									UID[2]=bRxBuffer[21];
									UID[3]=bRxBuffer[22]; 

//			
//			
//			HAL_UART_Transmit(&huart1, (uint8_t *)hello2,sizeof(hello2), 0xFFFF);

					HAL_UART_Transmit(&huart1,(uint8_t *)&UID,4,0xFFFF);

//			HAL_UART_Transmit(&huart1, (uint8_t*)Enter,2, 0xFFFF);

	}		
}





int uid_check(void)//UID核验
{
	
		for(int i = 0; i < sizeof(UID_HOST); i++)
		{
			if(UID[i]!=UID_HOST[i])
			{
         break;
			}
	  }	
		return 1;
		
}

void control(void)
{
	if(uid_check()==1)
	{
	test();
	}
}


void test(void)//方便测试
{
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
	HAL_Delay(500);
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
	HAL_Delay(500);
	printf("test成功");
}


/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}


#ifndef  __PN532_H__    
#define  __PN532_H__

#include "stm32f1xx_hal.h"
#include "gpio.h"
#include "usart.h"
#include <stdio.h>
#include <string.h>

typedef   uint32_t   u32;///32位
typedef   uint16_t   u16;///16位
typedef   uint8_t     u8;///8位

void nfc_WakeUp(void);//唤醒
void nfc_look(void);//寻卡
int uid_check(void);
void control(void);
void test(void);//方便测试





int fputc(int ch, FILE *f);
int fgetc(FILE *f);



#endif

最终实现该UID号的卡被PN532识别,并和数据库中的UID相比对,如果符合,执行test函数内的命令(本代码效果为识别成功,会向上位机发送卡号,以及测试成功字符串,LED闪烁)。

关于PN532模块的一些思考

PN532模块成本高昂(10元),后期做RFID硬件电路会考虑RC522芯片,立省80%。

同时考虑换一种单片机,大概ESP系列,配合TFT屏幕,连上阿里云做智能家居控制之类的。

又或者做一个类似学校饮水机部分,设计对卡的读写,并采用一些算法进行校验

例如 

十元:99 F2 E803 07 0D 008E 0400 BA00 00BA 0008

八元:68 28 2003 05 D7 00B2 0300 BF00 00BF 00A5

第一位是第二位到第十位异或

第三位和第四位是金额

第二位是第三位, 第四位, 第五位的和

第六位是第二位取反

第十一、十二、十三、十四位是刷卡次数

最后一位CRC校验或者其他的算法

### 回答1: PN532是一款广泛应用于NFC(Near Field Communication,近场通讯)技术的芯片。它具有高性能和可靠性,并且提供了丰富的功能和接口,方便开发人员进行硬件和软件设计。 PN532的中文手册详细介绍了芯片的功能和特性,包括工作原理,通信协议以及命令和应答的格式。手册还提供了详细的电气特性和引脚定义,以及射频接口和传输速率等参数。这些信息对于开发NFC应用非常重要,因为它们帮助开发人员了解如何使用PN532进行数据交换和通信。 手册还介绍了PN532的应用场景和使用方法。以支付系统为例,手册详细描述了如何使用PN532进行安全的NFC支付,包括读取卡片信息、验证支付数据和进行加密通信等过程。同时,手册还提供了相关的示例代码和开发工具,帮助开发人员快速上手并实现自己的应用。 此外,手册还包含了关于PN532的测试和调试信息,帮助开发人员排查故障和进行硬件调试。它提供了一些常见问题的解决方案,并介绍了常见错误的原因和解决方法。 总之,PN532的中文手册是一个非常有用的工具,它提供了全面而详细的文档和指导,帮助开发人员了解和使用这款芯片。无论是专业开发人员还是初学者,通过研究手册,他们可以更好地应用PN532开发出高效和安全的NFC应用。 ### 回答2: PN532是一款NFC(Near Field Communication,近场通信)芯片,它是一种用于无线通信和数据传输的技术。PN532芯片采用先进的射频通信技术,能够实现智能手机与其他设备、标签或卡之间的近距离交互。它是一种非触摸式的通信技术,能够实现高速、低功耗、安全可靠的数据传输。 PN532 NFC中文手册是一本提供PN532芯片相关技术和应用的指南。这个手册包含了PN532芯片的介绍、功能、电气特性、通信协议、软件驱动、命令集以及应用示例等内容。它提供了详细的技术规格和操作指南,方便开发人员进行PN532芯片的集成和应用开发PN532 NFC中文手册的主要内容包括: 1. PN532芯片的概述:介绍了芯片的主要特征和应用场景,如门禁系统、支付系统、智能标签等。 2. 电气特性:包括工作电压、功耗、射频特性等详细参数,以及相关的注意事项和建议。 3. 通信协议和接口:介绍了PN532与外部设备或主机之间的通信接口和协议,如I2C、SPI和UART等。 4. 软件驱动和命令集:提供了针对PN532芯片的软件API和命令集,开发人员可以通过这些接口进行开发和控制。 5. 应用示例:包含了一些常见的应用案例,如读写NFC标签、NFC支付、NFC门禁等,方便开发人员进行参考和学习。 PN532 NFC中文手册对于开发人员来说是一本重要的参考资料,它能够帮助他们了解PN532芯片的功能和特性,掌握相关的开发技术和应用方法,从而更好地开发和应用NFC技术。读者可以通过阅读手册,了解PN532芯片的原理和工作方式,学习如何使用PN532芯片开发各种NFC应用。 ### 回答3: PN532是一种高性能近场通信(NFC)芯片,广泛应用于各种NFC设备中。PN532 NFC中文手册是对PN532芯片的详细说明和操作指南的文档。 该手册包括PN532芯片的基本信息、功能特性、接口定义、通信协议等内容。它提供了广泛的指令集和命令格式,涵盖了PN532的各种功能,如读写NFC标签、进行P2P通信、支持各种NFC模式等等。 手册中会介绍PN532的各种寄存器和寄存器配置方法,以及相应的读写操作。此外,手册还会介绍PN532的工作模式和通信协议,包括ISO/IEC 14443 Type A和B、FeliCa、ISO/IEC 15693等等。 PN532 NFC中文手册还会介绍PN532与各种主控芯片(如Arduino、Raspberry Pi等)的连接方法和操作示例。它会详细说明PN532的软件开发接口(API)和相关的驱动程序,方便开发者快速集成PN532芯片到自己的应用中。 通过PN532 NFC中文手册,用户可以深入了解PN532芯片的原理和功能,掌握PN532的使用方法和开发技巧。用户可以根据手册提供的资料,结合自己的需求,开发出各种功能丰富的NFC应用。 总之,PN532 NFC中文手册是PN532芯片的一份详尽说明文档,它提供了全面的信息,帮助用户快速上手并开发出高性能的NFC应用。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜浩鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值