一文读懂基于PN532和S50的NFC开发

基于PN532和S50的NFC开发

1. NFC概述

NFC(Near Field Communication)近场通信,这个技术由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体公司)、诺基亚和索尼共同研制开发,其基础是RFID及互连技术。NFC是一种短距离高频的无线电技术,在13.56Mhz频率运行于20cm距离内。其传输速度有106Kbit/s、212Kbit/s或者424Kbit/s三种。目前近场通信已通过并成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。

1.1 NFC的工作模式

NFC的工作模式有卡模式、读写器模式和点对点模式三种

  • 卡模式:这个模式其实就是相当于一张采用RFID技术的IC卡。可以替代大量的IC卡(包括信用卡)场合商场刷卡、公交卡、门禁管制,车票,门票等等。此种方式下,有一个极大的优点,那就是卡片通过非接触读卡器的RF域来供电,即便是寄主设备(如手机)没电也可以工作。
  • 读写器模式:这个模式可以模拟读读卡器功能,读取MIFARE和FeliCa卡的信息
  • 点对点模式:这个模式和红外线差不多,可用于数据交换,只是传输距离较短,传输创建速度较快,传输速度可快些,功耗低(蓝牙也类似)。将两个具备NFC功能的设备链接,能实现数据点对点传输,如下载音乐、交换图片或者同步设备地址簿。一次通过NFC,多个设备如数码相机、PDA、计算机和手机之间都可以交换资料或者服务
1.2 NFC与RFID的区别

NFC与RFID的区别有如下三点:

  • NFC将非接触读卡器、非接触卡和点对点功能整合进一块单芯片,而rfid必须有阅读器和标签组成。RFID只能实现信息的读取以及判定,而NFC技术则强调的是信息交互。通俗的说NFC就是RFID的演进版本,双方可以近距离交换信息。NFC手机内置NFC芯片,组成RFID模块的一部分,可以当作RFID无源标签使用进行支付费用;也可以当作RFID读写器,用作数据交换与采集,还可以进行NFC手机之间的数据通信
  • NFC传输范围比RFID小,RFID的传输范围可以达到几米、甚至几十米,但由于NFC采取了独特的信号衰减技术,相对于RFID来说NFC具有距离近、带宽高、能耗低等特点
  • 应用方向不同。NFC看更多的是针对于消费类电子设备相互通讯,有源RFID则更擅长在长距离识别
2. PN532

PN532芯片是一款高度集成的非接触式通讯收发模块,基于8051单片机核心。它支持6个不同的操作模式:ISO/IEC14443A/MIFARE 读/写器、FeliCa 读/写器、ISO/IEC 14443B 读/写器、ISO/IEC14443A MIFARE卡模拟模式、FeliCa卡模拟模式、ISO/IEC 18092 ECMA 340点对点;这款芯片提供3种和主机通信的接口:SPI\I2C\USART。PN532的内部框图如下示

在这里插入图片描述

2.1 PN532工作模式以及接口方式配置

PN532工作模式和接口方式需要通过硬件来进行配置

  • 工作模式配置:在启动时,必须通过连接以下定义的P35和IRQ来选择正常模式。另外两种模式(RF field on和Emu Joiner)是仅用于测试目的的特殊模式。(P35和IRQ引脚上不需要外部电阻),见下图左
  • 接口方式配置:有3个接口I2C、SPI、HSU (high speed UART)。接口可由硬件(引脚I0和I1),见下图右

在这里插入图片描述

在这里插入图片描述

2.2 PN532帧格式

PN532芯片提供了许多命令方便开发者进行各种操作,只需要将命令正确发送给模块即可,每条指令都有固定的格式,帧指令的格式如下图示

在这里插入图片描述

–前序: 0x00
–包头: 0x00
–数据长度: LEN,包含TFI和PD
–长度校验和:LCS,LEN+LCS = 0x00
–传输方向: TFI,0xd4传到卡片,0xd5卡片返回
–数据: PD0/PD1…PDn
–数据校验和:DCS,DCS+TFI+PD0+…+PDn = 0x00
–尾序: 0x00

PN532长帧格式如下图示
在这里插入图片描述

–前序:0x00
–包头:0x00, 0xff
–短格式中的长度和校验:0xff, 0xff ,普通格式最大发送255个字节,而长格式可发送更多
–数据长度高字节:LENH,包含TFI和PD
–数据长度低字节:LENL,包含TFI和PD
–长度校验和: LCS,LENH + LENL + LCS = 0x00
–传输方向: TFI,0xd4传到卡片,0xd5卡片返回
–数据: PD0/PD1…PDn
–数据校验和:DCS,DCS+TFI+PD0+…+PDn = 0x00
–尾序: 0x00

