关于使用EM4095 搭配动物芯片iso11784,做的nfc识别模块(已烂尾)

主函数 

u8 status_buffer[32];
u8 pra_buf[24];
int rec_flag;
u8 pra_buf1[130];
u8 XIANY[40];
u8 NFCdata[24];
char code[100]={0};//捕获到的数据
char *p;
char st=0;     
int SN_H,SN_L,CH,US,dataNFC,animal,CRCxmode;//处理完的数据SN_L+SN_H
u8 flag_not;
int slave_add;    



while(1)
    {    
        
        RS485_Receive_Data(rs485buf,&lenn);
        //一直扫描接收到的数据,扫描需要增加一个指令执行是否完成
        if(rec_flag == 1)
        {
            rec_flag = 0;
        }
        SN_H=0,SN_L=0,CH=0,US=0;
        st = read_id();
        if(st == 1)//数据接收成功
        {
//            EM_SHD = 1;    
          flag_not = data_pl();
            if(flag_not==1)//数据验证成功
            {
                                data_wrangling();
                                memcpy( &NFCdata[0], &SN_L, 4);
                                memcpy( &NFCdata[4], &SN_H, 4);
                                memcpy( &NFCdata[8], &CH, 4);
                                memcpy( &NFCdata[12], &US, 4);                            
            }
//            EM_SHD = 0;

        }        
        
    } 

主要代码为数据的处理和时序的解析,整个.c都在这了,自取,能识别但是效率不高

#include "led.h"
#include "delay.h"
extern int TCNT1;
extern char code[100];
extern int SN_H,SN_L,CH,US,dataNFC,animal;
int CRCint_L=0,CRCint_H=0,CRCxmode_A,CRCxmode_B;

unsigned char CRCchar[8] = {0};
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB,PE端口时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PB,PE端口时钟
		
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//SHD
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 
 GPIO_SetBits(GPIOA,GPIO_Pin_7);
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_12;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//MOD
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 
 GPIO_ResetBits(GPIOB,GPIO_Pin_1);
 GPIO_ResetBits(GPIOB,GPIO_Pin_12);
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0	;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //OUT
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 



}
 
char read_id_start(void)
{
	char code_st = 1;
	char i,c_l;
	while(!EM_DE_OUT);//变为1就退出
	
	TCNT1 = 0;//清计数器计数
	while(EM_DE_OUT);//变为0就退出
	
	if(TCNT1>110&&TCNT1<150)
	{
		while(!EM_DE_OUT);
		for(i=1;i<11;i++)
		{
				delay_us(20);
				if(EM_DE_OUT == 1)
				{
					delay_us(140);
					if(EM_DE_OUT == 1)
					{
						code[i] = 1;
						while(EM_DE_OUT);					
					}
					else
					{
						code[i] = 0;
						while(!EM_DE_OUT);					
					}
				}
				else
				{
					delay_us(140);
					if(EM_DE_OUT == 1)
					{
						code[i] = 0;
						while(!EM_DE_OUT);					
					}
					else
					{
						code[i] = 1;
						while(EM_DE_OUT);					
					}			
				}
			
		}
		if(code[0]==0 && code[1]==0&& code[2]==0&& code[3]==0&& code[4]==0&& code[5]==0&& code[6]==0&& code[7]==0&& code[8]==0&& code[9]==0 && code[10]==1)
		{
			code_st = 1;
		}
		else
		{
			code_st = 0;
		}
			
	}
	else	
		code_st = 0;
	
	if(code_st == 1)
		return 1;
	else
		return 0;
	
}

char read_id(void)
{
	char st=0;
	char i=0;

	EM_SHD = 0;
	st=read_id_start();
	if(st == 1)
	{
			//顺序读取剩余bit
		for(i=11;i<101;i++)
		{
			delay_us(20);
			if(EM_DE_OUT == 1)
			{
				delay_us(143);
				if(EM_DE_OUT == 1)
				{
					code[i] = 1;
					while(EM_DE_OUT);					
				}
				else
				{
					code[i] = 0;
					while(!EM_DE_OUT);					
				}
			}
			else
			{
				delay_us(143);
				if(EM_DE_OUT == 1)
				{
					code[i] = 0;
					while(EM_DE_OUT);					
				}
				else
				{
					code[i] = 1;
					while(!EM_DE_OUT);					
				}			
			}

		}
		return 1;
	}
	else
		return 0;
}

