Capacitive digital sensor for relative humidity and temperature.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: HelloWorld_ST_Sensors MOTENV_Mbed mbed-os-mqtt-client HTS221_JS ... more
Revision 0:7917d6d00a6e, committed 2017-09-04
- Comitter:
- nikapov
- Date:
- Mon Sep 04 16:06:23 2017 +0000
- Child:
- 1:c4391f20553e
- Commit message:
- First version.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HTS221Sensor.cpp Mon Sep 04 16:06:23 2017 +0000
@@ -0,0 +1,313 @@
+/**
+ ******************************************************************************
+ * @file HTS221Sensor.cpp
+ * @author CLab
+ * @version V1.0.0
+ * @date 5 August 2016
+ * @brief Implementation of an HTS221 Humidity and Temperature sensor.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+
+
+#include "HTS221Sensor.h"
+
+
+/* Class Implementation ------------------------------------------------------*/
+
+/** Constructor
+ * @param i2c object of an helper class which handles the I2C peripheral
+ * @param address the address of the component's instance
+ */
+HTS221Sensor::HTS221Sensor(DevI2C &i2c) : _dev_i2c(i2c)
+{
+ _address = HTS221_I2C_ADDRESS;
+};
+
+
+/** Constructor
+ * @param i2c object of an helper class which handles the I2C peripheral
+ * @param address the address of the component's instance
+ */
+HTS221Sensor::HTS221Sensor(DevI2C &i2c, uint8_t address) : _dev_i2c(i2c), _address(address)
+{
+
+};
+
+/**
+ * @brief Initializing the component.
+ * @param[in] init pointer to device specific initalization structure.
+ * @retval "0" in case of success, an error code otherwise.
+ */
+int HTS221Sensor::init(void *init)
+{
+ /* Power down the device */
+ if ( HTS221_DeActivate( (void *)this ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ /* Enable BDU */
+ if ( HTS221_Set_BduMode( (void *)this, HTS221_ENABLE ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ if(set_odr(1.0f) == 1)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Enable HTS221
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::enable(void)
+{
+ /* Power up the device */
+ if ( HTS221_Activate( (void *)this ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Disable HTS221
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::disable(void)
+{
+ /* Power up the device */
+ if ( HTS221_DeActivate( (void *)this ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Read ID address of HTS221
+ * @param id the pointer where the ID of the device is stored
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::read_id(uint8_t *id)
+{
+ if(!id)
+ {
+ return 1;
+ }
+
+ /* Read WHO AM I register */
+ if ( HTS221_Get_DeviceID( (void *)this, id ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Reboot memory content of HTS221
+ * @param None
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::reset(void)
+{
+ uint8_t tmpreg;
+
+ /* Read CTRL_REG2 register */
+ if (read_reg(HTS221_CTRL_REG2, &tmpreg) != 0)
+ {
+ return 1;
+ }
+
+ /* Enable or Disable the reboot memory */
+ tmpreg |= (0x01 << HTS221_BOOT_BIT);
+
+ /* Write value to MEMS CTRL_REG2 regsister */
+ if (write_reg(HTS221_CTRL_REG2, tmpreg) != 0)
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Read HTS221 output register, and calculate the humidity
+ * @param pfData the pointer to data output
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::get_humidity(float* pfData)
+{
+ uint16_t uint16data = 0;
+
+ /* Read data from HTS221. */
+ if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ *pfData = ( float )uint16data / 10.0f;
+
+ return 0;
+}
+
+/**
+ * @brief Read HTS221 output register, and calculate the temperature
+ * @param pfData the pointer to data output
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::get_temperature(float* pfData)
+{
+ int16_t int16data = 0;
+
+ /* Read data from HTS221. */
+ if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ *pfData = ( float )int16data / 10.0f;
+
+ return 0;
+}
+
+/**
+ * @brief Read HTS221 output register, and calculate the humidity
+ * @param odr the pointer to the output data rate
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::get_odr(float* odr)
+{
+ HTS221_Odr_et odr_low_level;
+
+ if ( HTS221_Get_Odr( (void *)this, &odr_low_level ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ switch( odr_low_level )
+ {
+ case HTS221_ODR_ONE_SHOT:
+ *odr = 0.0f;
+ break;
+ case HTS221_ODR_1HZ :
+ *odr = 1.0f;
+ break;
+ case HTS221_ODR_7HZ :
+ *odr = 7.0f;
+ break;
+ case HTS221_ODR_12_5HZ :
+ *odr = 12.5f;
+ break;
+ default :
+ *odr = -1.0f;
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Set ODR
+ * @param odr the output data rate to be set
+ * @retval 0 in case of success, an error code otherwise
+ */
+int HTS221Sensor::set_odr(float odr)
+{
+ HTS221_Odr_et new_odr;
+
+ new_odr = ( odr <= 1.0f ) ? HTS221_ODR_1HZ
+ : ( odr <= 7.0f ) ? HTS221_ODR_7HZ
+ : HTS221_ODR_12_5HZ;
+
+ if ( HTS221_Set_Odr( (void *)this, new_odr ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+
+/**
+ * @brief Read the data from register
+ * @param reg register address
+ * @param data register data
+ * @retval 0 in case of success
+ * @retval 1 in case of failure
+ */
+int HTS221Sensor::read_reg( uint8_t reg, uint8_t *data )
+{
+
+ if ( HTS221_read_reg( (void *)this, reg, 1, data ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Write the data to register
+ * @param reg register address
+ * @param data register data
+ * @retval 0 in case of success
+ * @retval 1 in case of failure
+ */
+int HTS221Sensor::write_reg( uint8_t reg, uint8_t data )
+{
+
+ if ( HTS221_write_reg( (void *)this, reg, 1, &data ) == HTS221_ERROR )
+ {
+ return 1;
+ }
+
+ return 0;
+}
+
+uint8_t HTS221_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
+{
+ return ((HTS221Sensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
+}
+
+uint8_t HTS221_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
+{
+ return ((HTS221Sensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HTS221Sensor.h Mon Sep 04 16:06:23 2017 +0000
@@ -0,0 +1,118 @@
+/**
+ ******************************************************************************
+ * @file HTS221Sensor.h
+ * @author CLab
+ * @version V1.0.0
+ * @date 5 August 2016
+ * @brief Abstract class of an HTS221 Humidity and Temperature sensor.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Prevent recursive inclusion -----------------------------------------------*/
+
+#ifndef __HTS221Sensor_H__
+#define __HTS221Sensor_H__
+
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "DevI2C.h"
+#include "HTS221_driver.h"
+#include "HumiditySensor.h"
+#include "TempSensor.h"
+
+
+/* Class Declaration ---------------------------------------------------------*/
+
+/**
+ * Abstract class of an HTS221 Humidity and Temperature sensor.
+ */
+class HTS221Sensor : public HumiditySensor, public TempSensor
+{
+ public:
+
+ HTS221Sensor(DevI2C &i2c);
+ HTS221Sensor(DevI2C &i2c, uint8_t address);
+ virtual int init(void *init);
+ virtual int read_id(uint8_t *id);
+ virtual int get_humidity(float *pfData);
+ virtual int get_temperature(float *pfData);
+ int enable(void);
+ int disable(void);
+ int reset(void);
+ int get_odr(float *odr);
+ int set_odr(float odr);
+ int read_reg(uint8_t reg, uint8_t *data);
+ int write_reg(uint8_t reg, uint8_t data);
+ /**
+ * @brief Utility function to read data.
+ * @param pBuffer: pointer to data to be read.
+ * @param RegisterAddr: specifies internal address register to be read.
+ * @param NumByteToRead: number of bytes to be read.
+ * @retval 0 if ok, an error code otherwise.
+ */
+ uint8_t io_read(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToRead)
+ {
+ return (uint8_t) _dev_i2c.i2c_read(pBuffer, _address, RegisterAddr, NumByteToRead);
+ }
+
+ /**
+ * @brief Utility function to write data.
+ * @param pBuffer: pointer to data to be written.
+ * @param RegisterAddr: specifies internal address register to be written.
+ * @param NumByteToWrite: number of bytes to write.
+ * @retval 0 if ok, an error code otherwise.
+ */
+ uint8_t io_write(uint8_t* pBuffer, uint8_t RegisterAddr, uint16_t NumByteToWrite)
+ {
+ return (uint8_t) _dev_i2c.i2c_write(pBuffer, _address, RegisterAddr, NumByteToWrite);
+ }
+
+ private:
+
+ /* Helper classes. */
+ DevI2C &_dev_i2c;
+
+ /* Configuration */
+ uint8_t _address;
+
+};
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+uint8_t HTS221_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite );
+uint8_t HTS221_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead );
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HTS221_driver.c Mon Sep 04 16:06:23 2017 +0000
@@ -0,0 +1,987 @@
+/**
+ ******************************************************************************
+ * @file HTS221_driver.c
+ * @author HESA Application Team
+ * @version V1.1
+ * @date 10-August-2016
+ * @brief HTS221 driver file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "HTS221_driver.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifdef USE_FULL_ASSERT_HTS221
+#include <stdio.h>
+#endif
+
+
+/** @addtogroup Environmental_Sensor
+* @{
+*/
+
+/** @defgroup HTS221_DRIVER
+* @brief HTS221 DRIVER
+* @{
+*/
+
+/** @defgroup HTS221_Imported_Function_Prototypes
+* @{
+*/
+
+extern uint8_t HTS221_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite );
+extern uint8_t HTS221_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead );
+
+/**
+* @}
+*/
+
+/** @defgroup HTS221_Private_Function_Prototypes
+* @{
+*/
+
+/**
+* @}
+*/
+
+/** @defgroup HTS221_Private_Functions
+* @{
+*/
+
+/**
+* @}
+*/
+
+/** @defgroup HTS221_Public_Functions
+* @{
+*/
+
+/*******************************************************************************
+* Function Name : HTS221_read_reg
+* Description : Generic Reading function. It must be fullfilled with either
+* : I2C or SPI reading functions
+* Input : Register Address
+* Output : Data Read
+* Return : None
+*******************************************************************************/
+HTS221_Error_et HTS221_read_reg( void *handle, uint8_t RegAddr, uint16_t NumByteToRead, uint8_t *Data )
+{
+
+ if ( NumByteToRead > 1 ) RegAddr |= 0x80;
+
+ if ( HTS221_io_read( handle, RegAddr, Data, NumByteToRead ) )
+ return HTS221_ERROR;
+ else
+ return HTS221_OK;
+}
+
+/*******************************************************************************
+* Function Name : HTS221_write_reg
+* Description : Generic Writing function. It must be fullfilled with either
+* : I2C or SPI writing function
+* Input : Register Address, Data to be written
+* Output : None
+* Return : None
+*******************************************************************************/
+HTS221_Error_et HTS221_write_reg( void *handle, uint8_t RegAddr, uint16_t NumByteToWrite, uint8_t *Data )
+{
+
+ if ( NumByteToWrite > 1 ) RegAddr |= 0x80;
+
+ if ( HTS221_io_write( handle, RegAddr, Data, NumByteToWrite ) )
+ return HTS221_ERROR;
+ else
+ return HTS221_OK;
+}
+
+/**
+* @brief Get the version of this driver.
+* @param pxVersion pointer to a HTS221_DriverVersion_st structure that contains the version information.
+* This parameter is a pointer to @ref HTS221_DriverVersion_st.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_DriverVersion(HTS221_DriverVersion_st* version)
+{
+ version->Major = HTS221_DRIVER_VERSION_MAJOR;
+ version->Minor = HTS221_DRIVER_VERSION_MINOR;
+ version->Point = HTS221_DRIVER_VERSION_POINT;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get device type ID.
+* @param *handle Device handle.
+* @param deviceid pointer to the returned device type ID.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_DeviceID(void *handle, uint8_t* deviceid)
+{
+ if(HTS221_read_reg(handle, HTS221_WHO_AM_I_REG, 1, deviceid))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Initializes the HTS221 with the specified parameters in HTS221_Init_st struct.
+* @param *handle Device handle.
+* @param pxInit pointer to a HTS221_Init_st structure that contains the configuration.
+* This parameter is a pointer to @ref HTS221_Init_st.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_InitConfig(void *handle, HTS221_Init_st* pxInit)
+{
+ uint8_t buffer[3];
+
+ HTS221_assert_param(IS_HTS221_AVGH(pxInit->avg_h));
+ HTS221_assert_param(IS_HTS221_AVGT(pxInit->avg_t));
+ HTS221_assert_param(IS_HTS221_ODR(pxInit->odr));
+ HTS221_assert_param(IS_HTS221_State(pxInit->bdu_status));
+ HTS221_assert_param(IS_HTS221_State(pxInit->heater_status));
+
+ HTS221_assert_param(IS_HTS221_DrdyLevelType(pxInit->irq_level));
+ HTS221_assert_param(IS_HTS221_OutputType(pxInit->irq_output_type));
+ HTS221_assert_param(IS_HTS221_State(pxInit->irq_enable));
+
+ if(HTS221_read_reg(handle, HTS221_AV_CONF_REG, 1, buffer))
+ return HTS221_ERROR;
+
+ buffer[0] &= ~(HTS221_AVGH_MASK | HTS221_AVGT_MASK);
+ buffer[0] |= (uint8_t)pxInit->avg_h;
+ buffer[0] |= (uint8_t)pxInit->avg_t;
+
+ if(HTS221_write_reg(handle, HTS221_AV_CONF_REG, 1, buffer))
+ return HTS221_ERROR;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 3, buffer))
+ return HTS221_ERROR;
+
+ buffer[0] &= ~(HTS221_BDU_MASK | HTS221_ODR_MASK);
+ buffer[0] |= (uint8_t)pxInit->odr;
+ buffer[0] |= ((uint8_t)pxInit->bdu_status) << HTS221_BDU_BIT;
+
+ buffer[1] &= ~HTS221_HEATHER_BIT;
+ buffer[1] |= ((uint8_t)pxInit->heater_status) << HTS221_HEATHER_BIT;
+
+ buffer[2] &= ~(HTS221_DRDY_H_L_MASK | HTS221_PP_OD_MASK | HTS221_DRDY_MASK);
+ buffer[2] |= ((uint8_t)pxInit->irq_level) << HTS221_DRDY_H_L_BIT;
+ buffer[2] |= (uint8_t)pxInit->irq_output_type;
+ buffer[2] |= ((uint8_t)pxInit->irq_enable) << HTS221_DRDY_BIT;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG1, 3, buffer))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Returns a HTS221_Init_st struct with the actual configuration.
+* @param *handle Device handle.
+* @param pxInit pointer to a HTS221_Init_st structure.
+* This parameter is a pointer to @ref HTS221_Init_st.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_InitConfig(void *handle, HTS221_Init_st* pxInit)
+{
+ uint8_t buffer[3];
+
+ if(HTS221_read_reg(handle, HTS221_AV_CONF_REG, 1, buffer))
+ return HTS221_ERROR;
+
+ pxInit->avg_h = (HTS221_Avgh_et)(buffer[0] & HTS221_AVGH_MASK);
+ pxInit->avg_t = (HTS221_Avgt_et)(buffer[0] & HTS221_AVGT_MASK);
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 3, buffer))
+ return HTS221_ERROR;
+
+ pxInit->odr = (HTS221_Odr_et)(buffer[0] & HTS221_ODR_MASK);
+ pxInit->bdu_status = (HTS221_State_et)((buffer[0] & HTS221_BDU_MASK) >> HTS221_BDU_BIT);
+ pxInit->heater_status = (HTS221_State_et)((buffer[1] & HTS221_HEATHER_MASK) >> HTS221_HEATHER_BIT);
+
+ pxInit->irq_level = (HTS221_DrdyLevel_et)(buffer[2] & HTS221_DRDY_H_L_MASK);
+ pxInit->irq_output_type = (HTS221_OutputType_et)(buffer[2] & HTS221_PP_OD_MASK);
+ pxInit->irq_enable = (HTS221_State_et)((buffer[2] & HTS221_DRDY_MASK) >> HTS221_DRDY_BIT);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief De initialization function for HTS221.
+* This function put the HTS221 in power down, make a memory boot and clear the data output flags.
+* @param *handle Device handle.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_DeInit(void *handle)
+{
+ uint8_t buffer[4];
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 2, buffer))
+ return HTS221_ERROR;
+
+ /* HTS221 in power down */
+ buffer[0] |= 0x01 << HTS221_PD_BIT;
+
+ /* Make HTS221 boot */
+ buffer[1] |= 0x01 << HTS221_BOOT_BIT;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG1, 2, buffer))
+ return HTS221_ERROR;
+
+ /* Dump of data output */
+ if(HTS221_read_reg(handle, HTS221_HR_OUT_L_REG, 4, buffer))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Read HTS221 output registers, and calculate humidity and temperature.
+* @param *handle Device handle.
+* @param humidity pointer to the returned humidity value that must be divided by 10 to get the value in [%].
+* @param temperature pointer to the returned temperature value that must be divided by 10 to get the value in ['C].
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_Measurement(void *handle, uint16_t* humidity, int16_t* temperature)
+{
+ if ( HTS221_Get_Temperature( handle, temperature ) == HTS221_ERROR ) return HTS221_ERROR;
+ if ( HTS221_Get_Humidity( handle, humidity ) == HTS221_ERROR ) return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Read HTS221 output registers. Humidity and temperature.
+* @param *handle Device handle.
+* @param humidity pointer to the returned humidity raw value.
+* @param temperature pointer to the returned temperature raw value.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_RawMeasurement(void *handle, int16_t* humidity, int16_t* temperature)
+{
+ uint8_t buffer[4];
+
+ if(HTS221_read_reg(handle, HTS221_HR_OUT_L_REG, 4, buffer))
+ return HTS221_ERROR;
+
+ *humidity = (int16_t)((((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0]);
+ *temperature = (int16_t)((((uint16_t)buffer[3]) << 8) | (uint16_t)buffer[2]);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Read HTS221 Humidity output registers, and calculate humidity.
+* @param *handle Device handle.
+* @param Pointer to the returned humidity value that must be divided by 10 to get the value in [%].
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_Humidity(void *handle, uint16_t* value)
+{
+ int16_t H0_T0_out, H1_T0_out, H_T_out;
+ int16_t H0_rh, H1_rh;
+ uint8_t buffer[2];
+ float tmp_f;
+
+ if(HTS221_read_reg(handle, HTS221_H0_RH_X2, 2, buffer))
+ return HTS221_ERROR;
+ H0_rh = buffer[0] >> 1;
+ H1_rh = buffer[1] >> 1;
+
+ if(HTS221_read_reg(handle, HTS221_H0_T0_OUT_L, 2, buffer))
+ return HTS221_ERROR;
+ H0_T0_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];
+
+ if(HTS221_read_reg(handle, HTS221_H1_T0_OUT_L, 2, buffer))
+ return HTS221_ERROR;
+ H1_T0_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];
+
+ if(HTS221_read_reg(handle, HTS221_HR_OUT_L_REG, 2, buffer))
+ return HTS221_ERROR;
+ H_T_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];
+
+ tmp_f = (float)(H_T_out - H0_T0_out) * (float)(H1_rh - H0_rh) / (float)(H1_T0_out - H0_T0_out) + H0_rh;
+ tmp_f *= 10.0f;
+
+ *value = ( tmp_f > 1000.0f ) ? 1000
+ : ( tmp_f < 0.0f ) ? 0
+ : ( uint16_t )tmp_f;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Read HTS221 humidity output registers.
+* @param *handle Device handle.
+* @param Pointer to the returned humidity raw value.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_HumidityRaw(void *handle, int16_t* value)
+{
+ uint8_t buffer[2];
+
+ if(HTS221_read_reg(handle, HTS221_HR_OUT_L_REG, 2, buffer))
+ return HTS221_ERROR;
+
+ *value = (int16_t)((((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0]);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Read HTS221 temperature output registers, and calculate temperature.
+* @param *handle Device handle.
+* @param Pointer to the returned temperature value that must be divided by 10 to get the value in ['C].
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_Temperature(void *handle, int16_t *value)
+{
+ int16_t T0_out, T1_out, T_out, T0_degC_x8_u16, T1_degC_x8_u16;
+ int16_t T0_degC, T1_degC;
+ uint8_t buffer[4], tmp;
+ float tmp_f;
+
+ if(HTS221_read_reg(handle, HTS221_T0_DEGC_X8, 2, buffer))
+ return HTS221_ERROR;
+ if(HTS221_read_reg(handle, HTS221_T0_T1_DEGC_H2, 1, &tmp))
+ return HTS221_ERROR;
+
+ T0_degC_x8_u16 = (((uint16_t)(tmp & 0x03)) << 8) | ((uint16_t)buffer[0]);
+ T1_degC_x8_u16 = (((uint16_t)(tmp & 0x0C)) << 6) | ((uint16_t)buffer[1]);
+ T0_degC = T0_degC_x8_u16 >> 3;
+ T1_degC = T1_degC_x8_u16 >> 3;
+
+ if(HTS221_read_reg(handle, HTS221_T0_OUT_L, 4, buffer))
+ return HTS221_ERROR;
+
+ T0_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];
+ T1_out = (((uint16_t)buffer[3]) << 8) | (uint16_t)buffer[2];
+
+ if(HTS221_read_reg(handle, HTS221_TEMP_OUT_L_REG, 2, buffer))
+ return HTS221_ERROR;
+
+ T_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];
+
+ tmp_f = (float)(T_out - T0_out) * (float)(T1_degC - T0_degC) / (float)(T1_out - T0_out) + T0_degC;
+ tmp_f *= 10.0f;
+
+ *value = ( int16_t )tmp_f;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Read HTS221 temperature output registers.
+* @param *handle Device handle.
+* @param Pointer to the returned temperature raw value.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_TemperatureRaw(void *handle, int16_t* value)
+{
+ uint8_t buffer[2];
+
+ if(HTS221_read_reg(handle, HTS221_TEMP_OUT_L_REG, 2, buffer))
+ return HTS221_ERROR;
+
+ *value = (int16_t)((((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0]);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get the availability of new data for humidity and temperature.
+* @param *handle Device handle.
+* @param humidity pointer to the returned humidity data status [HTS221_SET/HTS221_RESET].
+* @param temperature pointer to the returned temperature data status [HTS221_SET/HTS221_RESET].
+* This parameter is a pointer to @ref HTS221_BitStatus_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_DataStatus(void *handle, HTS221_BitStatus_et* humidity, HTS221_BitStatus_et* temperature)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_STATUS_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ *humidity = (HTS221_BitStatus_et)((tmp & HTS221_HDA_MASK) >> HTS221_H_DA_BIT);
+ *temperature = (HTS221_BitStatus_et)(tmp & HTS221_TDA_MASK);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Exit from power down mode.
+* @param *handle Device handle.
+* @param void.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Activate(void *handle)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp |= HTS221_PD_MASK;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Put the sensor in power down mode.
+* @param *handle Device handle.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_DeActivate(void *handle)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_PD_MASK;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+
+
+/**
+* @brief Check if the single measurement has completed.
+* @param *handle Device handle.
+* @param tmp is set to 1, when the measure is completed
+* @retval Status [HTS221_ERROR, HTS221_OK]
+*/
+HTS221_Error_et HTS221_IsMeasurementCompleted(void *handle, HTS221_BitStatus_et* Is_Measurement_Completed)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_STATUS_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ if((tmp & (uint8_t)(HTS221_HDA_MASK | HTS221_TDA_MASK)) == (uint8_t)(HTS221_HDA_MASK | HTS221_TDA_MASK))
+ *Is_Measurement_Completed = HTS221_SET;
+ else
+ *Is_Measurement_Completed = HTS221_RESET;
+
+ return HTS221_OK;
+}
+
+
+/**
+* @brief Set_ humidity and temperature average mode.
+* @param *handle Device handle.
+* @param avgh is the average mode for humidity, this parameter is @ref HTS221_Avgh_et.
+* @param avgt is the average mode for temperature, this parameter is @ref HTS221_Avgt_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_AvgHT(void *handle, HTS221_Avgh_et avgh, HTS221_Avgt_et avgt)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_AVGH(avgh));
+ HTS221_assert_param(IS_HTS221_AVGT(avgt));
+
+ if(HTS221_read_reg(handle, HTS221_AV_CONF_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~(HTS221_AVGH_MASK | HTS221_AVGT_MASK);
+ tmp |= (uint8_t)avgh;
+ tmp |= (uint8_t)avgt;
+
+ if(HTS221_write_reg(handle, HTS221_AV_CONF_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Set humidity average mode.
+* @param *handle Device handle.
+* @param avgh is the average mode for humidity, this parameter is @ref HTS221_Avgh_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_AvgH(void *handle, HTS221_Avgh_et avgh)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_AVGH(avgh));
+
+ if(HTS221_read_reg(handle, HTS221_AV_CONF_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_AVGH_MASK;
+ tmp |= (uint8_t)avgh;
+
+ if(HTS221_write_reg(handle, HTS221_AV_CONF_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Set temperature average mode.
+* @param *handle Device handle.
+* @param avgt is the average mode for temperature, this parameter is @ref HTS221_Avgt_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_AvgT(void *handle, HTS221_Avgt_et avgt)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_AVGT(avgt));
+
+ if(HTS221_read_reg(handle, HTS221_AV_CONF_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_AVGT_MASK;
+ tmp |= (uint8_t)avgt;
+
+ if(HTS221_write_reg(handle, HTS221_AV_CONF_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get humidity and temperature average mode.
+* @param *handle Device handle.
+* @param avgh pointer to the returned value with the humidity average mode.
+* @param avgt pointer to the returned value with the temperature average mode.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_AvgHT(void *handle, HTS221_Avgh_et* avgh, HTS221_Avgt_et* avgt)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_AV_CONF_REG, 1, &tmp))
+ return HTS221_ERROR;
+
+ *avgh = (HTS221_Avgh_et)(tmp & HTS221_AVGH_MASK);
+ *avgt = (HTS221_Avgt_et)(tmp & HTS221_AVGT_MASK);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Set block data update mode.
+* @param *handle Device handle.
+* @param status can be HTS221_ENABLE: enable the block data update, output data registers are updated once both MSB and LSB are read.
+* @param status can be HTS221_DISABLE: output data registers are continuously updated.
+* This parameter is a @ref HTS221_BitStatus_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_BduMode(void *handle, HTS221_State_et status)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_State(status));
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_BDU_MASK;
+ tmp |= ((uint8_t)status) << HTS221_BDU_BIT;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get block data update mode.
+* @param *handle Device handle.
+* @param Pointer to the returned value with block data update mode status.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_BduMode(void *handle, HTS221_State_et* status)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ *status = (HTS221_State_et)((tmp & HTS221_BDU_MASK) >> HTS221_BDU_BIT);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Enter or exit from power down mode.
+* @param *handle Device handle.
+* @param status can be HTS221_SET: HTS221 in power down mode.
+* @param status can be HTS221_REET: HTS221 in active mode.
+* This parameter is a @ref HTS221_BitStatus_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_PowerDownMode(void *handle, HTS221_BitStatus_et status)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_BitStatus(status));
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_PD_MASK;
+ tmp |= ((uint8_t)status) << HTS221_PD_BIT;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get if HTS221 is in active mode or in power down mode.
+* @param *handle Device handle.
+* @param Pointer to the returned value with HTS221 status.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_PowerDownMode(void *handle, HTS221_BitStatus_et* status)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ *status = (HTS221_BitStatus_et)((tmp & HTS221_PD_MASK) >> HTS221_PD_BIT);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Set the output data rate mode.
+* @param *handle Device handle.
+* @param odr is the output data rate mode.
+* This parameter is a @ref HTS221_Odr_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_Odr(void *handle, HTS221_Odr_et odr)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_ODR(odr));
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_ODR_MASK;
+ tmp |= (uint8_t)odr;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get the output data rate mode.
+* @param *handle Device handle.
+* @param Pointer to the returned value with output data rate mode.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_Odr(void *handle, HTS221_Odr_et* odr)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG1, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= HTS221_ODR_MASK;
+ *odr = (HTS221_Odr_et)tmp;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Reboot Memory Content.
+* @param *handle Device handle.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_MemoryBoot(void *handle)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG2, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp |= HTS221_BOOT_MASK;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG2, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Configure the internal heater.
+* @param *handle Device handle.
+* @param The status of the internal heater [HTS221_ENABLE/HTS221_DISABLE].
+* This parameter is a @ref HTS221_State_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR]
+*/
+HTS221_Error_et HTS221_Set_HeaterState(void *handle, HTS221_State_et status)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_State(status));
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG2, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_HEATHER_MASK;
+ tmp |= ((uint8_t)status) << HTS221_HEATHER_BIT;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG2, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get the internal heater.
+* @param *handle Device handle.
+* @param Pointer to the returned status of the internal heater [HTS221_ENABLE/HTS221_DISABLE].
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_HeaterState(void *handle, HTS221_State_et* status)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG2, 1, &tmp))
+ return HTS221_ERROR;
+
+ *status = (HTS221_State_et)((tmp & HTS221_HEATHER_MASK) >> HTS221_HEATHER_BIT);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Set ONE_SHOT bit to start a new conversion (ODR mode has to be 00).
+* Once the measurement is done, ONE_SHOT bit is self-cleared.
+* @param *handle Device handle.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_StartOneShotMeasurement(void *handle)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG2, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp |= HTS221_ONE_SHOT_MASK;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG2, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+
+}
+
+/**
+* @brief Set level configuration of the interrupt pin DRDY.
+* @param *handle Device handle.
+* @param status can be HTS221_LOW_LVL: active level is LOW.
+* @param status can be HTS221_HIGH_LVL: active level is HIGH.
+* This parameter is a @ref HTS221_State_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_IrqActiveLevel(void *handle, HTS221_DrdyLevel_et value)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_DrdyLevelType(value));
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_DRDY_H_L_MASK;
+ tmp |= (uint8_t)value;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get level configuration of the interrupt pin DRDY.
+* @param *handle Device handle.
+* @param Pointer to the returned status of the level configuration [HTS221_ENABLE/HTS221_DISABLE].
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_IrqActiveLevel(void *handle, HTS221_DrdyLevel_et* value)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ *value = (HTS221_DrdyLevel_et)(tmp & HTS221_DRDY_H_L_MASK);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Set Push-pull/open drain configuration for the interrupt pin DRDY.
+* @param *handle Device handle.
+* @param value is the output type configuration.
+* This parameter is a @ref HTS221_OutputType_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_IrqOutputType(void *handle, HTS221_OutputType_et value)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_OutputType(value));
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_PP_OD_MASK;
+ tmp |= (uint8_t)value;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get the configuration for the interrupt pin DRDY.
+* @param *handle Device handle.
+* @param Pointer to the returned value with output type configuration.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_IrqOutputType(void *handle, HTS221_OutputType_et* value)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ *value = (HTS221_OutputType_et)(tmp & HTS221_PP_OD_MASK);
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Enable/disable the interrupt mode.
+* @param *handle Device handle.
+* @param status is the enable/disable for the interrupt mode.
+* This parameter is a @ref HTS221_State_et.
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Set_IrqEnable(void *handle, HTS221_State_et status)
+{
+ uint8_t tmp;
+
+ HTS221_assert_param(IS_HTS221_State(status));
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ tmp &= ~HTS221_DRDY_MASK;
+ tmp |= ((uint8_t)status) << HTS221_DRDY_BIT;
+
+ if(HTS221_write_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ return HTS221_OK;
+}
+
+/**
+* @brief Get the interrupt mode.
+* @param *handle Device handle.
+* @param Pointer to the returned status of the interrupt mode configuration [HTS221_ENABLE/HTS221_DISABLE].
+* @retval Error code [HTS221_OK, HTS221_ERROR].
+*/
+HTS221_Error_et HTS221_Get_IrqEnable(void *handle, HTS221_State_et* status)
+{
+ uint8_t tmp;
+
+ if(HTS221_read_reg(handle, HTS221_CTRL_REG3, 1, &tmp))
+ return HTS221_ERROR;
+
+ *status = (HTS221_State_et)((tmp & HTS221_DRDY_MASK) >> HTS221_DRDY_BIT);
+
+ return HTS221_OK;
+}
+
+
+#ifdef USE_FULL_ASSERT_HTS221
+/**
+* @brief Reports the name of the source file and the source line number
+* where the assert_param error has occurred.
+* @param file: pointer to the source file name
+* @param line: assert_param error line source number
+* @retval : None
+*/
+void HTS221_assert_failed(uint8_t* file, uint32_t line)
+{
+ /* User can add his own implementation to report the file name and line number */
+ printf("Wrong parameters value: file %s on line %d\r\n", file, (int)line);
+
+ /* Infinite loop */
+ while (1)
+ {
+ }
+}
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HTS221_driver.h Mon Sep 04 16:06:23 2017 +0000
@@ -0,0 +1,514 @@
+/**
+ ******************************************************************************
+ * @file HTS221_driver.h
+ * @author HESA Application Team
+ * @version V1.1
+ * @date 10-August-2016
+ * @brief HTS221 driver header file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of STMicroelectronics nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __HTS221_DRIVER__H
+#define __HTS221_DRIVER__H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Uncomment the line below to expanse the "assert_param" macro in the drivers code */
+#define USE_FULL_ASSERT_HTS221
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT_HTS221
+
+/**
+* @brief The assert_param macro is used for function's parameters check.
+* @param expr: If expr is false, it calls assert_failed function which reports
+* the name of the source file and the source line number of the call
+* that failed. If expr is true, it returns no value.
+* @retval None
+*/
+#define HTS221_assert_param(expr) ((expr) ? (void)0 : HTS221_assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+void HTS221_assert_failed(uint8_t* file, uint32_t line);
+#else
+#define HTS221_assert_param(expr) ((void)0)
+#endif /* USE_FULL_ASSERT_HTS221 */
+
+/** @addtogroup Environmental_Sensor
+* @{
+*/
+
+/** @addtogroup HTS221_DRIVER
+* @{
+*/
+
+/* Exported Types -------------------------------------------------------------*/
+/** @defgroup HTS221_Exported_Types
+* @{
+*/
+
+
+/**
+* @brief Error code type.
+*/
+typedef enum {HTS221_OK = (uint8_t)0, HTS221_ERROR = !HTS221_OK} HTS221_Error_et;
+
+/**
+* @brief State type.
+*/
+typedef enum {HTS221_DISABLE = (uint8_t)0, HTS221_ENABLE = !HTS221_DISABLE} HTS221_State_et;
+#define IS_HTS221_State(MODE) ((MODE == HTS221_ENABLE) || (MODE == HTS221_DISABLE))
+
+/**
+* @brief Bit status type.
+*/
+typedef enum {HTS221_RESET = (uint8_t)0, HTS221_SET = !HTS221_RESET} HTS221_BitStatus_et;
+#define IS_HTS221_BitStatus(MODE) ((MODE == HTS221_RESET) || (MODE == HTS221_SET))
+
+/**
+* @brief Humidity average.
+*/
+typedef enum
+{
+ HTS221_AVGH_4 = (uint8_t)0x00, /*!< Internal average on 4 samples */
+ HTS221_AVGH_8 = (uint8_t)0x01, /*!< Internal average on 8 samples */
+ HTS221_AVGH_16 = (uint8_t)0x02, /*!< Internal average on 16 samples */
+ HTS221_AVGH_32 = (uint8_t)0x03, /*!< Internal average on 32 samples */
+ HTS221_AVGH_64 = (uint8_t)0x04, /*!< Internal average on 64 samples */
+ HTS221_AVGH_128 = (uint8_t)0x05, /*!< Internal average on 128 samples */
+ HTS221_AVGH_256 = (uint8_t)0x06, /*!< Internal average on 256 samples */
+ HTS221_AVGH_512 = (uint8_t)0x07 /*!< Internal average on 512 samples */
+} HTS221_Avgh_et;
+#define IS_HTS221_AVGH(AVGH) ((AVGH == HTS221_AVGH_4) || (AVGH == HTS221_AVGH_8) || \
+ (AVGH == HTS221_AVGH_16) || (AVGH == HTS221_AVGH_32) || \
+ (AVGH == HTS221_AVGH_64) || (AVGH == HTS221_AVGH_128) || \
+ (AVGH == HTS221_AVGH_256) || (AVGH == HTS221_AVGH_512))
+
+/**
+* @brief Temperature average.
+*/
+typedef enum
+{
+ HTS221_AVGT_2 = (uint8_t)0x00, /*!< Internal average on 2 samples */
+ HTS221_AVGT_4 = (uint8_t)0x08, /*!< Internal average on 4 samples */
+ HTS221_AVGT_8 = (uint8_t)0x10, /*!< Internal average on 8 samples */
+ HTS221_AVGT_16 = (uint8_t)0x18, /*!< Internal average on 16 samples */
+ HTS221_AVGT_32 = (uint8_t)0x20, /*!< Internal average on 32 samples */
+ HTS221_AVGT_64 = (uint8_t)0x28, /*!< Internal average on 64 samples */
+ HTS221_AVGT_128 = (uint8_t)0x30, /*!< Internal average on 128 samples */
+ HTS221_AVGT_256 = (uint8_t)0x38 /*!< Internal average on 256 samples */
+} HTS221_Avgt_et;
+#define IS_HTS221_AVGT(AVGT) ((AVGT == HTS221_AVGT_2) || (AVGT == HTS221_AVGT_4) || \
+ (AVGT == HTS221_AVGT_8) || (AVGT == HTS221_AVGT_16) || \
+ (AVGT == HTS221_AVGT_32) || (AVGT == HTS221_AVGT_64) || \
+ (AVGT == HTS221_AVGT_128) || (AVGT == HTS221_AVGT_256))
+
+/**
+* @brief Output data rate configuration.
+*/
+typedef enum
+{
+ HTS221_ODR_ONE_SHOT = (uint8_t)0x00, /*!< Output Data Rate: one shot */
+ HTS221_ODR_1HZ = (uint8_t)0x01, /*!< Output Data Rate: 1Hz */
+ HTS221_ODR_7HZ = (uint8_t)0x02, /*!< Output Data Rate: 7Hz */
+ HTS221_ODR_12_5HZ = (uint8_t)0x03, /*!< Output Data Rate: 12.5Hz */
+} HTS221_Odr_et;
+#define IS_HTS221_ODR(ODR) ((ODR == HTS221_ODR_ONE_SHOT) || (ODR == HTS221_ODR_1HZ) || \
+ (ODR == HTS221_ODR_7HZ) || (ODR == HTS221_ODR_12_5HZ))
+
+
+/**
+* @brief Push-pull/Open Drain selection on DRDY pin.
+*/
+typedef enum
+{
+ HTS221_PUSHPULL = (uint8_t)0x00, /*!< DRDY pin in push pull */
+ HTS221_OPENDRAIN = (uint8_t)0x40 /*!< DRDY pin in open drain */
+} HTS221_OutputType_et;
+#define IS_HTS221_OutputType(MODE) ((MODE == HTS221_PUSHPULL) || (MODE == HTS221_OPENDRAIN))
+
+/**
+* @brief Active level of DRDY pin.
+*/
+typedef enum
+{
+ HTS221_HIGH_LVL = (uint8_t)0x00, /*!< HIGH state level for DRDY pin */
+ HTS221_LOW_LVL = (uint8_t)0x80 /*!< LOW state level for DRDY pin */
+} HTS221_DrdyLevel_et;
+#define IS_HTS221_DrdyLevelType(MODE) ((MODE == HTS221_HIGH_LVL) || (MODE == HTS221_LOW_LVL))
+
+/**
+* @brief Driver Version Info structure definition.
+*/
+typedef struct
+{
+ uint8_t Major;
+ uint8_t Minor;
+ uint8_t Point;
+} HTS221_DriverVersion_st;
+
+
+/**
+* @brief HTS221 Init structure definition.
+*/
+typedef struct
+{
+ HTS221_Avgh_et avg_h; /*!< Humidity average */
+ HTS221_Avgt_et avg_t; /*!< Temperature average */
+ HTS221_Odr_et odr; /*!< Output data rate */
+ HTS221_State_et bdu_status; /*!< HTS221_ENABLE/HTS221_DISABLE the block data update */
+ HTS221_State_et heater_status; /*!< HTS221_ENABLE/HTS221_DISABLE the internal heater */
+
+ HTS221_DrdyLevel_et irq_level; /*!< HTS221_HIGH_LVL/HTS221_LOW_LVL the level for DRDY pin */
+ HTS221_OutputType_et irq_output_type; /*!< Output configuration for DRDY pin */
+ HTS221_State_et irq_enable; /*!< HTS221_ENABLE/HTS221_DISABLE interrupt on DRDY pin */
+} HTS221_Init_st;
+
+/**
+* @}
+*/
+
+
+/* Exported Constants ---------------------------------------------------------*/
+/** @defgroup HTS221_Exported_Constants
+* @{
+*/
+
+/**
+* @brief Bitfield positioning.
+*/
+#define HTS221_BIT(x) ((uint8_t)x)
+
+/**
+* @brief I2C address.
+*/
+#define HTS221_I2C_ADDRESS (uint8_t)0xBE
+
+/**
+* @brief Driver version.
+*/
+#define HTS221_DRIVER_VERSION_MAJOR (uint8_t)1
+#define HTS221_DRIVER_VERSION_MINOR (uint8_t)1
+#define HTS221_DRIVER_VERSION_POINT (uint8_t)0
+
+/**
+* @addtogroup HTS221_Registers
+* @{
+*/
+
+
+/**
+* @brief Device Identification register.
+* \code
+* Read
+* Default value: 0xBC
+* 7:0 This read-only register contains the device identifier for HTS221.
+* \endcode
+*/
+#define HTS221_WHO_AM_I_REG (uint8_t)0x0F
+
+/**
+* @brief Device Identification value.
+*/
+#define HTS221_WHO_AM_I_VAL (uint8_t)0xBC
+
+
+/**
+* @brief Humidity and temperature average mode register.
+* \code
+* Read/write
+* Default value: 0x1B
+* 7:6 Reserved.
+* 5:3 AVGT2-AVGT1-AVGT0: Select the temperature internal average.
+*
+* AVGT2 | AVGT1 | AVGT0 | Nr. Internal Average
+* ----------------------------------------------------
+* 0 | 0 | 0 | 2
+* 0 | 0 | 1 | 4
+* 0 | 1 | 0 | 8
+* 0 | 1 | 1 | 16
+* 1 | 0 | 0 | 32
+* 1 | 0 | 1 | 64
+* 1 | 1 | 0 | 128
+* 1 | 1 | 1 | 256
+*
+* 2:0 AVGH2-AVGH1-AVGH0: Select humidity internal average.
+* AVGH2 | AVGH1 | AVGH0 | Nr. Internal Average
+* ------------------------------------------------------
+* 0 | 0 | 0 | 4
+* 0 | 0 | 1 | 8
+* 0 | 1 | 0 | 16
+* 0 | 1 | 1 | 32
+* 1 | 0 | 0 | 64
+* 1 | 0 | 1 | 128
+* 1 | 1 | 0 | 256
+* 1 | 1 | 1 | 512
+*
+* \endcode
+*/
+#define HTS221_AV_CONF_REG (uint8_t)0x10
+
+#define HTS221_AVGT_BIT HTS221_BIT(3)
+#define HTS221_AVGH_BIT HTS221_BIT(0)
+
+#define HTS221_AVGH_MASK (uint8_t)0x07
+#define HTS221_AVGT_MASK (uint8_t)0x38
+
+/**
+* @brief Control register 1.
+* \code
+* Read/write
+* Default value: 0x00
+* 7 PD: power down control. 0 - power down mode; 1 - active mode.
+* 6:3 Reserved.
+* 2 BDU: block data update. 0 - continuous update; 1 - output registers not updated until MSB and LSB reading.
+* 1:0 ODR1, ODR0: output data rate selection.
+*
+* ODR1 | ODR0 | Humidity output data-rate(Hz) | Pressure output data-rate(Hz)
+* ----------------------------------------------------------------------------------
+* 0 | 0 | one shot | one shot
+* 0 | 1 | 1 | 1
+* 1 | 0 | 7 | 7
+* 1 | 1 | 12.5 | 12.5
+*
+* \endcode
+*/
+#define HTS221_CTRL_REG1 (uint8_t)0x20
+
+#define HTS221_PD_BIT HTS221_BIT(7)
+#define HTS221_BDU_BIT HTS221_BIT(2)
+#define HTS221_ODR_BIT HTS221_BIT(0)
+
+#define HTS221_PD_MASK (uint8_t)0x80
+#define HTS221_BDU_MASK (uint8_t)0x04
+#define HTS221_ODR_MASK (uint8_t)0x03
+
+/**
+* @brief Control register 2.
+* \code
+* Read/write
+* Default value: 0x00
+* 7 BOOT: Reboot memory content. 0: normal mode; 1: reboot memory content. Self-cleared upon completation.
+* 6:2 Reserved.
+* 1 HEATHER: 0: heater enable; 1: heater disable.
+* 0 ONE_SHOT: 0: waiting for start of conversion; 1: start for a new dataset. Self-cleared upon completation.
+* \endcode
+*/
+#define HTS221_CTRL_REG2 (uint8_t)0x21
+
+#define HTS221_BOOT_BIT HTS221_BIT(7)
+#define HTS221_HEATHER_BIT HTS221_BIT(1)
+#define HTS221_ONESHOT_BIT HTS221_BIT(0)
+
+#define HTS221_BOOT_MASK (uint8_t)0x80
+#define HTS221_HEATHER_MASK (uint8_t)0x02
+#define HTS221_ONE_SHOT_MASK (uint8_t)0x01
+
+/**
+* @brief Control register 3.
+* \code
+* Read/write
+* Default value: 0x00
+* 7 DRDY_H_L: Interrupt edge. 0: active high, 1: active low.
+* 6 PP_OD: Push-Pull/OpenDrain selection on interrupt pads. 0: push-pull; 1: open drain.
+* 5:3 Reserved.
+* 2 DRDY: interrupt config. 0: disable, 1: enable.
+* \endcode
+*/
+#define HTS221_CTRL_REG3 (uint8_t)0x22
+
+#define HTS221_DRDY_H_L_BIT HTS221_BIT(7)
+#define HTS221_PP_OD_BIT HTS221_BIT(6)
+#define HTS221_DRDY_BIT HTS221_BIT(2)
+
+#define HTS221_DRDY_H_L_MASK (uint8_t)0x80
+#define HTS221_PP_OD_MASK (uint8_t)0x40
+#define HTS221_DRDY_MASK (uint8_t)0x04
+
+/**
+* @brief Status register.
+* \code
+* Read
+* Default value: 0x00
+* 7:2 Reserved.
+* 1 H_DA: Humidity data available. 0: new data for humidity is not yet available; 1: new data for humidity is available.
+* 0 T_DA: Temperature data available. 0: new data for temperature is not yet available; 1: new data for temperature is available.
+* \endcode
+*/
+#define HTS221_STATUS_REG (uint8_t)0x27
+
+#define HTS221_H_DA_BIT HTS221_BIT(1)
+#define HTS221_T_DA_BIT HTS221_BIT(0)
+
+#define HTS221_HDA_MASK (uint8_t)0x02
+#define HTS221_TDA_MASK (uint8_t)0x01
+
+/**
+* @brief Humidity data (LSB).
+* \code
+* Read
+* Default value: 0x00.
+* HOUT7 - HOUT0: Humidity data LSB (2's complement).
+* \endcode
+*/
+#define HTS221_HR_OUT_L_REG (uint8_t)0x28
+
+/**
+* @brief Humidity data (MSB).
+* \code
+* Read
+* Default value: 0x00.
+* HOUT15 - HOUT8: Humidity data MSB (2's complement).
+* \endcode
+*/
+#define HTS221_HR_OUT_H_REG (uint8_t)0x29
+
+
+/**
+* @brief Temperature data (LSB).
+* \code
+* Read
+* Default value: 0x00.
+* TOUT7 - TOUT0: temperature data LSB.
+* \endcode
+*/
+#define HTS221_TEMP_OUT_L_REG (uint8_t)0x2A
+
+/**
+* @brief Temperature data (MSB).
+* \code
+* Read
+* Default value: 0x00.
+* TOUT15 - TOUT8: temperature data MSB.
+* \endcode
+*/
+#define HTS221_TEMP_OUT_H_REG (uint8_t)0x2B
+
+/**
+* @brief Calibration registers.
+* \code
+* Read
+* \endcode
+*/
+#define HTS221_H0_RH_X2 (uint8_t)0x30
+#define HTS221_H1_RH_X2 (uint8_t)0x31
+#define HTS221_T0_DEGC_X8 (uint8_t)0x32
+#define HTS221_T1_DEGC_X8 (uint8_t)0x33
+#define HTS221_T0_T1_DEGC_H2 (uint8_t)0x35
+#define HTS221_H0_T0_OUT_L (uint8_t)0x36
+#define HTS221_H0_T0_OUT_H (uint8_t)0x37
+#define HTS221_H1_T0_OUT_L (uint8_t)0x3A
+#define HTS221_H1_T0_OUT_H (uint8_t)0x3B
+#define HTS221_T0_OUT_L (uint8_t)0x3C
+#define HTS221_T0_OUT_H (uint8_t)0x3D
+#define HTS221_T1_OUT_L (uint8_t)0x3E
+#define HTS221_T1_OUT_H (uint8_t)0x3F
+
+
+/**
+* @}
+*/
+
+
+/**
+* @}
+*/
+
+
+/* Exported Functions -------------------------------------------------------------*/
+/** @defgroup HTS221_Exported_Functions
+* @{
+*/
+
+HTS221_Error_et HTS221_read_reg( void *handle, uint8_t RegAddr, uint16_t NumByteToRead, uint8_t *Data );
+HTS221_Error_et HTS221_write_reg( void *handle, uint8_t RegAddr, uint16_t NumByteToWrite, uint8_t *Data );
+
+HTS221_Error_et HTS221_Get_DriverVersion(HTS221_DriverVersion_st* version);
+HTS221_Error_et HTS221_Get_DeviceID(void *handle, uint8_t* deviceid);
+
+HTS221_Error_et HTS221_Set_InitConfig(void *handle, HTS221_Init_st* pxInit);
+HTS221_Error_et HTS221_Get_InitConfig(void *handle, HTS221_Init_st* pxInit);
+HTS221_Error_et HTS221_DeInit(void *handle);
+HTS221_Error_et HTS221_IsMeasurementCompleted(void *handle, HTS221_BitStatus_et* Is_Measurement_Completed);
+
+HTS221_Error_et HTS221_Get_Measurement(void *handle, uint16_t* humidity, int16_t* temperature);
+HTS221_Error_et HTS221_Get_RawMeasurement(void *handle, int16_t* humidity, int16_t* temperature);
+HTS221_Error_et HTS221_Get_Humidity(void *handle, uint16_t* value);
+HTS221_Error_et HTS221_Get_HumidityRaw(void *handle, int16_t* value);
+HTS221_Error_et HTS221_Get_TemperatureRaw(void *handle, int16_t* value);
+HTS221_Error_et HTS221_Get_Temperature(void *handle, int16_t* value);
+HTS221_Error_et HTS221_Get_DataStatus(void *handle, HTS221_BitStatus_et* humidity, HTS221_BitStatus_et* temperature);
+HTS221_Error_et HTS221_Activate(void *handle);
+HTS221_Error_et HTS221_DeActivate(void *handle);
+
+HTS221_Error_et HTS221_Set_AvgHT(void *handle, HTS221_Avgh_et avgh, HTS221_Avgt_et avgt);
+HTS221_Error_et HTS221_Set_AvgH(void *handle, HTS221_Avgh_et avgh);
+HTS221_Error_et HTS221_Set_AvgT(void *handle, HTS221_Avgt_et avgt);
+HTS221_Error_et HTS221_Get_AvgHT(void *handle, HTS221_Avgh_et* avgh, HTS221_Avgt_et* avgt);
+HTS221_Error_et HTS221_Set_BduMode(void *handle, HTS221_State_et status);
+HTS221_Error_et HTS221_Get_BduMode(void *handle, HTS221_State_et* status);
+HTS221_Error_et HTS221_Set_PowerDownMode(void *handle, HTS221_BitStatus_et status);
+HTS221_Error_et HTS221_Get_PowerDownMode(void *handle, HTS221_BitStatus_et* status);
+HTS221_Error_et HTS221_Set_Odr(void *handle, HTS221_Odr_et odr);
+HTS221_Error_et HTS221_Get_Odr(void *handle, HTS221_Odr_et* odr);
+HTS221_Error_et HTS221_MemoryBoot(void *handle);
+HTS221_Error_et HTS221_Set_HeaterState(void *handle, HTS221_State_et status);
+HTS221_Error_et HTS221_Get_HeaterState(void *handle, HTS221_State_et* status);
+HTS221_Error_et HTS221_StartOneShotMeasurement(void *handle);
+HTS221_Error_et HTS221_Set_IrqActiveLevel(void *handle, HTS221_DrdyLevel_et status);
+HTS221_Error_et HTS221_Get_IrqActiveLevel(void *handle, HTS221_DrdyLevel_et* status);
+HTS221_Error_et HTS221_Set_IrqOutputType(void *handle, HTS221_OutputType_et value);
+HTS221_Error_et HTS221_Get_IrqOutputType(void *handle, HTS221_OutputType_et* value);
+HTS221_Error_et HTS221_Set_IrqEnable(void *handle, HTS221_State_et status);
+HTS221_Error_et HTS221_Get_IrqEnable(void *handle, HTS221_State_et* status);
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __HTS221_DRIVER__H */
+
+/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ST_INTERFACES.lib Mon Sep 04 16:06:23 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/ST_INTERFACES/#d3c9b33b992c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/X_NUCLEO_COMMON.lib Mon Sep 04 16:06:23 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/X_NUCLEO_COMMON/#21096473f63e