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

📄 yt_temep.c.bak

📁 完成数据的采集
💻 BAK
字号:
#include"includes.h"
#include"ytep.h"
#include"ytepfunction.h"
#define  yt_TemEp_file


u8	FM_TAB[]={0,0,0,0,55,3,10,10,65,1,
				1,1,0,0,0,0,0,0,0,0,0,146};
///////////////////////////////////
void  GPIO_InOut(GPIO_TypeDef* GPIOx,Int16U GPIO_Bit,Int8U GPIO_Speed_value,Int16U GPIO_InOut)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin =GPIO_Bit;
  GPIO_InitStructure.GPIO_Speed = (GPIOSpeed_TypeDef)GPIO_Speed_value;
  GPIO_InitStructure.GPIO_Mode=(GPIOMode_TypeDef)GPIO_InOut;  //GPIO_Mode_Out_PP;
  GPIO_Init(GPIOx, &GPIO_InitStructure);  //setion output
}
 
////////////////////////////////////////////////
void START_SHT(Tem *IO_Tem)
{
	GPIO_InOut(IO_Tem->IOD,1<<IO_Tem->IO_D,1,GPIO_Mode_Out_PP);//IO_I2CD,GPIO_Pin_I2CD,1,GPIO_Mode_Out_PP
	GPIO_InOut(IO_Tem->IOC,1<<IO_Tem->IO_C,1,GPIO_Mode_Out_PP);

	Set_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D); 
	delay(20);
	Set_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);  
	delay(20);
	Clr_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D);   
	delay(20);
	Clr_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);  
	delay(20);	
	Set_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C); 
	delay(20);
	Set_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D);
	delay(20);
	Clr_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);  	
  delay(20);
}
Int8U	SHTA_ack(Tem *IO_Tem)
{
  Int8U z=0;
	GPIO_InOut(IO_Tem->IOD,1<<IO_Tem->IO_D,0,GPIO_Mode_IN_FLOATING);
	delay(20);
	Set_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
	delay(20);
	z=GPIO_ReadInputDataBit(IO_Tem->IOD,1<<IO_Tem->IO_D);	
	Clr_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);  	
	GPIO_InOut(IO_Tem->IOD,1<<IO_Tem->IO_D,1,GPIO_Mode_Out_PP);
	Set_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D);
  return z;
}
////////////////////////////////
Int8U Write_SHT(const Int8U	data,Tem *IO_Tem)
{
	Int8U x,y,x1;
	y=data;
	for(x1=0;x1<3;x1++)
	{
	 	for(x=0;x<8;x++)
	 	{
			if(y&0x80)Set_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D);
			else      Clr_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D);
			y<<=1;
			Set_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
			delay(20);
			Clr_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
			delay(20);
	 	}
	  	y=SHTA_ack(IO_Tem);
	  	if(y==0)return 0;
	  	y=data;
	  	START_SHT(IO_Tem);
	 }
	 return 1;	
}
Int8U	Read_SHT(Tem *IO_Tem,Int8U xyz)//xyz=0 is temperature,xyz=1 is humidity
{
	Int8U x,x1,y;
	Int32U x1_data=0;
	
	for(x1=0;x1<3;x1++)
	{
   	GPIO_InOut(IO_Tem->IOD,1<<IO_Tem->IO_D,0,GPIO_Mode_IN_FLOATING);
   	for(x=0;x<8;x++)
   	{
   		x1_data<<=1;
   		delay(20);
   		Set_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
   		delay(20);
   		y=GPIO_ReadInputDataBit(IO_Tem->IOD,1<<IO_Tem->IO_D);
   		if(y!=0)x1_data|=1;
   		Clr_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
   	}
   	GPIO_InOut(IO_Tem->IOD,1<<IO_Tem->IO_D,1,GPIO_Mode_Out_PP);
   	Clr_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D);
   	delay(20);
   	Set_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
   	delay(20);
   	Clr_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
   	delay(20);
	}
		GPIO_InOut(IO_Tem->IOD,1<<IO_Tem->IO_D,1,GPIO_Mode_Out_PP);
	  delay(20);
	  Set_bit((IO_Tem->IOD)->ODR,IO_Tem->IO_D);
	  delay(20);
	  Set_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
   	delay(20);
   	Clr_bit((IO_Tem->IOC)->ODR,IO_Tem->IO_C);
   	x=0x80;                   //如是8位x=0x80,12位则x=0
   	if(xyz==0)x=crc8(3,x);  //Tempertion
   	else			x=crc8(5,x);  //RH
   	y=(Int8U)(x1_data>>16);
   	x=crc8(y,x);//第一字节,命令字节
   	y=(Int8U)(x1_data>>8);//
   	x=crc8(y,x);
   	x=swapcrc(x); 
   	y=(Int8U)(x1_data&0xff);	
   	if(x==y)
   	{
   		x1_data=x1_data>>8;
   		if(xyz==0)IO_Tem->Temperature=account_Temp((Int16U)x1_data,0);
	  	else      IO_Tem->Humidity=account_RH((Int16U)x1_data,0);
	  	return 0;
   	}else
   	 return  0XFF;
}
/////////////////////////////////
//-----------------------------------------------
// crc caculate
//-----------------------------------------------
Int8U crc8(Int8U byte,Int8U crc8)
{
 Int8U i;
 volatile Int8U temp;
 crc8^=byte;
 for(i=0;i<8;i++)
 {
  temp=crc8;
  crc8<<=1;
  if((temp&0x80)!=0)
   crc8^=0x31;
 }
 return crc8;
}
//-----------------------------------------------
// swap crc byte
//-----------------------------------------------
Int8U swapcrc(Int8U byte)
{
 Int8U i;
 Int8U temp=0;
 
 for (i=0x80;i>0;i/=2)
 {
  if((byte&i)!=0)
   temp|=0x80;
  if(i==0x01)
   break;
  temp>>=1;
  temp&=0x7f;
 }
 return temp;
}
////////////////////////////////xb is 12bit or 8bit
Int8U account_Temp(Int16U xa,Int8U xb)
{
	if(xb==1)             //14bit
		xa&=0x3fff;
	else
		xa&=0x0fff;
	if(xb==0)
		xa<<=2;
	xa=xa/100;    //t=d1+d2*0.04 d1=-40
	xa&=0x00ff;
	return xa;
}
////////////////////////////////
Int8U account_RH(Int16U xa,Int8U xb)
{
	if(xb==1)
	xa>>=4;
	xa&=0x00ff;            //8bit
	if(xa<=107)
	{
		xa=xa*143;
	  if(xa<512)return 2;
	  xa=xa-512; 	
	}
	else
	{
		xa=xa*111;
		xa+=2893;
	}
	 xa>>=8;
	 xa&=0x00ff;
	 return xa;
}
///////////////////////////////////////////////
void		Test_error(const	Int8U x,Tem *IO_Tem)
{
	if(x==0)IO_Tem->counter_error=0,IO_Tem->Error=0;
	else
		{
			if(++(IO_Tem->counter_error)>=10)
			IO_Tem->Error=TRUE;	
		}
}
///////////////////////////////////////////////
void read_SHT_data()
{
	volatile Int8U a_sht;
	static 	 Int8U  Timecounter;
	if(++Timecounter>=20)Timecounter=0;
	switch(Timecounter)
	{
		case 0:
			a_sht=Read_SHT(&TemRHA,1);
			Test_error(a_sht,&TemRHA);
			START_SHT(&TemRHA);			
			a_sht=Write_SHT(6,&TemRHA);
			a_sht=Write_SHT(1,&TemRHA);	
			a_sht=Write_SHT(3,&TemRHA);
			Test_error(a_sht,&TemRHA);							 				
		break;
		case 1:
			a_sht=Read_SHT(&TemRHA,0);
			Test_error(a_sht,&TemRHA);
			break;
		case 19:
			START_SHT(&TemRHA);
			a_sht=Write_SHT(5,&TemRHA);		 
			Test_error(a_sht,&TemRHA);		 			
			break;
	
				
	 }
	 if(TemRHA.Error==0)
         {
           A_RHbuf=TemRHA.Humidity;
           //A_Tembuf=TemRHA.Temperature;
           A_Tembuf=TemRHA.Temperature;
           //if(TemRHA.Temperature>=40)
           //A_Tembuf=TemRHA.Temperature-40;
           //else     A_Tembuf=0;
         }
	 else	    A_Tembuf=TemRHA.Temperature=A_RHbuf=TemRHA.Humidity=0xff;
}	
/////////////////////////////////////////////////////////


