⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 HSDB4095 RFID 开发板是基于Winbond 单片机W78E365 和EM 可读写模拟前端125K RFID 基站芯片EM4095 的一个RFID 卡的开发板配合上位机软件
💻 C
📖 第 1 页 / 共 3 页
字号:
		for(i=0;i<0xf8;i++)
		{
			if(DEMOD_OUT == 1)		//,test low time 等待高电平,超时退出
				break;
		}
		
		if(i>=0xf0)
		{
			return_00();
			return;
		}
		
		icr=count_module(); 
		capt=icr-last_capture;
		last_capture=icr;
		if((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==0))
		{	//0.5p low
			flag_invalid_edge_manchester=1;
			if((times_capture_manchester%2)==0)	
			{
				array_subscript=(count_autodection_bit>>3);
				bit_subscript=(count_autodection_bit%8);
				autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));					
			}
			count_autodection_bit++;
		}
		else if ((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==1))
		{	//0.5p low
			flag_invalid_edge_manchester=0;
		}
		else if ((capt>MaxCaptureHalfDateRate)&&(capt<MaxCaptureDateRate))
		{	//1p low
			if((times_capture_manchester%2)==0)	
			{
				array_subscript=(count_autodection_bit>>3);
				bit_subscript=(count_autodection_bit%8);
				autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));					
			}
			count_autodection_bit++;					
		}
		times_capture_manchester++;
		//-----	
		for(i=0;i<0xf8;i++)
		{
			if(DEMOD_OUT == 0)		//等待低电平,超时退出
				break;
		}
		if(i>=0xf0)
		{
			return_00();
			return;
		}
		
		icr=count_module(); 
		capt=icr-last_capture;
		last_capture=icr;	
		if((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==0))
		{	//0.5p hi
			flag_invalid_edge_manchester=1;
			if((times_capture_manchester%2)==0)	
			{
				array_subscript=(count_autodection_bit>>3);
				bit_subscript=(count_autodection_bit%8);
				autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));					
			}
			count_autodection_bit++;
		}
		else if ((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==1))
		{		//0.5p hi
			flag_invalid_edge_manchester=0;
		}
		else if ((capt>MaxCaptureHalfDateRate)&&(capt<MaxCaptureDateRate))
		{	//1p hi
			if((times_capture_manchester%2)==0)
			{
				array_subscript=(count_autodection_bit>>3);
				bit_subscript=(count_autodection_bit%8);
				autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));					
			}
			count_autodection_bit++;					
		}
		times_capture_manchester++;		
	}
		
		
		//数据提取:找标志头、找停止位、检查校验和,一旦正确提取数据退出循环
	if(count_autodection_bit>64)
	{
		flag_header_found=0;
		for (j=0;j<(count_autodection_bit-54);j++)		//找标志头9 bit 1
		{
			array_subscript=(j>>3);
			bit_subscript=(j%8);
			if ((autodection_data[array_subscript]&(1<<bit_subscript))==0)	//不等于0,即可判断此位为1
			{
				flag_header_found=1;
				for (k=(j+1);k<(j+10);k++)
				{
					array_subscript=(k>>3);
					bit_subscript=(k%8);
					if ((autodection_data[array_subscript]&(1<<bit_subscript))==0) 
					{
						flag_header_found=0;
					break;	
					}					
				}
				if(flag_header_found==1) break; 					
			}
		}
			
		flag_stop_found=0;
		if (flag_header_found==1)//停止位
		{
			array_subscript=((j+64)>>3);
			bit_subscript=((j+64)%8);
			if ((autodection_data[array_subscript]&(1<<bit_subscript))==0) flag_stop_found=1;
		}
			
		flag_line_check=0;
		if (flag_stop_found==1)	//行校验
		{
			for (k=(j+10);k<(j+60);k=(k+5))
			{
				check=0;
				for(l=k;l<(k+4);l++)
				{
					array_subscript=(l>>3);
					bit_subscript=(l%8);
					check=check^((autodection_data[array_subscript]>>bit_subscript)&1);
				}
				array_subscript=(l>>3);
				bit_subscript=(l%8);
				if ((autodection_data[array_subscript]&(1<<bit_subscript))!=(check<<bit_subscript))	
				{
					flag_line_check=0;
					break;
				}
				flag_line_check=1;					
			}
		}				
				
		flag_column_check=0;
		if (flag_line_check==1)		//列校验
		{
			for(k=(j+10);k<(j+14);k++)
			{
				check=0;
				for(l=k;l<(k+50);l=(l+5))
				{
					array_subscript=(l>>3);
					bit_subscript=(l%8);
					check=check^((autodection_data[array_subscript]>>bit_subscript)&1);							
				}
				array_subscript=(l>>3);
				bit_subscript=(l%8);
				if ((autodection_data[array_subscript]&(1<<bit_subscript))!=(check<<bit_subscript))
				{
					flag_column_check=0;
					break;
				}
				flag_column_check=1;	
			}
		}
				
		if (flag_column_check==1)		//提取数据
		{
			custID=0;
			DataItem[0]=0;DataItem[1]=0;DataItem[2]=0;DataItem[3]=0;
			//客户ID
			bit_number=0;
			for (k=(j+10);k<(j+14);k++)
			{
				array_subscript=(k>>3);
				bit_subscript=(k%8);
				custID=(custID|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
				bit_number++;						
			}
			for (k=(j+15);k<(j+19);k++)
			{
				array_subscript=(k/8);
				bit_subscript=(k%8);
				custID=(custID|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
				bit_number++;						
			}
			//data
			k=0;
			bit_number=0;
			for(l=(j+20);l<(j+59);l++)
			{
				if (((l-j-20)%5)!=4)
				{
					array_subscript=(l>>3);
					bit_subscript=(l%8);
					DataItem[k]=(DataItem[k]|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));								
					bit_number++;
					if (bit_number==8) 
					{
						bit_number=0;
						k++;
					}
				} 
			}						
		}
	}			

	
	
	//向PC返回响应信息
	check_stat=0x14;
	if (flag_column_check==1) 
	{
		check_stat=0;
		flag_column_check=0;
	}
	tx_buff[0]=0x02;
	tx_buff[1]=0x0a;
	tx_buff[2]=0x86;
	tx_buff[3]=check_stat;
	tx_buff[4]=1;				//RF/64
	tx_buff[5]=custID;
	tx_buff[6]=DataItem[3];			//读EM4100数据位倒置
	tx_buff[7]=DataItem[2];
	tx_buff[8]=DataItem[1];
	tx_buff[9]=DataItem[0];
	tx_buff[10]=(tx_buff[1]^tx_buff[2]^tx_buff[3]^tx_buff[4]^tx_buff[5]^tx_buff[6]^tx_buff[7]^tx_buff[8]^tx_buff[9]);
	tx_buff[11]=0x03;
	trace(tx_buff,12);
}

