NFC-PN532串口驱动编写

本文详细介绍了STM32控制NFC PN532模块进行读写操作的方法,包括串口通信、卡片寻址、数据校验等关键步骤。提供了STM32F103C8T6+NFC PN532开发实例,适合制作电子感应锁、刷卡消费系统等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   国内网上逛了一圈,NFC-PN532的质料并不多,dataset也是随便介绍了下,开发手册还没有找到。

在各大论坛和百科的上找到的质料几乎都是一摸一摸的,要么发几个串口指令,要么就是开源驱动库的上位机。

想要弄懂这玩意到底怎么用的,确实不容易。

   我总结了一些使用方法,和驱动编写,当然这个模块有很多的功能,这边只会涉及到对卡片的读写操作。

下面所讲只适用于串口通信模式。

1整体功能和简介: 串口默认115200

 使用stm32控制PN532读写操作,nfc功能不就是为了读写嘛,完成这些使用我觉得应该差不多了。

一般的卡内存都是1K大小,当然也有其它的,不常见。

FUID  只能写一次UID         (这个网上看到的,没有验证过)

CUID 可以重复擦写UID       (这个网上看到的,没有验证过)

 

2工作流程:

以上就是一个完整的对卡读写过程。

程序也会从这个流程去实现。,最基本的函数就是向串口发送指令,当然发送指令这里有讲究,需要去计算校验值,公式前面有写,然后通过这个函数来实现唤醒,寻卡,校验,读写。

计算校验和的函数:这些printf是用来测试用的

每个驱动都是先发送指令,然后串口会接收到返回指令,再去解析返回的指令,如果是成功的指令就拆解有效数据,则否。

具体发送和拆解就不一一讲解了,有兴趣的可以下载源码看一下,我这边主要说一下思路和注意的坑,通信规则。

看看主函数:无视其它文件,驱动内容都写在NFC_PN532里面,这里是校验第3扇区,读取其中内容。

#include "stm32f10x.h"

#include "led.h"
#include "systick.h"
#include	"serial.h"
#include "24l01.h"
#include "tx_rx_report.h"
#include "1_V4_data.h"
#include "timer.h"
#include "tim3_pwm4.h"

#include "string.h"

#include "NFC_PN532.h"

LED led1('C',13);



int main(void)
	
{
	
	u8 uid[4];
	u8 block[16];
	u8 block1[16]={0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1};
	
	u8 check0[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7,0x80,0x69,0xff,0xff,0xff,0xff,0xff,0xff};
	
	u8 check[]={0xff,0xff,0xff,0xff,0xff,0xff};
	
	u8 check1[]={0x88,0x15,0x14,0x13,0x12,0x11};
	
	u8 check2[]={0x64,0x98,0x8d,0x22,0x30,0x63};
	u8 i=0;
   u8 n=0;
	
   serial1_init(115200); //串口初始化为 115200
	
	 serial3_init(115200); //串口初始化为 115200
	
	printf("\r\n开始\r\n");


 

  while(1)
   {
		 
		
		 
		 PCout(13)=!PCout(13);
	
		
		if(awaken_nfc())
		{
			//printf("检查到NFC设备\r\n");
			if(find_card(uid))
			{
				printf("检测到卡号:%x %x %x %x\r\n",uid[0],uid[1],uid[2],uid[3]);
				
				if(check_card(uid,check,11))
				{
					printf("校验成功\r\n");
					
					block1[0]=0x15;
					n=8;
//					if(write_block(block1,n))
//					{
//						printf("写卡成功\r\n");
//					}
//						block1[0]++;
//					if(write_block(block1,n+1))
//					{
//						printf("写卡成功\r\n");
//					}
//						block1[0]++;
//					if(write_block(block1,n+2))
//					{
//						printf("写卡成功\r\n");
//					
//					}
					
					
//							block1[0]++;
//					if(write_block(check0,n+3))
//					{
//						printf("写卡成功\r\n");
//					
//					}
					
					
					
						if(read_block(block,n))
						{
							printf("读卡成功:%d\r\n",n);
							for(i=0;i<16;i++)
							 printf("%x ",block[i]);
							printf("\r\n");
							
							
						}
					
					if(read_block(block,n+1))
						{
							printf("读卡成功:%d\r\n",n+1);
							for(i=0;i<16;i++)
							 printf("%x ",block[i]);
							printf("\r\n");
							
							
						}
						if(read_block(block,n+2))
						{
							printf("读卡成功:%d\r\n",n+2);
							for(i=0;i<16;i++)
							 printf("%x ",block[i]);
							printf("\r\n");
							
							
						}
						
						if(read_block(block,n+3))
						{
							printf("读卡成功:%d\r\n",n+3);
							for(i=0;i<16;i++)
							 printf("%x ",block[i]);
							printf("\r\n");
							
							
						}
					
					
				}
				else
				{
					printf("校验失败\r\n");
				}
				
			}
		
	}
		 
		
		 
		 delay_ms(100);
	
   }

		
}

结果:

源码:可以自己连接试一下stm32f103c8t6 + PN532

https://download.youkuaiyun.com/download/hes_c/11112051

有了这个驱动,你想做个电子感应锁,刷卡消费系统啥的都不是问题。

想破解别人的卡,当然也可以,但是你得知道对方所有块的加密方式,你也可以写个扫描自己去破解,这个还是有难度了。

对于不加密的一些卡,随你怎么玩啦。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值