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

📄 main.c

📁 功能:arm7平台的I2c驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
  	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;
	}
	cap_count = 0;
	TR2=1;  //                   
	while ( flag_wait )             //接收
	{
		for(i=0;i<0xf0;i++)
		{
			if(DEMOD_OUT == 0)
				break;
		}
		if(i>=0xf0)
			return;
		capture();					//hi电平时间
		cap_count++;
		for(i=0;i<0xf0;i++)
		{
			if(DEMOD_OUT == 1)
				break;
		}
		if(i>=0xf0)
			return;
		capture();					//low电平时间
		cap_count++;
		if(cap_count > 120)
			break;	
	}

	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;
	}

	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)
		{
			for(i=0;i<120;i++)
			{
				capture_time[i]=0xff;
			}
			return;
		}

		capture();

		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;
		}

		capture();
	}


	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)&&(capture_time[j+6]<MaxCaptureHalfDateRate)\
		&&(capture_time[j+7]<MaxCaptureHalfDateRate)&&(capture_time[j+8]>MaxCaptureHalfDateRate))
		{
			check_stat = ERR_EM4469_NACK;
			break;		
		}
	}	
	if (check_stat != ERR_EM4469_NACK)
	{
		for (j=0;j<76;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))
			{
				check_stat = UART_MESSAGE_OK;
				break;
			}
		}
	}

	for(i=0;i<120;i++)
	{
		capture_time[i]=0xff;
	}
}



void ClearCaptureBuffers(void) 
{
  	uchar i;
  	for(i=0; i<CAPTURE_SIZE; i++) 
  	{
    	capture_data[i] = 0;
  	}
}

void capture(void)
{
	uint capt;
	uint icr = count_module();   
	  
	capt = icr - last_capture;
	last_capture = icr;               		
	*capture_read_time_data_ptr++=capt;		//保存高低电平的时间(以125K的脉冲个数),ptr++
}


//保存解码数据
void store_bit(bit b)
{	
	if (captured_bit_count==8)
	{
		if (b==1) 
			capture_check=capture_check|(1<<capture_check_count);
		capture_check_count++;
		captured_bit_count = 0;
	}
	else
	{
		buffer_capture_check=buffer_capture_check^b;
		if(b==1) 
			captured_byte = captured_byte|(1<<captured_bit_count);
		if (captured_bit_count==7)
		{
			capture_data[capture_cnt++] = captured_byte;
			captured_byte=0;
			if(buffer_capture_check==1) compute_capture_check=compute_capture_check|(1<<capture_check_count);
			buffer_capture_check=0;
		}
		captured_bit_count++;	
	}
}

uint count_module(void)
{
	do
	{
		count_timer2.bytes.high2 = TH2;
		count_timer2.bytes.low2 = TL2;
	}while(count_timer2.bytes.high2 != TH2);
	return count_timer2.word;
}

//读取本DEMO读卡器的软件版本,硬件版本,日期等信息
void ReadStatusToPC(void)
{
	tx_buff[0]=0x02;
	tx_buff[1]=0x08;
	tx_buff[2]=0xfd;
	tx_buff[3]=0x00;
	tx_buff[4]=READER_RELEASE;		
	tx_buff[5]=READER_DATE | ((READER_MONTH & 0x07) << 5);
	tx_buff[6]=(READER_MONTH >> 3) | (READER_YEAR << 1);
	tx_buff[7]=READER_FAMILY;		
	tx_buff[8]=(tx_buff[1]^tx_buff[2]^tx_buff[3]^tx_buff[4]^tx_buff[5]^tx_buff[6]^tx_buff[7]);
	tx_buff[9]=0x03;
	trace(tx_buff,10);
}


//从串口发送数据出去
void trace(uchar *str,uchar len)
{
	uint i;
	MYTI = 0;
	for(i=0;i<len;i++)
	{
		myputchar(*str);
		str++;
	}
}

//trace调用
void myputchar(uchar c)
{	
	//ES = 0;
	SBUF = c;
	while (MYTI == 0);
	MYTI = 0;
	//ES = 1;
}

void speak_on(void)
{
	uint xdata i;	
	speak = 0;
	for(i = 0;i<0xfff;i++);
	speak = 1;
}

// 返回无卡信息
void return_00(void)
{
	tx_buff[0]=0x02;
	tx_buff[1]=0x0a;
	tx_buff[2]=0x86;
	tx_buff[3]=0x14;		//无卡 或 错误
	tx_buff[4]=1;
	tx_buff[5]=0;
	tx_buff[6]=0;
	tx_buff[7]=0;
	tx_buff[8]=0;
	tx_buff[9]=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);
}

⌨️ 快捷键说明

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