|
发表于 2009-2-21 18:53:34
|
显示全部楼层
/**************************************************
* Copyright (c) 2007,杭州xxxxxx有限公司
* All rights reserved.
*
* 文件名称:sht.c
* 文件标识:
* 摘 要:温湿度 SHT 读写接口函数
*
* 当前版本:1.0
* 作 者:GanYuanFeng
* 完成日期:2007年7月30日
**************************************************/
#include "sht.h"
/**************************************************
* 函数名称:WriteSHTByte()
* 函数介绍:writes a byte on the Sensibus and checks the acknowledge
* 输入参数:write data
* 输出参数:
* 返回值 :0:OK 1:ERROR
**************************************************/
INT8U WriteSHTByte(INT8U data)
{
INT8U i;
INT8U error = 0;
SHT_SCK_OUT;
SHT_SDA_OUT; // Set to output
for(i=0x80; i>0; i>>=1) //shift bit for masking
{
if(i & data) //masking value with i , write to SENSI-BUS
{
SHT_SDA_H;
}
else
{
SHT_SDA_L;
}
SHT_SCK_H; //clk for SENSI-BUS
_NOP();_NOP();_NOP();_NOP(); //pulswith approx. 5 us
SHT_SCK_L;
}
SHT_SDA_H; //release DATA-line
SHT_SCK_H; //clk #9 for ack
SHT_SDA_IN;
error = SHT_SDA; //check ack (DATA will be pulled down by SHT11)
SHT_SCK_L;
return (error); //error=1 in case of no acknowledge
}
/**************************************************
* 函数名称:ReadSHTByte()
* 函数介绍:reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
* 输入参数:acknowledge
* 输出参数:
* 返回值 :value
**************************************************/
INT8U ReadSHTByte(INT8U ack)
{
INT8U i;
INT8U value = 0;
SHT_SCK_OUT;
SHT_SDA_OUT; // Set to output
SHT_SDA_H; //release DATA-line
_NOP();
SHT_SDA_IN;
for(i=0x80; i>0; i>>=1) //shift bit for masking
{
SHT_SCK_H; //clk for SENSI-BUS
_NOP();
if(SHT_SDA)
{
value |= i; //read bit
}
SHT_SCK_L;
}
SHT_SDA_OUT;
if(ack) //in case of "ack==1" pull down DATA-Line
{
SHT_SDA_L;
}
else
{
SHT_SDA_H;
}
SHT_SCK_H;
_NOP();_NOP();_NOP();_NOP(); //pulswith approx. 5 us
SHT_SCK_L;
SHT_SDA_H; //release DATA-line
return (value);
}
/**************************************************
* 函数名称:StartSHTTrans()
* 函数介绍:generates a transmission start
* 输入参数:
* 输出参数:
* 返回值 :
**************************************************/
void StartSHTTrans(void)
{
SHT_SCK_OUT;
SHT_SDA_OUT; // Set to output
SHT_SDA_H;
SHT_SCK_L;
_NOP();
SHT_SCK_H;
_NOP();
SHT_SDA_L;
_NOP();
SHT_SCK_L;
_NOP();_NOP();_NOP();_NOP();
SHT_SCK_H;
_NOP();
SHT_SDA_H;
_NOP();
SHT_SCK_L;
}
/**************************************************
* 函数名称:ResetSHTConnection()
* 函数介绍:communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
* 输入参数:
* 输出参数:
* 返回值 :
**************************************************/
void ResetSHTConnection(void)
{
INT8U i;
SHT_SCK_OUT;
SHT_SDA_OUT; // Set to output
SHT_SDA_H;
SHT_SCK_L;
for(i=9; i>0; i--) //9 SCK cycles
{
_NOP();
SHT_SCK_H;
_NOP();
SHT_SCK_L;
}
StartSHTTrans(); //transmission start
}
/**************************************************
* 函数名称:ResetSHT()
* 函数介绍:resets the sensor by a softreset
* 输入参数:
* 输出参数:
* 返回值 :0:OK 1:ERROR
**************************************************/
INT8U ResetSHT(void)
{
INT8U error;
ResetSHTConnection(); //reset communication
error = WriteSHTByte(SHT_RESET); //send RESET-command to sensor
return (error); //error=1 in case of no response form the sensor
}
/**************************************************
* 函数名称:ReadSHTStatusReg()
* 函数介绍:reads the status register with checksum (8-bit)
* 输入参数:
* 输出参数:
* 返回值 :0:OK 1:ERROR
**************************************************/
INT8U ReadSHTStatusReg(INT8U *p_value, INT8U *p_checksum)
{
INT8U error;
StartSHTTrans(); //transmission start
error = WriteSHTByte(SHT_STATUS_REG_R); //send command to sensor
*p_value = ReadSHTByte(SHT_ACK); //read status register (8-bit)
*p_checksum = ReadSHTByte(SHT_noACK); //read checksum (8-bit)
return (error); //error=1 in case of no response form the sensor
}
/**************************************************
* 函数名称:WriteSHTStatusReg()
* 函数介绍:writes the status register with checksum (8-bit)
* 输入参数:
* 输出参数:
* 返回值 :0:OK 1:ERROR
**************************************************/
INT8U WriteSHTStatusReg(INT8U value)
{
INT8U error = 0;
StartSHTTrans(); //transmission start
error += WriteSHTByte(SHT_STATUS_REG_W); //send command to sensor
error += WriteSHTByte(value); //send value of status register
return (error); //error>=1 in case of no response form the sensor
}
/**************************************************
* 函数名称:MeasureSHT()
* 函数介绍:makes a measurement (humidity/temperature) with checksum
* 输入参数:
* 输出参数:
* 返回值 :0:OK 1:ERROR
**************************************************/
INT8U MeasureSHT(INT8U mode, INT16U *p_value, INT8U *p_checksum)
{
INT16U i;
INT8U error = 0;
StartSHTTrans(); //transmission start
switch(mode) //send command to sensor
{
case 0:
error += WriteSHTByte(SHT_MEASURE_TEMP);
break;
case 1:
error += WriteSHTByte(SHT_MEASURE_HUMI);
break;
default:
break;
}
SHT_SDA_IN;
if(!error)
{
//Delay15Ms();
for(i=0; i<65535; i++)
{
if(!SHT_SDA)
{
break; //wait until sensor has finished the measurement
}
}
if(SHT_SDA)
{
return (1); // or timeout is reached
}
else
{
*p_value = ((INT16U)(ReadSHTByte(SHT_ACK))<<8)|ReadSHTByte(SHT_ACK); // MSB first
*p_checksum = ReadSHTByte(SHT_noACK); //read checksum
}
}
return (error);
}
/**************************************************
* 函数名称:CalcSHT()
* 函数介绍:calculates temperature [C] and humidity [%RH]
* 输入参数:humi [Ticks] (12 or 8 bit)
* temp [Ticks] (14 or 12 bit)
* 输出参数:humi [%RH]
* temp [C]
* 返回值 :
**************************************************/
/*
void CalcSHT(FP32 *p_humidity ,FP32 *p_temperature)
{
#ifdef HighSO
const FP32 C1=-4.0; // for 12 Bit
const FP32 C2=+0.0405; // for 12 Bit
const FP32 C3=-0.0000028; // for 12 Bit
const FP32 T1=+0.01; // for 14 Bit @ 3.3V
const FP32 T2=+0.00008; // for 14 Bit @ 3.3V
const FP32 D1=-39.63; // for 14 Bit @ 3.3V
const FP32 D2=+0.01; // for 14 Bit @ 3.3V
#else
const FP32 C1=-4.0; // for 8 Bit
const FP32 C2=+0.648; // for 8 Bit
const FP32 C3=-0.00072; // for 8 Bit
const FP32 T1=+0.01; // for 12 Bit @ 3.3V
const FP32 T2=+0.00128; // for 12 Bit @ 3.3V
const FP32 D1=-39.63; // for 12 Bit @ 3.3V
const FP32 D2=+0.04; // for 12 Bit @ 3.3V
#endif
FP32 rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit
FP32 t=*p_temperature; // t: Temperature [Ticks] 14 Bit
FP32 rh_lin; // rh_lin: Humidity linear
FP32 rh_true; // rh_true: Temperature compensated humidity
FP32 t_C; // t_C : Temperature [C]
t_C=t*D2 + D1; //calc. temperature from ticks to [C]
rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]
if(rh_true>100)rh_true=100; //cut if the value is outside of
if(rh_true<0.1)rh_true=0.1; //the physical possible range
*p_temperature=t_C; //return temperature [C]
*p_humidity=rh_true; //return humidity[%RH]
}
*/
/**************************************************
* 函数名称:GetHumiTemp()
* 函数介绍:
* 输入参数:
* 输出参数:humi [%RH]
* temp [C]
* 返回值 :
**************************************************/
void GetHumiTemp(void)
{
INT8U i = 0;
INT8U error = 0;
INT8U checksum;
//SHT_VCC_OUT;
//SHT_VCC_ON;
do
{
i++;
//Delay15Ms();
ResetSHTConnection();
error += MeasureSHT(1, (INT16U *)&SHT_HumiADVal, &checksum); //measure humidity
error += MeasureSHT(0, (INT16U *)&SHT_TempADVal, &checksum); //measure temperature
#ifndef HighSO
if((SHT_HumiADVal>0xff) || (SHT_TempADVal>0xfff))
{
error += 1;
}
#else
if((SHT_HumiADVal>0xfff) || (SHT_TempADVal>0x3fff))
{
error += 1;
}
#endif
if(error)
{
//ResetSHTConnection(); //in case of an error: connection reset
SetupSHTDevice();
}
else
{
break;
}
}while(i<3);
//now_temp[0]=0xff00;
//now_temp[1]=0x5555;
SHT_SDA_IN;
SHT_SCK_IN;
//SHT_VCC_OFF;
}
/**************************************************
* 函数名称:SetupSHTDevice()
* 函数介绍:
* 输入参数:
* 输出参数:
* 返回值 :0:OK 1:ERROR
**************************************************/
INT8U SetupSHTDevice(void)
{
INT8U error = 0;
INT8U regval,checksum;
//SHT_VCC_OUT;
//SHT_VCC_ON;
//Delay15Ms();
ResetSHTConnection();
error += WriteSHTByte(SHT_RESET);
Delay15Ms();
ResetSHTConnection();
error += WriteSHTStatusReg(0x01); // 8bit RH / 12bit Temperature resolution
if(!error)
{
error += ReadSHTStatusReg(®val, &checksum);
if(regval==0x01)
{
error = 0;
}
else
{
error = 1;
}
}
SHT_SDA_IN;
SHT_SCK_IN;
//SHT_VCC_OFF;
return (error);
} |
|