void sta( )/*启动I2C总线*/
{
 Set_bit(IO_I2CD->ODR,I2CD);//SDA_S;
 Set_bit(IO_I2CC->ODR,I2CC);//SCL_S ;
 delay(20);
 Clr_bit(IO_I2CD->ODR,I2CD);//SDA_C;
 delay(20);
 Clr_bit(IO_I2CC->ODR,I2CC);//SCL_C;
 delay(20);
}

void stop( ) /*stop i2c*/
{
	Clr_bit(IO_I2CD->ODR,I2CD);//SDA_C;
	Set_bit(IO_I2CC->ODR,I2CC);//SCL_S;
	delay(20);
	Set_bit(IO_I2CD->ODR,I2CD);//SDA_S;
	delay(20);
	Clr_bit(IO_I2CC->ODR,I2CC);//SCL_C;
  delay(20);
}

void mack()/*发送应答位*/
{
	Clr_bit(IO_I2CD->ODR,I2CD);//SDA_C;
	Set_bit(IO_I2CC->ODR,I2CC);//SCL_S;
	delay(20);
	Clr_bit(IO_I2CC->ODR,I2CC);//SCL_C;
	Set_bit(IO_I2CD->ODR,I2CD);//SDA_S;
  delay(20);
}

void mnack()/*发送非应答位*/
{
	Set_bit(IO_I2CD->ODR,I2CD);//SDA_D;
	Set_bit(IO_I2CC->ODR,I2CC);//SCL_S;
	delay(20);
	Clr_bit(IO_I2CC->ODR,I2CC);//SCL_C;
	Clr_bit(IO_I2CD->ODR,I2CD);//SDA_C;
  delay(20);
}

