📄 yt_temeprom.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 + -