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