单片机基于ST25DV动态标签的无线通信

在物联网产品的开发过程中,物联网设备非接触式向外界提供可变的交换信息非常有必要,

比如路由器向手机提供可配置的WiFi信息,巡检点向手机提供动态的传感器数据等等。

该系列是在高频率范围 (13.56 MHz) 内运行的NFC Forum Type 5动态标签。利用I2C有线链路,任何NFC智能手机或NFC/RFID HF专业读卡器以及MCU均可以访问存储在这些标签中的数据。

ST25DV-I2C标签提供快写、快速传输模式、增强I²C功能、能量捕获、低功耗模式以及密码保护。这些标签的集成度和性价比极高,可提供丰富的功能集,适用于各种应用。

此外,开发人员可从评估板、软件工具、移动应用和其他资源构成的完整生态系统中受益,从而加快应用开发速度。

 基于stm32f2使用硬件i2c将st25dv当做一个eeprom与外界交换数据。

#ifndef __DYNAMIC_LABEL_H__
#define __DYNAMIC_LABEL_H__

#include "st25dv.h"
#include "tagtype5_wrapper.h"
#include "lib_NDEF_Text.h"
#include "comtypes.h"


void Dynamic_Label_Init(void);

void Dynamic_Label_Get_UID(uint8_t*data,uint8_t len);

void Dynamic_Label_Write(uint8_t*data,uint8_t len);

void Dynamic_Label_Read(uint8_t*data,uint8_t*len);

#endif

#include "dynamic_label.h"

#define RW_RETRY_CNT   (10)

//开关使能
#define DYLA_ENABLE

__IO BOOLEAN is_i2c2_init = FALSE;

//复用nfc lable为eeprom存储系统信息

//初始化st25dv并配置协议ISO 15693 and NFC T5T
void Dynamic_Label_Init(void)
{
#ifdef DYLA_ENABLE
	  ST25DV_PROTECTION_ZONE i;
	  ST25DV_RF_PROT_ZONE RfProtZone;
	
		//Init ST25DV driver 
		while( BSP_NFCTAG_Init( ) != NFCTAG_OK );
	 
		// Reset Mailbox enable to allow write to EEPROM 
		BSP_NFCTAG_GetExtended_Drv()->ResetMBEN_Dyn( );
	
		// Check if no NDEF detected, init mem in Tag Type 5 
		if( NfcType5_NDEFDetection( ) != NDEF_OK )
		{
				CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE;
				CCFileStruct.Version     = NFCT5_VERSION_V1_0;
				CCFileStruct.MemorySize  = ( ST25DV_MAX_SIZE / 8 ) & 0xFF;
				CCFileStruct.TT5Tag      = 0x05;
				// Init of the Type Tag 5 component (M24LR)
				while( NfcType5_TT5Init( ) != NFCTAG_OK );
		}	

        //开RF只读保护,最好还要加密码
		RfProtZone.PasswdCtrl        = ST25DV_NOT_PROTECTED;
		RfProtZone.RWprotection      = ST25DV_READ_PROT;
		
		for(i=ST25DV_PROT_ZONE1;i <= ST25DV_PROT_ZONE4;i++)
		{
			BSP_NFCTAG_GetExtended_Drv()->WriteRFZxSS(i,RfProtZone);
		}	
		
		is_i2c2_init                 = TRUE;

#endif		
}


//获取NFC的UID,用于发现识别
void Dynamic_Label_Get_UID(uint8_t*data,uint8_t len)
{
#ifdef DYLA_ENABLE
	  ST25DV_UID uid;
	
	  if(len != 8) return;
	
	  if(BSP_NFCTAG_GetExtended_Drv()->ReadUID(&uid) != NFCTAG_OK) return;
	  
	  data[0]    = uid.MsbUid >> 24;
	  data[1]    = uid.MsbUid >> 16;
	  data[2]    = uid.MsbUid >> 8;
	  data[3]    = uid.MsbUid &  0xFF;
	  
	  data[4]    = uid.LsbUid >> 24;
	  data[5]    = uid.LsbUid >> 16;
	  data[6]    = uid.LsbUid >> 8;
	  data[7]    = uid.LsbUid & 0xFF;
#endif
}



//以NDEF消息方式向NFC片内EEPROM写入数据
void Dynamic_Label_Write(uint8_t*data,uint8_t len)
{
#ifdef DYLA_ENABLE
  	  uint8_t cnt = 0;
	  while(NDEF_WriteText(data,len) != NDEF_OK && cnt < RW_RETRY_CNT)
	  {
			 HAL_Delay(100);
			 cnt++;
	  }

#if 0
	  uint8_t test[30];
	  NfcTag_ReadNDEF(test);
	  USART1_SendBuf(test,30);
#endif
		
#if 0		
	  while(1)
	  {
			 uint8_t content[128];
			 uint8_t contentlen  = 0;
			 
			 memset(content,0,sizeof(content));		
			 Dynamic_Label_Read(content,&contentlen);

			 USART1_SendBuf(content,contentlen);
			 HAL_Delay(1000);
	  }
#endif
		
#endif
}


//读取NFC片内数据
void Dynamic_Label_Read(uint8_t*data,uint8_t*len)
{
#ifdef DYLA_ENABLE
	  uint8_t cnt = 0;
	  while(NfcTag_ReadNDEF_New(data,len) != NDEF_OK && cnt < RW_RETRY_CNT)
	  {
			 HAL_Delay(100);
			 cnt++;
	  }
#endif
}


  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值