uint32_t reverse_32bit_int(uint32_t num) 
{
    // 提取原整数的四个字节(8位)
    uint8_t byte1 = (uint8_t)((num & 0xFF000000) >> 24);
    uint8_t byte2 = (uint8_t)((num & 0x00FF0000) >> 16);
    uint8_t byte3 = (uint8_t)((num & 0x0000FF00) >> 8);
    uint8_t byte4 = (uint8_t)(num & 0x000000FF);

    // 倒序排列这些字节并构建新的整数
    uint32_t reversed_num = ((uint32_t)byte4 << 24) | ((uint32_t)byte3 << 16) | ((uint32_t)byte2 << 8) | (uint32_t)byte1;

    return reversed_num;
}
uint32_t reverse_6bit_int(uint32_t num) 
{
    // 提取原整数的6个bit
    uint32_t bit1 = (num & 0x20) >> 5;
    uint32_t bit2 = (num & 0x10) >> 4;
    uint32_t bit3 = (num & 0x08) >> 3;
    uint32_t bit4 = (num & 0x04) >> 2;
    uint32_t bit5 = (num & 0x02) >> 1;
    uint32_t bit6 = num & 0x01;

    // 倒序排列这6个bit并构建新的整数
    uint32_t reversed_num = (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | bit1;

    return reversed_num;
}
uint32_t reverse_10bit_int(uint32_t num) {
    // 提取原整数的10个bit
    uint32_t bit1 = (num & 0x200) >> 9;
    uint32_t bit2 = (num & 0x100) >> 8;
    uint32_t bit3 = (num & 0x080) >> 7;
    uint32_t bit4 = (num & 0x040) >> 6;
    uint32_t bit5 = (num & 0x020) >> 5;
    uint32_t bit6 = (num & 0x010) >> 4;
    uint32_t bit7 = (num & 0x008) >> 3;
    uint32_t bit8 = (num & 0x004) >> 2;
    uint32_t bit9 = (num & 0x002) >> 1;
    uint32_t bit10 = num & 0x001;

    // 倒序排列这10个bit并构建新的整数
    uint32_t reversed_num = (bit10 << 9) | (bit9 << 8) | (bit8 << 7) | (bit7 << 6) | (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | bit1;

    return reversed_num;
}
uint32_t reverse_14bit_int(uint32_t num) {
    // 提取原整数的14个bit
    uint32_t bit1 = (num & 0x4000) >> 13;
    uint32_t bit2 = (num & 0x2000) >> 12;
    uint32_t bit3 = (num & 0x1000) >> 11;
    uint32_t bit4 = (num & 0x0800) >> 10;
    uint32_t bit5 = (num & 0x0400) >> 9;
    uint32_t bit6 = (num & 0x0200) >> 8;
    uint32_t bit7 = (num & 0x0100) >> 7;
    uint32_t bit8 = (num & 0x0080) >> 6;
    uint32_t bit9 = (num & 0x0040) >> 5;
    uint32_t bit10 = (num & 0x0020) >> 4;
    uint32_t bit11 = (num & 0x0010) >> 3;
    uint32_t bit12 = (num & 0x0008) >> 2;
    uint32_t bit13 = (num & 0x0004) >> 1;
    uint32_t bit14 = num & 0x0002;

    // 倒序排列这14个bit并构建新的整数
    uint32_t reversed_num = (bit14 << 13) | (bit13 << 12) | (bit12 << 11) | (bit11 << 10) | (bit10 << 9) | (bit9 << 8) | (bit8 << 7) | (bit7 << 6) | (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | bit1;

    return reversed_num;
}

uint32_t reverse_16bit_int(uint32_t num) {
    // 提取原整数的16个bit
    uint32_t reversed_num = 0;
    int i;
    for (i = 0; i < 16; i++) {
        reversed_num = (reversed_num << 1) | ((num >> i) & 1);
    }
    return reversed_num;
}

unsigned short do_crc(unsigned char *ptr, int len)
{
    unsigned int i;
    unsigned short crc = 0x0000;
    
    while(len--)
    {
        crc ^= (unsigned short)(*ptr++) << 8;
        for (i = 0; i < 8; ++i)
        {
            if (crc & 0x8000)
                crc = (crc << 1) ^ 0x1021;
            else
                crc <<= 1;
        }
    }
    
    return crc;
}
u8 data_pl()
{
	
			int i,CG_FLAG = 0;
			for( i=11;i<19;i++)
			{
				SN_H |= code[i];
				SN_H = SN_H <<1;
			}
			for( i=20;i<28;i++)
			{
				SN_H |= code[i];
				SN_H = SN_H <<1;
			}
			for( i=29;i<37;i++)
			{
				SN_H |= code[i];
				SN_H = SN_H <<1;
			}
			for( i=38;i<46;i++)
			{
				SN_H |= code[i];
				if(i==45)break;
				SN_H = SN_H <<1;
			}
			for( i=47;i<53;i++)
			{
				SN_L |= code[i];
				if(i==52)break;
				SN_L = SN_L <<1;
			}			
			//以上是SN码处理

			
			
				CH |= code[53];
				CH = CH <<1;
				CH |= code[54];
				CH = CH <<1;
			for( i=56;i<64;i++)
			{
				CH |= code[i];
				if(i==63)break;
				CH = CH <<1;
			}
			//以上是CN码处理	
			
			
			
				dataNFC = code[65];
			//以上是data码处理	
			
			
			
			for( i=66;i<73;i++)
			{
				US |= code[i];
				US = US <<1;
			}
			for( i=74;i<81;i++)
			{
				US |= code[i];
				if(i==80)break;
				US = US <<1;
			}
			//以上是us码处理		
			
			
			
				animal = code[81];
			//以上是animal码处理	
						
			
			
			for( i=83;i<91;i++)
			{
				CRCxmode_A |= code[i];
				CRCxmode_A = CRCxmode_A <<1;
			}
			for( i=92;i<100;i++)
			{
				CRCxmode_A |= code[i];
				if(i==99)break;
				CRCxmode_A = CRCxmode_A <<1;
			}			
			//以上是16位CRC码	
			
			
			

			
			
			CRCint_H = SN_H; 
			CRCint_L |= (SN_L<<26);
			CRCint_L |= (CH<<16);
			CRCint_L |= (dataNFC<<15);
			CRCint_L |= (US<<1);			
			CRCint_L |= animal;			
			//处理为两个32位的整形9999 9999 9667 8001,正确的
			CRCchar[0] = (unsigned char)(CRCint_H>>24);
			CRCchar[1] = (unsigned char)(CRCint_H>>16);
			CRCchar[2] = (unsigned char)(CRCint_H>>8);
			CRCchar[3] = (unsigned char)(CRCint_H);			
			
			CRCchar[4] = (unsigned char)(CRCint_L>>24);
			CRCchar[5] = (unsigned char)(CRCint_L>>16);
			CRCchar[6] = (unsigned char)(CRCint_L>>8);
			CRCchar[7] = (unsigned char)(CRCint_L);							
			//转化为1char型数组
			CRCxmode_B = do_crc(CRCchar, sizeof(CRCchar));
			//开始计算校验码

			CRCint_L = 0;  CRCint_H = 0;//到这里为止,所有的变量对比写入的数据来说都是逆序的
			

				if(CRCxmode_A == CRCxmode_B)
				{
					CG_FLAG = 1;
					
				}
				CRCxmode_A = 0;
				CRCxmode_B = 0;
			if(CG_FLAG != 0)
			{
				return 1;
			}
			else
			{
				return 0;
			}
			
}

void data_wrangling()
{
	
  			SN_L = reverse_6bit_int(SN_L);
				SN_H = reverse_32bit_int(SN_H);
				CH = reverse_10bit_int(CH);
				US = reverse_14bit_int(US);	
//				CRCxmode_A = reverse_16bit_int(CRCxmode_A);
				//处理为逆序整形
}

.h文件

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"

#define EM_SHD		PAout(7)
#define EM_MOD		PBout(1)
#define EM_DE_OUT		PBin(0)
#define CE		PBout(12)


void LED_Init(void);//初始化
char read_id_start(void);
char read_id(void);		
uint32_t reverse_32bit_int(uint32_t num) ;
uint32_t reverse_6bit_int(uint32_t num) ;
uint32_t reverse_10bit_int(uint32_t num) ;
uint32_t reverse_14bit_int(uint32_t num) ;
uint32_t reverse_16bit_int(uint32_t num);
unsigned short do_crc(unsigned char *ptr, int len);
u8 data_pl();
void data_wrangling(void);
#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值