PN532应答帧由PN532正常响应时发出(返回帧 + 数据),格式如下图示(此外还有无应答帧、错误帧)
在这里插入图片描述

–前序: 0x00
–包头: 0x00、0xff
–ACK包: 0x00、0xff
–尾序: 0x00

2.3 PN532的操作流程

下图描述了一个正常的PN532数据交换流程

在这里插入图片描述

2.4 PN532读写卡片

读写卡片需要按照一定的流程发送命令,并且每一条命令都要按照正确的帧格式。

  • 唤醒芯片:将芯片设置为普通模式

唤醒指令0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0xFD,0xD4,0x14,0x01,0x17,0x00
注:较特殊的是,唤醒命令要在原有的数据包之前加入唤醒头
- 0xD4 代表主机向PN532写入数据
- 0x14,0x01 代表选择了普通模式

  • 扫描卡片:一次最多2张,成功可以得到ID

扫描卡片0x4a, 0x02, 0x00 扫描命令、卡片个数、波特率(0x00对应9600bps)
应答:0x4b,0x02,0x01,0x04, 0x00,0x08,0x04,0x01, 0x02, 0x03, 0x04
- 0x4b, 应答码
- 0x02, 卡片个数
- 0x01, 第一个卡片
- 0x04, 0x00, 卡片类型
- 0x08, 卡片容量
- 0x04, id长度
- 0x01, 0x02, 0x03, 0x04 卡片id

  • 认证:需要发送秘钥和ID,注意这里没有防冲突环节,因为在扫描的时候已经拿到卡片的ID,在认证的时候指明ID即可

认证卡片0x40,0x01,0x60,0x02,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x02,0x03,0x04
- 0x40, 0x01, 0x60, 0x02, 数据交换命令,1号卡片,A认证,2地址
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 秘钥
- 0x01, 0x02, 0x03, 0x04 卡片id
应答:0x41, 0x00 无错

  • 读、写、充值、扣款

读卡0x40, 0x01, 0x30, 0x02 交换数据,1号卡,读取块,2地址
应答:0x41, 0x00, 16bytes 应答,无错,16个数据
写卡0x40, 0x01, 0xa0, 0x02,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6 交换数据,1号卡,写入块,2地址,数据(阿拉伯数字)
应答:0x41, 0x00 应答,无错
充值
0x40, 0x01, 0xc1, 0x02, 1,0,0,0 交换数据,1号卡,充值,2地址,数据
0x40, 0x01, 0xB0, 0x02 交换数据,1号卡,保存,2地址
应答:0x41, 0x00 应答,无错
扣款
0x40, 0x01, 0xc0, 0x02, 1,0,0,0 交换数据,1号卡,扣款,2地址,数据
0x40, 0x01, 0xB0, 0x02 交换数据,1号卡,保存,2地址
应答:0x41, 0x00 应答,无错
注意:充值或者扣款操作一定要加上保存动作

3. S50电子标签

M1芯片,是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,属于非接触式IC卡。非接触式IC卡又称射频卡,成功地解决了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。主要用于公交、轮渡、地铁的自动收费系统。M1卡,优点是可读可写的多功能卡,缺点是:价格稍贵,感应距离短

工作原理:向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据

在这里插入图片描述
S50卡的详细介绍可参考一文读懂基于RC522和S50的RFID开发

4. 基于PN532和S50的NFC开发实例

本实例使用STM32F103开发板与PN532通过HSU接口连接(High Speed Uart的默认配置如下图示),STM32通过另外一个串口将读取出的S50卡信息打印出来,通过不同的按键控制对S50卡进行写入、充值、扣款等操作
在这里插入图片描述

4.1 硬件连接

本实例使用到了蜂鸣器(PB5)、按键(PA0/PE2/PE3/PE4)和LED灯(PC0),PN532与STM32F1通过USART方式通信,使能DMA接收功能,通过空闲中断的方法接收不定长的返回帧

/*引脚说明*/:
STM32 PA3(USART2_RXD) <--- PN532(TXD)
STM32 PA2(USART2_TXD) ---> PN532(RXD)
STM32 3.3V  --- PN532(VCC)
STM32 GND   --- PN532(GND)

在这里插入图片描述

