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_tuid)
{
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_ttext,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年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。







既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

1万+

被折叠的 条评论
为什么被折叠?



