单片机基于CR95HF的NFC读卡器方案_单片机nfc(1)

80 08 00 00 00 00 00 77 CF 00
80 08 00 00 00 00 00 77 CF 00
*/

static const uint8_t protocol_sel[] = {0x02,0x02,0x01,0x05};

static const uint8_t rf_gain[] = {0x09,0x04,0x68,0x01,0x01,0x50};

static const uint8_t label_inventory[] = {0x04,0x03,0x26,0x01,0x00};

static const uint8_t lable_system_info[] = {0x04,0x02,0x02,0x2B};

static uint8_t read_single_block[] = {0x04,0x03,0x02,0x20,0x00};

#define KEYWORDS “CR95HF
#define KEYWORDS_LENGTH 8

/**
串口配置,协议选择,增益配置,芯片初始化。
*/
BOOLEAN CR95HF_Init(void)
{
uint8_t tmpbuf[2];
uint8_t trycnt;

  USART3_Init(57600);
  
  HAL_Delay(100);

  trycnt = 0;
  memset(tmpbuf,0x01,sizeof(tmpbuf));

TRY_PROTOCOL_SEL_WRITE:
USART3_SendBuffer((uint8_t*)protocol_sel,sizeof(protocol_sel));
USART3_ReceiveBuffer(tmpbuf,sizeof(tmpbuf));

  if(!(tmpbuf[0] == 0 && tmpbuf[1] == 0)){
		  if(trycnt++ < 10) goto TRY_PROTOCOL_SEL_WRITE;
		  else return FALSE;
  }

	
  trycnt = 0;
  memset(tmpbuf,0x01,sizeof(tmpbuf));

TRY_RF_GAIN_WRITE:
USART3_SendBuffer((uint8_t*)rf_gain,sizeof(rf_gain));
USART3_ReceiveBuffer(tmpbuf,2);

  if(!(tmpbuf[0] == 0 && tmpbuf[1] == 0)){
		  if(trycnt++ < 10) goto TRY_RF_GAIN_WRITE;
		  else return FALSE;
  }

  return TRUE;		

}

/**
搜索NFC标签并返回标签UID。
/
BOOLEAN CR95HF_Inventory(uint8_t
uid)
{
uint8_t tmpbuf[20];
uint8_t trycnt;
uint8_t i;

trycnt = 0;
memset(tmpbuf,0,sizeof(tmpbuf));

TRY_LABEL_INVENTORY_WRITE:
USART3_SendBuffer((uint8_t*)label_inventory,sizeof(label_inventory));
USART3_ReceiveBuffer(tmpbuf,sizeof(tmpbuf));

 //没有应答
if(tmpbuf[0] == 0x00){
		  if(trycnt++ < 10) goto TRY_LABEL_INVENTORY_WRITE;
		  else return FALSE;
}
//搜索到标签
else if(tmpbuf[0] == 0x80 && tmpbuf[1] == 0x0D)
{
		  if(uid == NULL) return TRUE;
		
		  memcpy(uid,&tmpbuf[4],8);
		
          //需要颠倒一下
		  for(i=0;i < 4;i++){
				  trycnt     = uid[i];
				  uid[i]     = uid[7 - i];
				  uid[7 - i] = trycnt;
		  }

		  return TRUE;
}
//没有发现
else{
		 //tmpbuf[0] == 0x87
		 return FALSE;
}

}

/**
读取标签系统信息,获取内存大小和块大小,轮询所有块找出有标记信息的即为存储内容所在位置。
/
BOOLEAN CR95HF_ReadBlock(uint8_t
text,uint8_t*textlen)
{
#define SYSTEM_INFO_SIZE (24)
#define READ_BLOCK_SIZE (10)

  uint8_t tmpbuf[SYSTEM_INFO_SIZE];
  uint8_t readbuf[128];
  uint8_t trycnt;
  uint8_t i,j;
  uint16_t memorysize;	

  trycnt = 0;
  memset(tmpbuf,0,SYSTEM_INFO_SIZE);

TRY_LABEL_SYSTEM_INFO_WRITE:
USART3_SendBuffer((uint8_t*)lable_system_info,sizeof(lable_system_info));
USART3_ReceiveBuffer(tmpbuf,SYSTEM_INFO_SIZE);

  //没有应答
  if(tmpbuf[0] == 0x00){
		 if(trycnt++ < 10) goto TRY_LABEL_SYSTEM_INFO_WRITE;
		 else return FALSE;
  }
  else if(tmpbuf[0] == 0x80 && tmpbuf[1] == 0x12)
  {
		  memorysize = tmpbuf[14];
  }
  else
  {
		 return FALSE;
  }	


  memset(readbuf,0,sizeof(readbuf));
	
  for(i=0;i < memorysize / 4;i++)
  {
	trycnt = 0;
	memset(tmpbuf,0,READ_BLOCK_SIZE);

TRY_READ_SINGLE_BLOCK_WRITE:
read_single_block[4] = i;
USART3_SendBuffer((uint8_t*)read_single_block,sizeof(read_single_block));
USART3_ReceiveBuffer(tmpbuf,READ_BLOCK_SIZE);

	     //没有应答
		 if(tmpbuf[0] == 0x00){
					if(trycnt++ < 10) goto TRY_READ_SINGLE_BLOCK_WRITE;
					else return FALSE;
		  }
		  else if(tmpbuf[0] == 0x80 && tmpbuf[1] == 0x08)
		  {
					memcpy(&readbuf[i << 2],&tmpbuf[3],4);
				  if(tmpbuf[7] == 0x77 && tmpbuf[8] == 0xCF) break;
		  }
          else{
				 return FALSE;
			}					
   }

   //逐字节比较关键字,找出标记信息,获取真实内容。
   for(j=0;j < i << 2;j++)
   {
		  if(readbuf[j] == 0xD1 && readbuf[j + 1] == 0x01)
		  {
				 *textlen = readbuf[j + 2] - 3 - KEYWORDS_LENGTH;
				
				 if(readbuf[j + 3] == 0x54 && readbuf[j + 4] == 0x02 &&
					  readbuf[j + 5] == 0x65 && readbuf[j + 6] == 0x6E)
				 {

						 if(strncmp(KEYWORDS,&readbuf[j + 7]),KEYWORDS_LENGTH)) return FALSE
					
						 memcpy(text,&readbuf[j + 7 + KEYWORDS_LENGTH],*textlen);
						 return TRUE;
				  }
				  else break;
		  }
  }
	
	
  return FALSE;

}

/***
for test
if(CR95HF_Init())
{
USART1_SendBuf(“OKOK”,4);
}
else{
USART1_SendBuf(“FAILED”,6);
}

uint8_t uid[8];
uint8_t readata[128];
uint8_t readlen;

while(1)

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值