4.2 软件编程
  • 创建蜂鸣器(beep.c)和按键驱动文件(key.c)以及相关头文件
  • 创建PN532驱动文件PN532.c和PN532.h,下面给出头文件里的各函数声明,具体的函数实现,可在文末下载源码查看
void GetCmd(uint8_t *data, uint8_t l);
void SendCmd(uint8_t *command, uint8_t num);
uint8_t Wake_Card(void);
uint8_t Scan_Card(void);
uint8_t Author_Card(void);
uint8_t Read_Card(uint8_t block_addr);
uint8_t Write_Card(uint8_t block_addr);
uint8_t Increment_Value(uint8_t block_addr);
uint8_t Decrement_Value(uint8_t block_addr);
uint8_t Transfer_Value(uint8_t block_addr);
void PN532_Read(uint8_t block_addr);
void PN532_Write(uint8_t block_addr);
void PN532_Value(uint8_t mode,uint8_t block_addr);
  • 设置DMA在空闲中断方法下接收不定长数据
//使用DMA的空闲中断方式接收不定长数据:/
//RXNE数据接收中断每接收1个字节的数据就会触发一次;/
//IDLE空闲中断在所有数据(N个字节)接收完成后(接收到的数据断流),才会触发
/************main函数里的处理************************************************/
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);//使能IDLE空闲中断
HAL_UART_Receive_DMA(&huart2,rx_buffer,BUFFER_SIZE);//开启DMA接收
/************中断处理函数里的处理********************************************/
#define BUFFER_SIZE 128
uint8_t rx_len;			//接收一帧数据的长度
uint8_t recv_end_flag;	//一帧数据接收完成标志
uint8_t rx_buffer[128];	//接收数据缓存数组
 
void USART2_IRQHandler(void){
  /* USER CODE BEGIN USART2_IRQn 0 */
  uint32_t tmp_flag = 0;
  uint32_t temp;
  tmp_flag =  __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);//获取IDLE标志位 
  if((tmp_flag != RESET)){ 		//IDLE标志位被置位(即触发IDLE空闲中断)
	__HAL_UART_CLEAR_IDLEFLAG(&huart2); //清除标志位
	HAL_UART_DMAStop(&huart2);//关闭DMA防止处理数据时接收数据,产生干扰
	temp = hdma_usart2_rx.Instance->CNDTR;//获取DMA中未传输的数据个数
	//temp = __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);//同上一行 
	rx_len =  BUFFER_SIZE - temp;//已经接收的数据个数=总计数-未传输的数据个数 
	recv_end_flag = 1;//接收完成标志置1
	//HAL_UART_RxCpltCallback(&huart2);
	HAL_UART_Receive_DMA(&huart2,rx_buffer,BUFFER_SIZE);//重启DMA接收	
  }
  #if DEBUG	//调试用
	printf("rxbuf:");
	for(uint8_t i=0;i<32;i++)
	{
		printf("%02x ",rx_buffer[i]);
	}
	printf("\n");
  #endif	
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  /* USER CODE END USART2_IRQn 1 */
}
  • 在main函数中添加读M1卡函数
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("NFC read card!\n");
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); //beep off
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);//使能IDLE空闲中断
  HAL_UART_Receive_DMA(&huart2,rx_buffer,BUFFER_SIZE);//开启DMA接收
  /* USER CODE END 2 */
  while (1)
  {
    PN532_Read(0);//读S50卡块0的数据
	PN532_Read(1);//读S50卡块1的数据
	PN532_Read(2);//读S50卡块2的数据
	PN532_Read(3);//读S50卡块3的数据
	HAL_Delay(1000);
  }
}
4.3 下载验证

编译无误下载到开发板,打开串口调试助手,主函数分别依次读取了S50卡的块0/1/2/3的数据。M1卡块0的数据,即厂商段,包含了M1卡的序列号即厂商数据;M1卡块2/3的数据默认为0;M1卡块3的数据,即区尾,包含A/B密钥以及访问控制位,该段出厂默认为:ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff

NFC read card!
scan success! 
Card ID:0xea,0xe6,0x8b,0xb1,
read success! 
Read Data:0xea,0xe6,0x8b,0xb1,0x36,0x8,0x4,0x0,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
scan success! 
Card ID:0xea,0xe6,0x8b,0xb1,
read success! 
Read Data:0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
scan success! 
Card ID:0xea,0xe6,0x8b,0xb1,
read success! 
Read Data:0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
scan success! 
Card ID:0xea,0xe6,0x8b,0xb1,
read success! 
Read Data:0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x7,0x80,0x69,0xff,0xff,0xff,0xff,0xff,0xff,