uchar Prepare_Cmd( uchar cmd ) 
{
  	register uchar line_parity;

    *forward_ptr++ = 0;               //start bit
    *forward_ptr++ = 0;               

  	*forward_ptr++ = cmd;
  	line_parity = cmd;
  	cmd >>= 1;
  	*forward_ptr++ = cmd;
  	line_parity ^= cmd;
 	 cmd >>= 1;
  	*forward_ptr++ = cmd;
  	line_parity ^= cmd;
  	*forward_ptr++ = (line_parity & 1);  	
    return 6;                         	
}


uchar Prepare_Addr( uchar addr ) 
{
  	register uchar line_parity;
  	*forward_ptr++ = addr;
  	line_parity = addr;
  	addr >>= 1;  
  	*forward_ptr++ = addr;
  	line_parity ^= addr;
  	addr >>= 1;  
  	*forward_ptr++ = addr;
  	line_parity ^= addr;
  	addr >>= 1;  
  	*forward_ptr++ = addr;
  	line_parity ^= addr;
  	*forward_ptr++ = 0;
  	*forward_ptr++ = 0;
  	*forward_ptr++ = (line_parity & 1);
  	return 7;                      //return number of emited bits
}



uchar Prepare_Data( uint data_low, uint data_hi) 
{
  	register uchar line_parity;
  	register uchar column_parity;
  	register uchar i, j;
  	register uint datas;

  	datas = data_low;
  	column_parity = 0;

  	for(i=0; i<4; i++) 
  	{
    	line_parity = 0;
    	for(j=0; j<8; j++) 
    	{
      		line_parity ^= datas;
      		column_parity ^= (datas&1) << j;
      		*forward_ptr++ = datas;
      		datas >>= 1;
    	}
    	*forward_ptr++ = line_parity;
    	if(i == 1)
      		datas = data_hi;
  	}

  	for(j=0; j<8; j++) 
  	{
    	*forward_ptr++ = column_parity;
    	column_parity >>= 1;
  	}
  	*forward_ptr = 0;

  	return 45;                             //return number of emited bits
}

