/* ****************************************************************************** * @file hts221_reg.c * @author Sensors Software Solution Team * @brief HTS221 driver file ****************************************************************************** * @attention * *

© Copyright (c) 2020 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ #include "hts221_reg.h" /** * @defgroup HTS221 * @brief This file provides a set of functions needed to drive the * hts221 enhanced inertial module. * @{ * */ /** * @defgroup HTS221_interfaces_functions * @brief This section provide a set of functions used to read and write * a generic register of the device. * @{ * */ /** * @brief Read generic device register * * @param ctx read / write interface definitions(ptr) * @param reg register to read * @param data pointer to buffer that store the data read(ptr) * @param len number of consecutive register to read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_read_reg(stmdev_ctx_t *ctx, uint8_t reg, uint8_t *data, uint16_t len) { int32_t ret; ret = ctx->read_reg(ctx->handle, reg, data, len); return ret; } /** * @brief Write generic device register * * @param ctx read / write interface definitions(ptr) * @param reg register to write * @param data pointer to data to write in register reg(ptr) * @param len number of consecutive register to write * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_write_reg(stmdev_ctx_t *ctx, uint8_t reg, uint8_t *data, uint16_t len) { int32_t ret; ret = ctx->write_reg(ctx->handle, reg, data, len); return ret; } /** * @} * */ /** * @defgroup HTS221_Data_Generation * @brief This section group all the functions concerning data generation * @{ * */ /** * @brief The numbers of averaged humidity samples.[set] * * @param ctx read / write interface definitions * @param val change the values of avgh in reg AV_CONF * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_humidity_avg_set(stmdev_ctx_t *ctx, hts221_avgh_t val) { hts221_av_conf_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_AV_CONF, (uint8_t *) ®, 1); if (ret == 0) { reg.avgh = (uint8_t)val; ret = hts221_write_reg(ctx, HTS221_AV_CONF, (uint8_t *) ®, 1); } return ret; } /** * @brief The numbers of averaged humidity samples.[get] * * @param ctx read / write interface definitions * @param val Get the values of avgh in reg AV_CONF * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_humidity_avg_get(stmdev_ctx_t *ctx, hts221_avgh_t *val) { hts221_av_conf_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_AV_CONF, (uint8_t *) ®, 1); switch (reg.avgh) { case HTS221_H_AVG_4: *val = HTS221_H_AVG_4; break; case HTS221_H_AVG_8: *val = HTS221_H_AVG_8; break; case HTS221_H_AVG_16: *val = HTS221_H_AVG_16; break; case HTS221_H_AVG_32: *val = HTS221_H_AVG_32; break; case HTS221_H_AVG_64: *val = HTS221_H_AVG_64; break; case HTS221_H_AVG_128: *val = HTS221_H_AVG_128; break; case HTS221_H_AVG_256: *val = HTS221_H_AVG_256; break; case HTS221_H_AVG_512: *val = HTS221_H_AVG_512; break; default: *val = HTS221_H_AVG_ND; break; } return ret; } /** * @brief The numbers of averaged temperature samples.[set] * * @param ctx read / write interface definitions * @param val change the values of avgt in reg AV_CONF * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temperature_avg_set(stmdev_ctx_t *ctx, hts221_avgt_t val) { hts221_av_conf_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_AV_CONF, (uint8_t *) ®, 1); if (ret == 0) { reg.avgt = (uint8_t)val; ret = hts221_write_reg(ctx, HTS221_AV_CONF, (uint8_t *) ®, 1); } return ret; } /** * @brief The numbers of averaged temperature samples.[get] * * @param ctx read / write interface definitions * @param val Get the values of avgt in reg AV_CONF * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temperature_avg_get(stmdev_ctx_t *ctx, hts221_avgt_t *val) { hts221_av_conf_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_AV_CONF, (uint8_t *) ®, 1); switch (reg.avgh) { case HTS221_T_AVG_2: *val = HTS221_T_AVG_2; break; case HTS221_T_AVG_4: *val = HTS221_T_AVG_4; break; case HTS221_T_AVG_8: *val = HTS221_T_AVG_8; break; case HTS221_T_AVG_16: *val = HTS221_T_AVG_16; break; case HTS221_T_AVG_32: *val = HTS221_T_AVG_32; break; case HTS221_T_AVG_64: *val = HTS221_T_AVG_64; break; case HTS221_T_AVG_128: *val = HTS221_T_AVG_128; break; case HTS221_T_AVG_256: *val = HTS221_T_AVG_256; break; default: *val = HTS221_T_AVG_ND; break; } return ret; } /** * @brief Output data rate selection.[set] * * @param ctx read / write interface definitions * @param val change the values of odr in reg CTRL_REG1 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_data_rate_set(stmdev_ctx_t *ctx, hts221_odr_t val) { hts221_ctrl_reg1_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); if (ret == 0) { reg.odr = (uint8_t)val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); } return ret; } /** * @brief Output data rate selection.[get] * * @param ctx read / write interface definitions * @param val Get the values of odr in reg CTRL_REG1 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_data_rate_get(stmdev_ctx_t *ctx, hts221_odr_t *val) { hts221_ctrl_reg1_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); switch (reg.odr) { case HTS221_ONE_SHOT: *val = HTS221_ONE_SHOT; break; case HTS221_ODR_1Hz: *val = HTS221_ODR_1Hz; break; case HTS221_ODR_7Hz: *val = HTS221_ODR_7Hz; break; case HTS221_ODR_12Hz5: *val = HTS221_ODR_12Hz5; break; default: *val = HTS221_ODR_ND; break; } return ret; } /** * @brief Block data update.[set] * * @param ctx read / write interface definitions * @param val change the values of bdu in reg CTRL_REG1 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_block_data_update_set(stmdev_ctx_t *ctx, uint8_t val) { hts221_ctrl_reg1_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); if (ret == 0) { reg.bdu = val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); } return ret; } /** * @brief Block data update.[get] * * @param ctx read / write interface definitions * @param val change the values of bdu in reg CTRL_REG1 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_block_data_update_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_ctrl_reg1_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); *val = reg.bdu; return ret; } /** * @brief One-shot mode. Device perform a single measure.[set] * * @param ctx read / write interface definitions * @param val change the values of one_shot in reg CTRL_REG2 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_one_shoot_trigger_set(stmdev_ctx_t *ctx, uint8_t val) { hts221_ctrl_reg2_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); if (ret == 0) { reg.one_shot = val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); } return ret; } /** * @brief One-shot mode. Device perform a single measure.[get] * * @param ctx read / write interface definitions * @param val change the values of one_shot in reg CTRL_REG2 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_one_shoot_trigger_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_ctrl_reg2_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); *val = reg.one_shot; return ret; } /** * @brief Temperature data available.[get] * * @param ctx read / write interface definitions * @param val change the values of t_da in reg STATUS_REG * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temp_data_ready_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_status_reg_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_STATUS_REG, (uint8_t *) ®, 1); *val = reg.t_da; return ret; } /** * @brief Humidity data available.[get] * * @param ctx read / write interface definitions * @param val change the values of h_da in reg STATUS_REG * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_hum_data_ready_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_status_reg_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_STATUS_REG, (uint8_t *) ®, 1); *val = reg.h_da; return ret; } /** * @brief Humidity output value[get] * * @param ctx read / write interface definitions * @param buff buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_humidity_raw_get(stmdev_ctx_t *ctx, int16_t *val) { uint8_t buff[2]; int32_t ret; ret = hts221_read_reg(ctx, HTS221_HUMIDITY_OUT_L, buff, 2); *val = (int16_t)buff[1]; *val = (*val * 256) + (int16_t)buff[0]; return ret; } /** * @brief Temperature output value[get] * * @param ctx read / write interface definitions * @param buff buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temperature_raw_get(stmdev_ctx_t *ctx, int16_t *val) { uint8_t buff[2]; int32_t ret; ret = hts221_read_reg(ctx, HTS221_TEMP_OUT_L, buff, 2); *val = (int16_t)buff[1]; *val = (*val * 256) + (int16_t)buff[0]; return ret; } /** * @} * */ /** * @defgroup HTS221_common * @brief This section group common useful functions * @{ * */ /** * @brief Device Who amI.[get] * * @param ctx read / write interface definitions * @param buff buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_device_id_get(stmdev_ctx_t *ctx, uint8_t *buff) { int32_t ret; ret = hts221_read_reg(ctx, HTS221_WHO_AM_I, buff, 1); return ret; } /** * @brief Switch device on/off.[set] * * @param ctx read / write interface definitions * @param val change the values of pd in reg CTRL_REG1 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_power_on_set(stmdev_ctx_t *ctx, uint8_t val) { hts221_ctrl_reg1_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); if (ret == 0) { reg.pd = val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); } return ret; } /** * @brief Switch device on/off.[get] * * @param ctx read / write interface definitions * @param val change the values of pd in reg CTRL_REG1 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_power_on_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_ctrl_reg1_t reg; int32_t mm_error; mm_error = hts221_read_reg(ctx, HTS221_CTRL_REG1, (uint8_t *) ®, 1); *val = reg.pd; return mm_error; } /** * @brief Heater enable / disable.[set] * * @param ctx read / write interface definitions * @param val change the values of heater in reg CTRL_REG2 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_heater_set(stmdev_ctx_t *ctx, uint8_t val) { hts221_ctrl_reg2_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); if (ret == 0) { reg.heater = val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); } return ret; } /** * @brief Heater enable / disable.[get] * * @param ctx read / write interface definitions * @param val change the values of heater in reg CTRL_REG2 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_heater_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_ctrl_reg2_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); *val = reg.heater; return ret; } /** * @brief Reboot memory content. Reload the calibration parameters.[set] * * @param ctx read / write interface definitions * @param val change the values of boot in reg CTRL_REG2 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_boot_set(stmdev_ctx_t *ctx, uint8_t val) { hts221_ctrl_reg2_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); if (ret == 0) { reg.boot = val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); } return ret; } /** * @brief Reboot memory content. Reload the calibration parameters.[get] * * @param ctx read / write interface definitions * @param val change the values of boot in reg CTRL_REG2 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_boot_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_ctrl_reg2_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG2, (uint8_t *) ®, 1); *val = reg.boot; return ret; } /** * @brief Info about device status.[get] * * @param ctx read / write interface definitions * @param val Registers STATUS_REG * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_status_get(stmdev_ctx_t *ctx, hts221_status_reg_t *val) { int32_t ret; ret = hts221_read_reg(ctx, HTS221_STATUS_REG, (uint8_t *) val, 1); return ret; } /** * @} * */ /** * @defgroup HTS221_interrupts * @brief This section group all the functions that manage interrupts * @{ * */ /** * @brief Data-ready signal on INT_DRDY pin.[set] * * @param ctx read / write interface definitions * @param val change the values of drdy in reg CTRL_REG3 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_drdy_on_int_set(stmdev_ctx_t *ctx, uint8_t val) { hts221_ctrl_reg3_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); if (ret == 0) { reg.drdy = val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); } return ret; } /** * @brief Data-ready signal on INT_DRDY pin.[get] * * @param ctx read / write interface definitions * @param val change the values of drdy in reg CTRL_REG3 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_drdy_on_int_get(stmdev_ctx_t *ctx, uint8_t *val) { hts221_ctrl_reg3_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); *val = reg.drdy; return ret; } /** * @brief Push-pull/open drain selection on interrupt pads.[set] * * @param ctx read / write interface definitions * @param val change the values of pp_od in reg CTRL_REG3 * */ int32_t hts221_pin_mode_set(stmdev_ctx_t *ctx, hts221_pp_od_t val) { hts221_ctrl_reg3_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); if (ret == 0) { reg.pp_od = (uint8_t)val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); } return ret; } /** * @brief Push-pull/open drain selection on interrupt pads.[get] * * @param ctx read / write interface definitions * @param val Get the values of pp_od in reg CTRL_REG3 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_pin_mode_get(stmdev_ctx_t *ctx, hts221_pp_od_t *val) { hts221_ctrl_reg3_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); switch (reg.pp_od) { case HTS221_PUSH_PULL: *val = HTS221_PUSH_PULL; break; case HTS221_OPEN_DRAIN: *val = HTS221_OPEN_DRAIN; break; default: *val = HTS221_PIN_MODE_ND; break; } return ret; } /** * @brief Interrupt active-high/low.[set] * * @param ctx read / write interface definitions * @param val change the values of drdy_h_l in reg CTRL_REG3 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_int_polarity_set(stmdev_ctx_t *ctx, hts221_drdy_h_l_t val) { hts221_ctrl_reg3_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); if (ret == 0) { reg.drdy_h_l = (uint8_t)val; ret = hts221_write_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); } return ret; } /** * @brief Interrupt active-high/low.[get] * * @param ctx read / write interface definitions * @param val Get the values of drdy_h_l in reg CTRL_REG3 * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_int_polarity_get(stmdev_ctx_t *ctx, hts221_drdy_h_l_t *val) { hts221_ctrl_reg3_t reg; int32_t ret; ret = hts221_read_reg(ctx, HTS221_CTRL_REG3, (uint8_t *) ®, 1); switch (reg.drdy_h_l) { case HTS221_ACTIVE_HIGH: *val = HTS221_ACTIVE_HIGH; break; case HTS221_ACTIVE_LOW: *val = HTS221_ACTIVE_LOW; break; default: *val = HTS221_ACTIVE_ND; break; } return ret; } /** * @} * */ /** * @defgroup HTS221_calibration * @brief This section group all the calibration coefficients need * for reading data * @{ * */ /** * @brief First calibration point for Rh Humidity.[get] * * @param ctx read / write interface definitions * @param val buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_hum_rh_point_0_get(stmdev_ctx_t *ctx, float_t *val) { uint8_t coeff; int32_t ret; ret = hts221_read_reg(ctx, HTS221_H0_RH_X2, &coeff, 1); *val = coeff / 2.0f; return ret; } /** * @brief Second calibration point for Rh Humidity.[get] * * @param ctx read / write interface definitions * @param val buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_hum_rh_point_1_get(stmdev_ctx_t *ctx, float_t *val) { uint8_t coeff; int32_t ret; ret = hts221_read_reg(ctx, HTS221_H1_RH_X2, &coeff, 1); *val = coeff / 2.0f; return ret; } /** * @brief First calibration point for degC temperature.[get] * * @param ctx read / write interface definitions * @param buff buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temp_deg_point_0_get(stmdev_ctx_t *ctx, float_t *val) { hts221_t1_t0_msb_t reg; uint8_t coeff_h, coeff_l; int32_t ret; ret = hts221_read_reg(ctx, HTS221_T0_DEGC_X8, &coeff_l, 1); if (ret == 0) { ret = hts221_read_reg(ctx, HTS221_T1_T0_MSB, (uint8_t *) ®, 1); coeff_h = reg.t0_msb; *val = ((coeff_h * 256) + coeff_l) / 8.0f; } return ret; } /** * @brief Second calibration point for degC temperature.[get] * * @param ctx read / write interface definitions * @param val buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temp_deg_point_1_get(stmdev_ctx_t *ctx, float_t *val) { hts221_t1_t0_msb_t reg; uint8_t coeff_h, coeff_l; int32_t ret; ret = hts221_read_reg(ctx, HTS221_T1_DEGC_X8, &coeff_l, 1); if (ret == 0) { ret = hts221_read_reg(ctx, HTS221_T1_T0_MSB, (uint8_t *) ®, 1); coeff_h = reg.t1_msb; *val = ((coeff_h * 256) + coeff_l) / 8.0f; } return ret; } /** * @brief First calibration point for humidity in LSB.[get] * * @param ctx read / write interface definitions * @param val buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_hum_adc_point_0_get(stmdev_ctx_t *ctx, float_t *val) { uint8_t coeff_p[2]; int16_t coeff; int32_t ret; ret = hts221_read_reg(ctx, HTS221_H0_T0_OUT_L, coeff_p, 2); coeff = (coeff_p[1] * 256) + coeff_p[0]; *val = coeff * 1.0f; return ret; } /** * @brief Second calibration point for humidity in LSB.[get] * * @param ctx read / write interface definitions * @param val buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_hum_adc_point_1_get(stmdev_ctx_t *ctx, float_t *val) { uint8_t coeff_p[2]; int16_t coeff; int32_t ret; ret = hts221_read_reg(ctx, HTS221_H1_T0_OUT_L, coeff_p, 2); coeff = (coeff_p[1] * 256) + coeff_p[0]; *val = coeff * 1.0f; return ret; } /** * @brief First calibration point for temperature in LSB.[get] * * @param ctx read / write interface definitions * @param val buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temp_adc_point_0_get(stmdev_ctx_t *ctx, float_t *val) { uint8_t coeff_p[2]; int16_t coeff; int32_t ret; ret = hts221_read_reg(ctx, HTS221_T0_OUT_L, coeff_p, 2); coeff = (coeff_p[1] * 256) + coeff_p[0]; *val = coeff * 1.0f; return ret; } /** * @brief Second calibration point for temperature in LSB.[get] * * @param ctx read / write interface definitions * @param val buffer that stores data read * @retval interface status (MANDATORY: return 0 -> no Error) * */ int32_t hts221_temp_adc_point_1_get(stmdev_ctx_t *ctx, float_t *val) { uint8_t coeff_p[2]; int16_t coeff; int32_t ret; ret = hts221_read_reg(ctx, HTS221_T1_OUT_L, coeff_p, 2); coeff = (coeff_p[1] * 256) + coeff_p[0]; *val = coeff * 1.0f; return ret; } /** * @} * */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/