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

📄 main.c

📁 功能:arm7平台的I2c驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	speak_on();
}

void Readonly_autodetection(void)
{
	uchar i,j,k,l;
	
	uchar idata autodection_data[32];
	uchar array_subscript;	//小标
	uchar bit_subscript;		
	uint capt;
  	uint icr; 
	bit flag_RO_last_capt_half=0;		
	uchar count_autodection_bit=0;
	bit flag_header_found=0;		
	bit flag_stop_found=0;		
	bit flag_line_check=0;		
	bit flag_column_check=0;		
	uchar check=0;		
	uchar custID=0;
	uchar idata DataItem[4]={0,0,0,0};
	uchar bit_number;
	bit flag_tag_datarate_bigger;		
	bit flag_invalid_edge_manchester;	
	uchar times_capture_manchester;	
   
	//halfDataRate = 32;//config_data_rate+1;
	MaxCaptureHalfDateRate = 48;//halfDataRate+(halfDataRate>>1);
	MaxCaptureDateRate = 80;//halfDataRate+halfDataRate+(halfDataRate>>1);
	//lwr = 7;//config_lwr;
	//maxTDefaultRead = 0x3000;//2*((lwr-4)*4*8)*2*((uint32)halfDataRate);
	maxCaptureTimeLow = 0x3000;//(uint)maxTDefaultRead; 
  	maxCaptureTimeHi = 0x30;//(uchar)(maxTDefaultRead >> 16);
	last_capture = 0xcfff;//~maxCaptureTimeLow; 
	TF2 = 0;
	TR2 = 0; 	 	      
	TL2 = 0xff;//(uchar)(~maxCaptureTimeLow); 
	TH2= 0xcf;//(uchar)((~maxCaptureTimeLow)>>8) ;          
	currentMaxTimeHi = 0xcf;//~maxCaptureTimeHi;		 
	flag_tag_datarate_bigger=0;
	
	for(j=0;j<32;j++)		
	{
		autodection_data[j]=0;
	}
	for(i=0;i<0xf8;i++)
	{
		if(DEMOD_OUT == 0)		//等待低电平,超时退出
			break;
	}
	if(i>=0xf0)
	{
		return_00();
		return;
	}
	for(i=0;i<0xf8;i++)
	{
		if(DEMOD_OUT == 1)		//等待高电平,超时退出
			break;
	}
	if(i>=0xf0)
	{
		return_00();
		return;
	}
	ET2=1;
	TR2=1;					//counter 2 start run,interrupt enable
	flag_wait=1;
	
	while(flag_wait)		//counter 2 is runing 
	{
		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)&&(capt<MaxCaptureDateRate)) 
			break;	//1p hi,64个时钟
		for(i=0;i<0xf8;i++)
		{
			if(DEMOD_OUT == 1)		//等待高电平,超时退出
				break;
		}
		if(i>=0xf0)
		{
			return_00();
			return;
		}
		
		icr=count_module(); 
		capt=icr-last_capture;
		last_capture=icr;				
	}
		
	flag_RO_last_capt_half=0;
	flag_invalid_edge_manchester=0;
	count_autodection_bit=0;
	array_subscript=0;
	bit_subscript=0;
		
//	//manchester
	times_capture_manchester=0;
	while(flag_wait)				//counter 2 is runing 
	{
		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=7;
			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=7;
			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));								
					
					if (bit_number==0) 
					{
						bit_number=7;
						k++;
					}else bit_number--;
				} 
			}						
		}
	}			

	
	
	//{向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[0];			//
	tx_buff[7]=DataItem[1];
	tx_buff[8]=DataItem[2];
	tx_buff[9]=DataItem[3];
	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;
  	}

⌨️ 快捷键说明

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