关注我的公众号,在公众号里发如下消息,即可获取相应的工程源代码:

基于PN532和S50的NFC开发实例

在这里插入图片描述

  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: STM32是意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M内核的32位微控制器系列。而PN532是一款由NXP公司推出的高度集成的近场通信(NFC)解决方案控制器。 PN532与STM32的结合可以实现更多的应用和功能PN532支持多种模式的近场通信,包括读取和写入NFC标签,以及与其他PN532或支持NFC的设备进行通信。而STM32作为微控制器,可以通过编程来控制PN532并与其他硬件组件进行通信。 PN532和STM32的搭配可以应用于许多领域。例如,在智能门禁系统中,PN532可以用来读取NFC标签或手机上的虚拟门禁卡,而STM32可以将读取到的信息进行处理,并控制门锁的开关。在电子支付设备中,PN532可以与STM32配合,实现移动支付功能,使用户可以通过手机或其他支持NFC的设备进行支付。 除了以上的应用,PN532和STM32的组合还可以用于公共交通票务系统、智能家居控制、物联网设备等领域。PN532和STM32都具有低功耗的特点,可以在嵌入式系统中长时间稳定运行。 总而言之,STM32和PN532的结合可以实现各种应用场景下的近场通信功能。利用PN532的高度集成解决方案和STM32的处理能力,可以实现更多智能化的功能,提升用户体验。 ### 回答2: STM32 PN532是一款基于STM32系列微控制器的集成电路芯片,它是一款高性能、低功耗的近场通信(NFC)解决方案。PN532芯片支持ISO/IEC 14443 Type A/B、FeliCa和ISO/IEC 15693等多种通信标准,可以实现与智能卡、手机、平板电脑等设备之间的无线通信。 PN532芯片的主要特点包括: 1. 高度集成的近场通信功能,支持主动和被动通信模式。 2. 高速数据传输,最高可达424kbps。 3. 强大的天线驱动能力,可适应不同尺寸和材质的天线。 4. 低功耗设计,满足各种节能要求。 5. 支持多种安全功能,包括数据加密和认证等。 6. 丰富的I/O接口,可灵活连接外部设备。 7. 完善的软件支持,包括开发工具、示例代和文档等。 使用STM32 PN532可以实现许多应用,例如智能门锁、身份验证、电子支付和物联网等。通过与智能卡的通信,可以实现门禁权限管理和安全出入等功能;通过与手机的通信,可以实现移动支付、数据传输和设备控制等功能。此外,PN532还可以与其他传感器和执行器等外设配合使用,实现更复杂的系统集成。 总之,STM32 PN532是一款功能强大、灵活可靠的近场通信解决方案,适用于多种应用场景,帮助开发者实现便捷高效的无线通信功能。 ### 回答3: STM32 PN532 是一种集成了无线射频技术和近场通信技术的芯片。它是一款高度集成的解决方案,能够实现多种近场通信应用。 首先,STM32 PN532 支持多种近场通信协议,如ISO/IEC 14443 A/B、FeliCa 和ISO/IEC 15693,可与不同类型的智能卡、标签和设备进行通信。它能够读写智能卡的信息,实现支付、身份验证和门禁等功能。 其次,STM32 PN532 具有强大的安全性能。它支持AES-128加密算法,能够对通信数据进行加密和解密,保护数据的安全性。此外,它还支持MAC(消息认证)算法,可以验证数据的完整性,防止数据被篡改或伪造。 此外,STM32 PN532 的硬件设计和软件开发工具非常丰富。ST公司为PN532提供了一套完整的开发工具,包括硬件开发板、软件开发包和示例代开发者可以使用STM32的官方开发环境,如CubeIDE、CubeMX和Keil等,轻松地进行开发和调试。 最后,STM32 PN532 还具有低功耗特性。它采用先进的功耗管理技术,可以在待机模式下保持低功耗,提高设备的续航能力。这使得它非常适合用于物联网设备、智能家居和移动支付等应用场景。 总之,STM32 PN532 是一款功能强大、安全可靠的芯片,适用于各种近场通信应用。无论是门禁系统、智能支付终端还是物联网设备,都可以借助PN532实现高效的近场通信。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

安迪西嵌入式

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

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

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

打赏作者

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

抵扣说明:

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

余额充值