Int8U cack()/*应答位检查*/
{
 Int8U c;
 	GPIO_InOut(IO_I2CD,GPIO_Pin_I2CD,0,GPIO_Mode_IN_FLOATING);//SDA_IN;
	delay(20);
	Set_bit(IO_I2CC->ODR,I2CC);//SCL_S;
	c=0;
  delay(20);
	if(Get_bit(IO_I2CD->IDR,I2CD)!=0)    //check sda
  c=1;
	Clr_bit(IO_I2CC->ODR,I2CC);//SCL_C;
	GPIO_InOut(IO_I2CD,GPIO_Pin_I2CD,1,GPIO_Mode_Out_PP);//SDA_OUT;
	delay(20);
	return c;
}
/*向虚拟I2C总线上发送1个数据字节*/
void WRBYT(Int8U z)
{
	Int8U i;
	for(i=0;i<8;i++)
	{
	if((z&0x80)>0)Set_bit(IO_I2CD->ODR,I2CD);//SDA_S;
	else					Clr_bit(IO_I2CD->ODR,I2CD);//SDA_C;
	Set_bit(IO_I2CC->ODR,I2CC);//SCL_S;
	delay(20);
	Clr_bit(IO_I2CC->ODR,I2CC);//SCL_C;
	z=z<<1;
	delay(20);
  }
}
/*从I2C总线上读取1个数据字节*/
Int8U RDBYT()
{
	Int8U nn=0;
	Int8U j;
	GPIO_InOut(IO_I2CD,GPIO_Pin_I2CD,0,GPIO_Mode_IN_FLOATING);//SDA_IN;
	for(j=0;j<8;j++)
	{
		Set_bit(IO_I2CC->ODR,I2CC);///SCL_S;
		delay(20);
		if(Get_bit(IO_I2CD->IDR,I2CD)==0)nn&=0XFE; 
  	else														 nn|=1;
  	if(j!=7)
  	nn<<=1;
  	Clr_bit(IO_I2CC->ODR,I2CC);//SCL_C;
  	delay(20);
	}
	GPIO_InOut(IO_I2CD,GPIO_Pin_I2CD,1,GPIO_Mode_Out_PP);//SDA_OUT;
	return(nn);
}


