国内网上逛了一圈,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("rn开始rn");
while(1)
{
PCout(13)=!PCout(13);
if(awaken_nfc())
{
//printf("检查到NFC设备rn");
if(find_card(uid))
{
printf("检测到卡号:%x %x %x %xrn",uid[0],uid[1],uid[2],uid[3]);
if(check_card(uid,check,11))
{
printf("校验成功rn");
block1[0]=0x15;
n=8;
// if(write_block(block1,n))
// {
// printf("写卡成功rn");
// }
// block1[0]++;
// if(write_block(block1,n+1))
// {
// printf("写卡成功rn");
// }
// block1[0]++;
// if(write_block(block1,n+2))
// {
// printf("写卡成功rn");
//
// }
// block1[0]++;
// if(write_block(check0,n+3))
// {
// printf("写卡成功rn");
//
// }
if(read_block(block,n))
{
printf("读卡成功:%drn",n);
for(i=0;i<16;i++)
printf("%x ",block
);
printf("rn");
}
if(read_block(block,n+1))
{
printf("读卡成功:%drn",n+1);
for(i=0;i<16;i++)
printf("%x ",block);
printf("rn");
}
if(read_block(block,n+2))
{
printf("读卡成功:%drn",n+2);
for(i=0;i<16;i++)
printf("%x ",block);
printf("rn");
}
if(read_block(block,n+3))
{
printf("读卡成功:%drn",n+3);
for(i=0;i<16;i++)
printf("%x ",block);
printf("rn");
}
}
else
{
printf("校验失败rn");
}
}
}
delay_ms(100);
}
}
结果:
源码:可以自己连接试一下stm32f103c8t6 + PN532
https://download.csdn.net/download/hes_c/11112051
有了这个驱动,你想做个电子感应锁,刷卡消费系统啥的都不是问题。
想破解别人的卡,当然也可以,但是你得知道对方所有块的加密方式,你也可以写个扫描自己去破解,这个还是有难度了。
对于不加密的一些卡,随你怎么玩啦。