294 lines
9.6 KiB
C
294 lines
9.6 KiB
C
/**************************************************************************************************'
|
|
Filename: hal_humi.c
|
|
Revised: $Date: 2013-03-25 07:58:08 -0700 (Mon, 25 Mar 2013) $
|
|
Revision: $Revision: 33575 $
|
|
|
|
Description: Driver for the Sensirion SHT21 Humidity sensor
|
|
|
|
|
|
Copyright 2012-2013 Texas Instruments Incorporated. All rights reserved.
|
|
|
|
IMPORTANT: Your use of this Software is limited to those specific rights
|
|
granted under the terms of a software license agreement between the user
|
|
who downloaded the software, his/her employer (which must be your employer)
|
|
and Texas Instruments Incorporated (the "License"). You may not use this
|
|
Software unless you agree to abide by the terms of the License. The License
|
|
limits your use, and you acknowledge, that the Software may not be modified,
|
|
copied or distributed unless embedded on a Texas Instruments microcontroller
|
|
or used solely and exclusively in conjunction with a Texas Instruments radio
|
|
frequency transceiver, which is integrated into your product. Other than for
|
|
the foregoing purpose, you may not use, reproduce, copy, prepare derivative
|
|
works of, modify, distribute, perform, display or sell this Software and/or
|
|
its documentation for any purpose.
|
|
|
|
YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
|
|
PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
|
INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
|
|
NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
|
|
TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
|
|
NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
|
|
LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
|
|
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
|
|
OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
|
|
OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
|
|
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
|
|
|
|
Should you have any questions regarding your right to use this Software,
|
|
contact Texas Instruments Incorporated at www.TI.com.
|
|
|
|
**************************************************************************************************/
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Includes
|
|
* ------------------------------------------------------------------------------------------------
|
|
*/
|
|
#include "hal_humi.h"
|
|
#include "hal_sensor.h"
|
|
#include "hal_i2c.h"
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Constants
|
|
* ------------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
// Sensor I2C address
|
|
#define HAL_SHT21_I2C_ADDRESS 0x40
|
|
|
|
#define S_REG_LEN 2
|
|
#define DATA_LEN 3
|
|
|
|
// Internal commands
|
|
#define SHT21_CMD_TEMP_T_H 0xE3 // command trig. temp meas. hold master
|
|
#define SHT21_CMD_HUMI_T_H 0xE5 // command trig. humidity meas. hold master
|
|
#define SHT21_CMD_TEMP_T_NH 0xF3 // command trig. temp meas. no hold master
|
|
#define SHT21_CMD_HUMI_T_NH 0xF5 // command trig. humidity meas. no hold master
|
|
#define SHT21_CMD_WRITE_U_R 0xE6 // command write user register
|
|
#define SHT21_CMD_READ_U_R 0xE7 // command read user register
|
|
#define SHT21_CMD_SOFT_RST 0xFE // command soft reset
|
|
|
|
#define HUMIDITY 0x00
|
|
#define TEMPERATURE 0x01
|
|
|
|
#define USR_REG_MASK 0x38 // Mask off reserved bits (3,4,5)
|
|
#define USR_REG_DEFAULT 0x02 // Disable OTP reload
|
|
#define USR_REG_RES_MASK 0x7E // Only change bits 0 and 7 (meas. res.)
|
|
#define USR_REG_11BITRES 0x81 // 11-bit resolution
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Type Definitions
|
|
* ------------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Local Functions
|
|
* ------------------------------------------------------------------------------------------------
|
|
*/
|
|
static void HalHumiSelect(void);
|
|
static bool HalHumiReadData(uint8 *pBuf,uint8 nBytes);
|
|
static bool HalHumiWriteCmd(uint8 cmd);
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Local Variables
|
|
* ------------------------------------------------------------------------------------------------
|
|
*/
|
|
static uint8 usr; // Keeps user register value
|
|
static uint8 buf[6]; // Data buffer
|
|
static bool success;
|
|
|
|
/**************************************************************************************************
|
|
* @fn HalHumiInit
|
|
*
|
|
* @brief Initialise the humidity sensor driver
|
|
*
|
|
* @return none
|
|
**************************************************************************************************/
|
|
void HalHumiInit(void)
|
|
{
|
|
HalHumiSelect();
|
|
|
|
// Set 11 bit resolution
|
|
HalSensorReadReg(SHT21_CMD_READ_U_R,&usr,1);
|
|
usr &= USR_REG_RES_MASK;
|
|
usr |= USR_REG_11BITRES;
|
|
HalSensorWriteReg(SHT21_CMD_WRITE_U_R,&usr,1);
|
|
success = FALSE;
|
|
}
|
|
|
|
|
|
/**************************************************************************************************
|
|
* @fn HalHumiExecMeasurementStep
|
|
*
|
|
* @brief Execute measurement step
|
|
*
|
|
* @return none
|
|
*/
|
|
bool HalHumiExecMeasurementStep(uint8 state)
|
|
{
|
|
HalHumiSelect();
|
|
|
|
switch (state)
|
|
{
|
|
case 0:
|
|
// Turn on DC-DC control
|
|
HalDcDcControl(ST_HUMID,true);
|
|
|
|
// Start temperature read
|
|
success = HalHumiWriteCmd(SHT21_CMD_TEMP_T_NH);
|
|
break;
|
|
|
|
case 1:
|
|
// Read and store temperature value
|
|
if (success)
|
|
{
|
|
success = HalHumiReadData(buf, DATA_LEN);
|
|
|
|
// Start for humidity read
|
|
if (success)
|
|
{
|
|
success = HalHumiWriteCmd(SHT21_CMD_HUMI_T_NH);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
// Read and store humidity value
|
|
if (success)
|
|
{
|
|
success = HalHumiReadData(buf+DATA_LEN, DATA_LEN);
|
|
}
|
|
|
|
// Turn of DC-DC control
|
|
HalDcDcControl(ST_HUMID,false);
|
|
break;
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
|
|
/**************************************************************************************************
|
|
* @fn HalHumiReadMeasurement
|
|
*
|
|
* @brief Get humidity sensor data
|
|
*
|
|
* @return none
|
|
*/
|
|
bool HalHumiReadMeasurement(uint8 *pBuf)
|
|
{
|
|
// Store temperature
|
|
pBuf[0] = buf[1];
|
|
pBuf[1] = buf[0];
|
|
|
|
// Store humidity
|
|
pBuf[2] = buf[4];
|
|
pBuf[3] = buf[3];
|
|
|
|
return success;
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************************************************
|
|
* @fn HalHumiTest
|
|
*
|
|
* @brief Humidity sensor self test
|
|
*
|
|
* @return none
|
|
**************************************************************************************************/
|
|
bool HalHumiTest(void)
|
|
{
|
|
uint8 val;
|
|
|
|
HalHumiSelect();
|
|
|
|
// Verify default value
|
|
ST_ASSERT(HalSensorReadReg(SHT21_CMD_READ_U_R,&val,1));
|
|
ST_ASSERT(val==usr);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Private functions
|
|
* -------------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/**************************************************************************************************
|
|
* @fn HalHumiSelect
|
|
*
|
|
* @brief Select the humidity sensor on the I2C-bus
|
|
*
|
|
* @return
|
|
*/
|
|
static void HalHumiSelect(void)
|
|
{
|
|
//Set up I2C that is used to communicate with SHT21
|
|
HalI2CInit(HAL_SHT21_I2C_ADDRESS,i2cClock_267KHZ);
|
|
}
|
|
|
|
|
|
/**************************************************************************************************
|
|
* @fn halHumiWriteCmd
|
|
*
|
|
* @brief Write a command to the humidity sensor
|
|
*
|
|
* @param cmd - command to write
|
|
*
|
|
* @return TRUE if the command has been transmitted successfully
|
|
**************************************************************************************************/
|
|
static bool HalHumiWriteCmd(uint8 cmd)
|
|
{
|
|
/* Send command */
|
|
return HalI2CWrite(1,&cmd) == 1;
|
|
}
|
|
|
|
|
|
/**************************************************************************************************
|
|
* @fn HalHumiReadData
|
|
*
|
|
* @brief This function implements the I2C protocol to read from the SHT21.
|
|
*
|
|
* @param pBuf - pointer to buffer to place data
|
|
*
|
|
* @param nBytes - number of bytes to read
|
|
*
|
|
* @return TRUE if the required number of bytes are received
|
|
**************************************************************************************************/
|
|
static bool HalHumiReadData(uint8 *pBuf, uint8 nBytes)
|
|
{
|
|
/* Read data */
|
|
return HalI2CRead(nBytes,pBuf ) == nBytes;
|
|
}
|
|
|
|
/* Conversion algorithm, humidity
|
|
*
|
|
double calcHumRel(uint16 rawH)
|
|
{
|
|
double v;
|
|
|
|
rawH &= ~0x0003; // clear bits [1..0] (status bits)
|
|
//-- calculate relative humidity [%RH] --
|
|
v = -6.0 + 125.0/65536 * (double)rawH; // RH= -6 + 125 * SRH/2^16
|
|
|
|
return v;
|
|
}
|
|
|
|
* Conversion algorithm, temperature
|
|
*
|
|
double calcHumTmp(uint16 rawT)
|
|
{
|
|
double v;
|
|
|
|
//-- calculate temperature [°C] --
|
|
v = -46.85 + 175.72/65536 *(double)(qint16)rawT;
|
|
|
|
return v;
|
|
}
|
|
*/
|
|
|
|
|
|
/*********************************************************************
|
|
*********************************************************************/
|
|
|