/*向虚拟I2C总线上发送n个字节的数据*///WRNBYT(0XA0,0,&FM[0],16);
Int8U WRNBYT(Int8U i2c,Int8U i2cadd,Int8U *pos,Int8U number)
{
	Int8U slaw,k,F0,ct_i2c;
	
	k=i2c,ct_i2c=0;
	do
	{
		sta();
		WRBYT(k);
		F0=cack(); 
		ct_i2c++;      
	}while(F0==1&&ct_i2c<5);
	if(ct_i2c>=5)return 1;
		
	slaw=i2cadd,ct_i2c=0;
	do
	{
		WRBYT(slaw);
		F0=cack( );
		ct_i2c++;
	}while(F0==1&&ct_i2c<5);
  if(ct_i2c>=5)return 1; 
  	
	for(k=0;k<number;k++)
	{
		WRBYT(*pos);
		F0=cack( );
		++pos;
	}
	stop();
	return 0;
}
/*从虚拟I2C总线上读取n个字节的数据*/
void RDNBYT(Int8U slar,Int8U subaddr,Int8U *qq,Int8U number)
{
 Int8U rl,F0,ct_i2c;
 
 rl=slar,ct_i2c=0;
 do{
 sta();
 WRBYT(rl);
 F0=cack();
 ct_i2c++;
 }while(F0==1&&ct_i2c<5);
 
 if(slar==0xa0)
 {	
 	do
 	{  
 		WRBYT(subaddr);
 		F0=cack();
 		ct_i2c++;
 	}while(F0==1&&ct_i2c<5);
 }
	if(slar==0x64)slar=4;
	else          slar=0xa1;
	if(slar==0xa1)sta();	
	do
	{
 		WRBYT(slar);
 		F0==cack();
 		ct_i2c++;
	}while(F0==1&&ct_i2c<10);

for(rl=0;rl<number-1;rl++)
{ 
 *qq=RDBYT();
 ++qq;
 mack();
}
 *qq=RDBYT();
	mnack();
	stop();
}




////////////////////////////////////////////////////////
void	ReadYear(Int8U *year_buf)
{
#if STM_I2C
	ReadI2C(0X64,0,year_buf,16) ;
#else
	RDNBYT(0x64,0,year_buf,16);
#endif
}




void	WriteYear(Int8U *year_buf) 
{
#if	STM_I2C
	WriteI2C(0X64,0,year_buf,16);
#else	
	WRNBYT(0X64,0,year_buf,16);
#endif
}

Int16U	InitYear(Int8U	*year_buf)
{
	Int8U a;
	
#if STM_I2C
	ReadI2C(0X64,0,year_buf,16) ;
#else
	RDNBYT(0x64,0,year_buf,16); 
#endif	
	a=0x20;
#if	STM_I2C
  WriteI2C(0x64,0XE0,&a,1);
#else	
	WRNBYT(0x64,0XE0,&a,1);
#endif 	
delay_nop(1000);
	return 0;
}

 

Int16U	ReadFM24C04(_yt *DATA)
{
  Int16U a,b,c,m;
  Int8U  FM[22];
	for(m=0;m<3;m++)
	{
		//WriteFM24C04(C_FM24C04,&_YT) ;    
#if  STM_I2C
		ReadI2C(0XA0,0,&FM[0],22);
#else		
		RDNBYT(0xA0,0,&FM[0],22);
#endif		
		for(a=0,b=0;a<20;a++)b+=FM[a];
		c=FM[20]<<8,c+=FM[21];
		
		if(b==c)
		{
			DATA->Sensor[0].Type=FM[0];
			DATA->Sensor[1].Type=FM[1];
			DATA->Sensor[2].Type=FM[2];
			DATA->Sensor[3].Type=FM[3];
			DATA->_TemOver=FM[4];
			DATA->_TemFast=FM[5];
			DATA->_TemTime=FM[6];
			DATA->_TemRoom=FM[7];
      DATA->_TemFault=FM[8];
			DATA->_Channal=FM[9]*0X100;
			DATA->_Channal+=FM[10];
			DATA->_Yorder=FM[11];
			DATA->_Address=FM[12];
			DATA->_Facility=FM[13];
      DATA->_Rate=FM[14];
			return  FALSE;
		}
		else
		{
			WRNBYT(0XA0,0,&FM_TAB[0],22);
			delay_nop(1000);
		}
		
	}
	return 		TRUE;
}




