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

📄 yt_temeprom.c

📁 完成数据的采集
💻 C
字号:

//////////////////////////////////

///////////////////////////////////
void  GPIO_InOut(GPIO_TypeDef* GPIOx,GPIO_Bit,Int8U GPIO_Speed_value,Int8U 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 = GPIO_InOut;  //GPIO_Mode_Out_PP;
  GPIO_Init(GPIOx, &GPIO_InitStructure);  //setion output
}
 
////////////////////////////////////////////////
void START_SHT(Tem *IO_Tem)
{
	GPIO_InOut(IO_Tem->IOD,BTemData,1,GPIO_Mode_Out_PP);
	GPIO_InOut(IO_Tem->IOC,BTemClk,1,GPIO_Mode_Out_PP);
	
	Set_bit((*IO_Tem->IOD)->ODR,BTemData); 
	delay_nop(100);
	Set_bit((*IO_Tem->IOC)->ODR,BTemClk);  
	delay_nop(100);
	Clr_bit((*IO_Tem->IOD)->ODR,BTemData);   
	delay_nop(100);
	Clr_bit((*IO_Tem->IOC)->ODR,BTemClk);  
	delay_nop(100);	
	Set_bit((*IO_Tem->IOC)->ODR,BTemClk); 
	delay_nop(100);
	Set_bit((*IO_Tem->IOD)->ODR,BTemData);
	delay_nop(100);
	Clr_bit((*IO_Tem->IOC)->ODR,BTemClk);  	
}
Int8U	SHTA_ack(Tem *IO_Tem)
{
  Int8U z=0;
	GPIO_InOut(IO_Tem->IOD,BTemClk,0,GPIO_Mode_In);
	delay_nop(100);
	Set_bit((*IO_Tem->IOC)->ODR,BTemClk);
	delay_nop(100);
	z=GPIO_ReadInputDataBit(IO_Tem->IOD,BTemData);	
	Clr_bit((*IO_Tem->IOC)->ODR,BTemClk);  	
	GPIO_InOut(IO_Tem->IOD,BTemData,1,GPIO_Mode_Out_PP);
	Set_bit((*IO_Tem->IOD)->ODR,BTemData);
  return z;
}
////////////////////////////////
Int8U Write_SHT(const Int8U	data,Tem *IO_Tem)
{
	Int8U x,y;
	y=data;
	for(x1=0;x1<3;x1++)
	{
	 	for(x=0;x<8;x++)
	 	{
			if(y&0x80)Set_bit((*IO_Tem->IOD)->ODR,BTemData);
			else      Clr_bit((*IO_Tem->IOD)->ODR,BTemData);
			y<<=1;
			Set_bit((*IO_Tem->IOC)->ODR,BTemClk);
			delay_nop(100);
			Clr_bit((*IO_Tem->IOC)->ODR,BTemClk);
	 	}
	  	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;
	Int32U x1_data=0;
	
	for(x1=0;x1<3;x1++)
	{
   	GPIO_InOut(IO_Tem->IOC,BTemClk,0,GPIO_Mode_In);
   	for(x=0;x<8;x++)
   	{
   		x1_data<<=1;
   		delay_nop(100);
   		Set_bit((*IO_Tem->IOC)->ODR,BTemClk);
   		delay_nop(100);
   		y=GPIO_ReadInputDataBit((*IO_Tem->IOD),B_TemData);
   		if(y!=0)x1_data|=1;
   		Clr_bit((*IO_Tem->IOC)->ODR,BTemClk);
   	}
   	GPIO_InOut(IO_Tem->IOC,BTemClk,1,GPIO_Mode_Out_PP);
   	Clr_bit((*IO_Tem->IOD)->ODR,BTemData);
   	delay_nop(100);
   	Set_bit((*IO_Tem->IOC)->ODR,BTemClk);
   	delay_nop(100);
   	Clr_bit((*IO_Tem->IOC)->ODR,BTemClk);
   	delay_nop(100);
	}
		GPIO_InOut(IO_Tem->IOC,BTemClk,1,GPIO_Mode_Out_PP);
	  delay_nop(100);
	  Set_bit((*IO_Tem->IOD)->ODR,BTemData);
	  delay_nop(100);
	  Set_bit((*IO_Tem->IOC)->ODR,BTemClk);
   	delay_nop(100);
   	Clr_bit((*IO_Tem->IOC)->ODR,BTemClk);
   	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(uint 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(uint 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>=15)Timecounter=0;
	switch(Timecounter)
	{
		case 0:
			START_SHT(&TemRHA);
			a_sht=Write_SHT(6,&TemRHA);
			a_sht=Write_SHT(1,&TemRHA);	
			Test_error(a_sht,&TemRHA);		 			
			break;
		case 1:
			a_sht=Read_SHT(&TemRHA,0);
			TTest_error(a_sht,&TemRHA);
			break;
		case 13:
			START_SHT(&TemRHA);
			a_sht=Write_SHT(5,&TemRHA);		 
			Test_error(a_sht,&TemRHA);		 			
			break;
		case 14:	
			a_sht=Read_SHT(&TemRHA,1);
			Test_error(a_sht,&TemRHA);
			break;	
	 }
	 if(TemRHA->Error==0)A_Tembuf=TemRHA->Temperature,A_RHbuf=TemRHA->Humidity;	 
	 else								 A_Tembuf=TemRHA->Temperature=A_RHbuf=TemRHA->Humidity=0xff;
}	
	
	
//////////////////////
//Int8U	eeprom(Int8U ee){
//	if(ee==0)return 0;
//	wrnbyt(0,&yt[6],8,0x64);
//	return   0;
//}
//////////////////////
void sta( )/*启动I2C总线*/
{
 SDA_S;
 SCL_S ;
 delay_nop(100);
 SDA_C;
 delay_nop(100);
 SCL_C;
 delay_nop(100);
}

void stop( ) /*stop i2c*/
{
	SDA_C;
	SCL_S;
	delay_nop(100);
	SDA_S;
	delay_nop(100);
	SCL_C;
  delay_nop(100);
}

void mack()/*发送应答位*/
{
	SDA_C;
	SCL_S;
	delay_nop(100);
	SCL_C;
	SDA_S;
  delay_nop(100);
}

void mnack()/*发送非应答位*/
{
	SDA_S;
	SCL_S;
	delay_nop(100);
	SCL_C;
	SDA_C;
  delay_nop(100);
}

Int8U cack()/*应答位检查*/
{
 Int8U c;
SDA_IN;
delay_nop(100);
SCL_S;
c=0;
delay_nop(100);
if(IO_SDA==1)    //check sda
c=1;
SCL_C;
SDA_OUT;
delay_nop(100);
return c;
}
/*向虚拟I2C总线上发送1个数据字节*/
void wrbyt(Int8U shu)
{
Int8U i;
for(i=0;i<8;i++){
if((shu&0x80)>0){
SDA_S;
SCL_S;
delay_nop(100);
SCL_C;
SDA_C;
}
else{
SDA_C;
SCL_S;
delay_nop(100);
SCL_C;
}
shu=shu<<1;
delay_nop(100);
}
}
/*从I2C总线上读取1个数据字节*/
Int8U rdbyt()
{
Int8U nn=0;
Int8U j;
SDA_IN;
for(j=0;j<8;j++){
SCL_S;
delay_nop(100);
if(IO_SDA==0)
nn&=0XFE;
else
nn|=1;
if(j!=7)
nn<<=1;
SCL_C;
delay_nop(100);
}
SDA_OUT;
return(nn);
}


/*向虚拟I2C总线上发送n个字节的数据*/
void wrnbyt(Int8U i2cadd,Int8U ff[],Int8U number,Int8U i2c)
{
Int8U slaw,k,F0,ct_i2c;
k=i2c,ct_i2c=0;
do{
sta();
wrbyt(k);
F0=cack(); 
ct_i2c++;      
}while(F0==1&&ct_i2c<10);

slaw=i2cadd,ct_i2c=0;
do{
wrbyt(slaw);
F0=cack( );
ct_i2c++;
}while(F0==1&&ct_i2c<10);

for(k=0;k<number;k++){
//do{
wrbyt(ff[k]);
F0=cack( );
//}
//while(F0==1)
//;
}
stop( );
}
/*从虚拟I2C总线上读取n个字节的数据*/
void rdnbyt(Int8U *qq,Int8U number,Int8U slar){
 Int8U rl,F0,ct_i2c;
 rl=slar,ct_i2c=0;
 do{
 sta( );
 wrbyt(rl);
 F0=cack();
 ct_i2c++;
 }while(F0==1&&ct_i2c<10);
 
 if(slar==0xa0){	
 do{  
 wrbyt(0);
 F0=cack();
 ct_i2c++;
 }while(F0==1&&ct_i2c<10);
 }

	if(slar==0x64)slar=4;
	else          slar=0xa1;
	if(slar==0xa1)
	sta();
	do{
 	wrbyt(slar);
 	cack();
 	ct_i2c++;
	}while(F0==1&&ct_i2c<10);


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

⌨️ 快捷键说明

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