PN532开发指南(uart)

这篇具有很好参考价值的文章主要介绍了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

pn532,RFID安全,STM32,网络,安全,stm32,嵌入式硬件,单片机

卡操作模式

pn532,RFID安全,STM32,网络,安全,stm32,嵌入式硬件,单片机

读写器模式

三,读取卡的信息

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

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

pn532,RFID安全,STM32,网络,安全,stm32,嵌入式硬件,单片机

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

pn532,RFID安全,STM32,网络,安全,stm32,嵌入式硬件,单片机

 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的一些指令

打开串口助手

pn532,RFID安全,STM32,网络,安全,stm32,嵌入式硬件,单片机

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串口配置

pn532,RFID安全,STM32,网络,安全,stm32,嵌入式硬件,单片机

 pn532,RFID安全,STM32,网络,安全,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校验或者其他的算法文章来源地址https://www.toymoban.com/news/detail-780125.html

到了这里,关于PN532开发指南(uart)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux文件比较工具diff-关于参数-pN的设置方法

    非纯文本文件比较可用cmp命令 第一:利用diff创建分析文件,处理补丁(patch)功能的文件 案例:多数用于同一软件的不同版本之间,比如比较配置文件和源文件的区别,生成补丁文件,执行更新,或者恢复操作 以’行‘为单位进行比较,多数用在同一文件新旧版本的比较上

    2024年01月19日
    浏览(52)
  • 使用MATLAB生成任何需要的伪随机码(PN码)

    目录 一. 引言 二. 用matlab生成伪随机序列                 伪随机码(PN码),只包含0和1,是一种人为随机创造的随机序列。应用范围广,通信中经常使用到,比如伪码测距等。为了验证所给的生成函数是否正确,经常需要使用matlab仿真查看所生成的随机序列。         下

    2024年02月11日
    浏览(48)
  • 【C++系列Pn】引用——背刺指针的神秘刺客“吃我一棍”

    前言 大家好吖,欢迎来到 YY 滴 C++系列 ,热烈欢迎! 如标题所示,本章主要内容主要来侃侃“ 引用 ”这个刺客!如下就是大纲啦~ 引用,即 取别名 。它的最大特点是编译器 不会为引用变量而开辟空间 ,他们 共用同一块 空间。   1. 引用使用时必须要 初始化 。 2. 引用在初

    2024年02月06日
    浏览(40)
  • CMOS与TTL(上):PN结、MOS管、三极管

    如果只看一个芯片的外观,是无法区分TTL和CMOS的。因为它们是按照芯片的制作工艺来分类的。 CMOS内部集成的是MOS管,而TTL内部集成的是三极管。 P型半导体是在纯净的硅晶体中掺杂了三价硼,此时硼原子最外层缺少了一个电子,我们用空穴代替这个缺少的电子。空穴吸引电

    2023年04月15日
    浏览(42)
  • Tina_Linux_安全_开发指南

    1.1 编写目的 介绍TinaLinux 下安全方案的功能。安全完整的方案基于normal 方案扩展,覆盖硬件安全、安全启动(Secure Boot)、安全系统(Secure OS)、安全存储(Secure Storage)、安全应用(Trust Application)、完整性保护(Dm-Verity)、强制访问控制(MAC)等方面。 1.2 适用范围 适用于

    2024年02月01日
    浏览(36)
  • 博途1200/1500PLC V90 PN通信控制 (FB284功能块)

    先简单说下如何获取FB284,一般有2种方法,Startdrive软件可以操作大部分西门子的驱动器,建议安装调试方便,缺点就是软件太大。   Drive_Lib_V62_S7_1200_1500下载地址如下 https://download.csdn.net/download/m0_46143730/86541852 https://download.csdn.net/download/m0_46143730/86541852 1、添加全局库 其它工

    2024年02月10日
    浏览(91)
  • FastAPI完全指南:实现高效、安全的Web开发

    在快速发展的互联网时代,高效的Web开发变得尤为重要。Python作为一门广受欢迎的编程语言,其众多Web框架中,FastAPI凭借其出色的性能和易用性,成为了一个炙手可热的选择。FastAPI是一个用于构建API的现代、高性能的Web框架,它基于Python 3.6+的类型提示,提供了快速、直观且

    2024年02月03日
    浏览(41)
  • 【正点原子STM32连载】 第十章 STM32CubeMX简介 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html STM32CubeMX是由ST公司开发的图形化代码自动生成工具,能够快速生成初始化代码,如配置GPIO,时钟树

    2024年01月15日
    浏览(56)
  • 【正点原子STM32连载】 第三十章 ADC实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html 本章,我们将介绍STM32F103的ADC(Analog-to-digital converters,模数转换器)功能。我们通过四个实验来学习

    2024年02月03日
    浏览(62)
  • 第七十七篇:车辆安全-车载软件C++语言开发指南(AUTOSAR C++)

    C++是面向对象的编程,比C语言更加复杂,抽象程度高,但C++在一些图像处理、系统、控件的编程方面,实用性更强,具有自己的编程优势。在车载嵌入式系统的开发中,C和C++都具有重要的作用。C++语言所使用的面向对象的编程技术如封装、继承和多态性极大的提高了在大规

    2024年02月04日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包