// Forward Link setup function
// Requires: forwarLink_data filled with valid bits (1 bit per byte)
//           fwd_bit_count set with number of bits to be sent
void SendForward(uchar fwd_bit_count) 
{
	uchar sync=1;
  	fwd_write_ptr = forwardLink_data;
  	fwd_bit_sz = fwd_bit_count;
  	fwd_bit_phase = 3;
  	field_stop = fwd_1st_pulse;		//fwd_1st_pulse = 256-20

	TR0=0;
  	TH0=0xff;TL0=1;          //minimum startup pulse length,255
  	MOD=0;                   
  	TF0=0;                   
  	ET0=0;          		//disable T0 interrupt         
  	TMOD=(TMOD|0x05);			//计数器,16位计数器
  	TR0=1;     

  // waiting for clearing T0IE0 => command sending
  	while (!TF0) 
  	{
    	if ((sync == 1) && (!DEMOD_OUT))  
    		sync = 0;
    	if ((sync == 0) && (DEMOD_OUT))  
    		break;
  	}
  	MOD=1;               	//force 1st mod pulse
  	fwd_bit_sz--;         	//prepare next bit modulation
  	fwd_write_ptr++;
  	TF0=0;                 	//clear any pending flag
  	TR0=0;
  	TH0=0xFF;TL0= field_stop;
  	TR0=1;
  	field_stop = fwd_01_stop;           
  	fwd_bit_phase = 2;
  	ET0=1;                 //enable overflow interrupt

  // waiting for clearing T0IE0 => command sending
  	while ( ET0== 1 ) ;
}


void Wait(uint period) 
{
  	TR2 = 0;                             
   	TF2=0;      
  	TL2=(uchar)(~period);  TH2=(uchar)((~period)>>8);                      
  	currentMaxTimeHi = 0xFF;
   	ET2=1;
  	TR2=1;                    
  	flag_wait=1;
  	while ( flag_wait);   
}

