📄 yt_temep.c.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 + -