Int16U	WriteFM24C04(Int16U Flag,_yt*DATA)
{
	Int8U  I2CDATA[22];
	Int16U a;
	Int32U b;
	if(Flag!=C_FM24C04)return 0;

		I2CDATA[0]=DATA->Sensor[0].Type;
		I2CDATA[1]=DATA->Sensor[1].Type;
		I2CDATA[2]=DATA->Sensor[2].Type;
		I2CDATA[3]=DATA->Sensor[3].Type;
		I2CDATA[4]=(Int8U)DATA->_TemOver&0XFF;
		I2CDATA[5]=(Int8U)DATA->_TemFast&0xff;
		I2CDATA[6]=(Int8U)DATA->_TemTime&0XFF;
		I2CDATA[7]=(Int8U)DATA->_TemRoom&0xff;		
		I2CDATA[8]=(Int8U)DATA->_TemFault&0xff;
		
		I2CDATA[9]=DATA->_Channal/0X100;
		I2CDATA[10]=(Int8U)DATA->_Channal&0XFF;
		I2CDATA[11]=(Int8U)DATA->_Yorder&0xff;
		I2CDATA[12]=(Int8U)DATA->_Address&0xff;
		I2CDATA[13]=(Int8U)DATA->_Facility&0xff;
		I2CDATA[14]=(Int8U)DATA->_Rate&0xff;
		
		for(a=0,b=0;a<20;a++)b+=(Int32U)I2CDATA[a];
		b&=0xffff;
		I2CDATA[20]=(Int8U)(b>>8),I2CDATA[21]=(Int8U)(b&0XFF);
#if	STM_I2C	 
		WriteI2C(0XA0,0,I2CDATA,22);
#else		
		WRNBYT(0xA0,0,&I2CDATA[0],22);
#endif		
		return 0;
		
}
 
 
 
 
 
#if      0  
void	WriteI2C(Int16U ComponentAddress,Int8U	SubAddress,Int8U	*FM,Int8U	I2Clen)
{
	Int8U		len;
  I2C_GenerateSTART(I2C1, ENABLE); /* Send START condition */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//while((((u32)(I2C1->SR2) << 16) | (u32)(I2C1->SR1) & 0x00FFFFBF) != I2C_EVENT_MASTER_MODE_SELECT); 
  I2C_Send7bitAddress(I2C1, ComponentAddress, I2C_Direction_Transmitter);//发送方向 
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/* EV6 */  /* Test on EV6 and clear it */   
  I2C_SendData(I2C1, SubAddress); /* Send the RTC Internal address 0 */    
  while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* EV8 *//* Test on EV8 and clear it */

  for(len=0;len<I2Clen;++len)
  {  	
  	I2C_SendData(I2C1, *FM);  
  	while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	}
  I2C_GenerateSTOP(I2C1, ENABLE);
}

 void	ReadI2C(Int16U ComponentAddress,Int16U	SubAddress,Int8U	*FM,Int8U	I2Clen)
{
	Int8U		len;

  I2C_AcknowledgeConfig(I2C1,ENABLE); /* Enable I2C1 acknowledgement if it is already disabled by other function */  
  I2C_GenerateSTART(I2C1, ENABLE);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  /* EV5 */
  I2C_Send7bitAddress(I2C1,ComponentAddress,I2C_Direction_Transmitter);  
  asm("nop");
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /* EV6 */ /* Test on I2C1 EV6 and clear it */
  asm("nop");
  
  if(ComponentAddress==0xa0)
  	{
  		I2C_SendData(I2C1,SubAddress);
  		while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  		I2C_GenerateSTART(I2C1, ENABLE);
  		while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  		I2C_Send7bitAddress(I2C1,ComponentAddress+1,I2C_Direction_Receiver);  
  		while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); 
  	}
  
  for(len=0;len<I2Clen;++len)//++FM)
  {
  	/* EV7 */*FM=
    I2C_ReceiveData(I2C1);
    I2C_AcknowledgeConfig(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));  
  }

    I2C_AcknowledgeConfig(I2C1, DISABLE);
    I2C_GenerateSTOP(I2C1, ENABLE);
    
}   
#endif  





	
	

⌨️ 快捷键说明

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