//读卡程序, Manchester解码
void ManchesterRead(void)
{
	uchar i,j;
	uchar	captured_bits_count;
	ClearCaptureBuffers();
	captured_bit_count = 0;
	capture_cnt = 0;
	captured_byte=0;
	capture_check=0;
	capture_check_count=0;
	buffer_capture_check=0;
	compute_capture_check=0;
	check_stat=0;

	for(i=0;i<120;i++)	//2006-5-13 14:19
	{
		capture_time[i]=0xff;
	}	
	
	TR2 = 0; 
	TF2 = 0;      
	TL2 = (uchar)(~maxCaptureTimeLow); 		//0xd7
	TH2 = (uchar)((~maxCaptureTimeLow)>>8);	//0xf0,	//set timer with initial time
	currentMaxTimeHi = ~maxCaptureTimeHi;	//0xff

	last_capture = ~maxCaptureTimeLow; 		//~0x0f28
	capture_read_time_data_ptr = capture_time;		// capture ptr

	flag_wait=1;
	ET2=1; 				//enable t2 interrupt

	check_stat=ERR_EM4469_NEITHER_ACK;		//if read card ok,check_stat will change
	for(i=0;i<0xf0;i++)
	{
		if(DEMOD_OUT == 0)		//等待低电平,超时退出
			break;
	}
	if(i>=0xf0)
	{
		for(i=0;i<120;i++)
		{
			capture_time[i]=0xff;
		}
		return;
	}
	
	for(i=0;i<0xf0;i++)
	{
		if(DEMOD_OUT == 1)		//等待高电平,超时退出
			break;
	}
	if(i>=0xf0)
	{
		for(i=0;i<120;i++)
		{
			capture_time[i]=0xff;
		}
		return;
	}
	
	TR2=1;  //                   
	while ( flag_wait )             //接收
	{
		for(i=0;i<0xf0;i++)
		{
			if(DEMOD_OUT == 0)
				break;
		}
		if(i>=0xf0)
			return;
		capture();					//hi电平时间
		
		for(i=0;i<0xf0;i++)
		{
			if(DEMOD_OUT == 1)
				break;
		}
		if(i>=0xf0)
			return;
		capture();					//low电平时间
	}

	check_stat=ERR_EM4469_NEITHER_ACK;
	for (j=0;j<5;j++)
	{
		if (((j%2)==0)&&(capture_time[j]<MaxCaptureHalfDateRate)\
		&&(capture_time[j+1]<MaxCaptureHalfDateRate)&&(capture_time[j+2]>MaxCaptureHalfDateRate)\
		&&(capture_time[j+3]>MaxCaptureHalfDateRate)&&(capture_time[j+4]>MaxCaptureHalfDateRate)\
		&&(capture_time[j+5]>MaxCaptureHalfDateRate))
		{
			check_stat = UART_MESSAGE_OK;
			break;
		}
		if (((j%2)==0)&&(capture_time[j]<MaxCaptureHalfDateRate)\
		&&(capture_time[j+1]<MaxCaptureHalfDateRate)&&(capture_time[j+2]<MaxCaptureHalfDateRate)\
		&&(capture_time[j+3]<MaxCaptureHalfDateRate)&&(capture_time[j+4]<MaxCaptureHalfDateRate)\
		&&(capture_time[j+5]<MaxCaptureHalfDateRate)&&(capture_time[j+6]<MaxCaptureHalfDateRate)\
		&&(capture_time[j+7]<MaxCaptureHalfDateRate)&&(capture_time[j+8]>MaxCaptureHalfDateRate))
		{
			check_stat = ERR_EM4469_NACK;
			break;		
		}
	}	

	captured_bits_count=0;
	if (check_stat==UART_MESSAGE_OK)
	{
		//解码
		for (i=(j+6);;i++)
		{
			if (capture_time[i]<MaxCaptureHalfDateRate)
			{
				if((i%2)==0)	
				{
					store_bit(0);
				}
				else
				{
					store_bit(1);
				}
				i++;
				captured_bits_count++;
				if (captured_bits_count>45) //45位数据结构,参考EM4469文档
					break;
			}
			else if((capture_time[i]>MaxCaptureHalfDateRate) &&(capture_time[i]<MaxCaptureDateRate))
			{
				if((i%2)==0)	
				{
					store_bit(1);
				}
				else
				{
					store_bit(0);
				}
				captured_bits_count++;
				if (captured_bits_count>45) //45位数据结构,参考EM4469文档
					break;
			}
			else  
			{
				check_stat=ERR_EM4469_FLOWLINK_ERR;
				break;
			}
		}
	}

	if ((check_stat!=ERR_EM4469_NEITHER_ACK)&&(check_stat!=ERR_EM4469_NACK)&&(check_stat!=ERR_EM4469_FLOWLINK_ERR))
	{
		if (((capture_check&0x10)!=0)||((compute_capture_check&0x0f)!=(capture_check&0x0f)))
		{
			check_stat=ERR_EM4469_PARITY_ERR;
		}
		else
		{			//capture_data[4] CRC
			if ((capture_data[0]^capture_data[1]^capture_data[2]^capture_data[3])!=capture_data[4])
			{
				check_stat=ERR_EM4469_PARITY_ERR;
			}
			else
			{
				check_stat=UART_MESSAGE_OK; //读卡成功
			}
		}
	}
	//trace(capture_time,120);
	//trace(capture_data,32);
	for(i=0;i<120;i++)
	{
		capture_time[i]=0xff;
	}
}

//写卡程序,Manchester解码
void ManchesterWrite(void)
{
	uchar i,j;
	ClearCaptureBuffers();
	captured_bit_count = 0;
	capture_cnt = 0;
	captured_byte=0;
	capture_check=0;
	capture_check_count=0;
	buffer_capture_check=0;
	compute_capture_check=0;
	check_stat=0;
	TR2 = 0; 
	TF2=0;      //clear pending interrupts
	TL2=(uchar)(~maxCaptureTimeLow); TH2=(uchar)((~maxCaptureTimeLow)>>8) ;             //set timer with initial time
	currentMaxTimeHi = ~maxCaptureTimeHi;
	last_capture=~maxCaptureTimeLow; 
	capture_read_time_data_ptr=capture_time;
	flag_wait=1;ET2=1;

	for(i=0;i<0xf0;i++)
	{
		if(DEMOD_OUT == 0)		//等待低电平,超时退出
			break;
	}
	if(i>=0xf0)
	{
		for(i=0;i<120;i++)
		{
			capture_time[i]=0xff;
		}
		return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -