STM32CubeWL/Drivers/BSP/Components/stts22h/stts22h_reg.c

651 lines
16 KiB
C

/**
******************************************************************************
* @file stts22h_reg.c
* @author Sensors Software Solution Team
* @brief STTS22H driver file
******************************************************************************
* @attention
*
* Copyright (c) 2019 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
#include "stts22h_reg.h"
/**
* @defgroup STTS22H
* @brief This file provides a set of functions needed to drive the
* stts22h enhanced inertial module.
* @{
*
*/
/**
* @defgroup STTS22H_Interfaces_Functions
* @brief This section provide a set of functions used to read and
* write a generic register of the device.
* MANDATORY: return 0 -> no Error.
* @{
*
*/
/**
* @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 stts22h_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 stts22h_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 STTS22H_Sensitivity
* @brief These functions convert raw-data into engineering units.
* @{
*
*/
float_t stts22h_from_lsb_to_celsius(int16_t lsb)
{
return ((float_t)lsb / 100.0f);
}
/**
* @}
*
*/
/**
* @defgroup STTS22H_Data_generation
* @brief This section groups all the functions concerning
* data generation.
* @{
*
*/
/**
* @brief Temperature sensor data rate selection..[set]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Change the values of "one_shot" in reg STTS22H.
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_data_rate_set(stmdev_ctx_t *ctx,
stts22h_odr_temp_t val)
{
stts22h_software_reset_t software_reset;
stts22h_ctrl_t ctrl;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
if (ret == 0)
{
ret = stts22h_read_reg(ctx, STTS22H_SOFTWARE_RESET,
(uint8_t *)&software_reset, 1);
}
if ((val == STTS22H_ONE_SHOT) && (ret == 0))
{
software_reset.sw_reset = PROPERTY_ENABLE;
ret = stts22h_write_reg(ctx, STTS22H_SOFTWARE_RESET,
(uint8_t *)&software_reset, 1);
if (ret == 0)
{
software_reset.sw_reset = PROPERTY_DISABLE;
ret = stts22h_write_reg(ctx, STTS22H_SOFTWARE_RESET,
(uint8_t *)&software_reset, 1);
}
}
if (((val == STTS22H_25Hz) || (val == STTS22H_50Hz) ||
(val == STTS22H_100Hz) || (val == STTS22H_200Hz)) &&
(ctrl.freerun == PROPERTY_DISABLE) && (ret == 0))
{
software_reset.sw_reset = PROPERTY_ENABLE;
ret = stts22h_write_reg(ctx, STTS22H_SOFTWARE_RESET,
(uint8_t *)&software_reset, 1);
if (ret == 0)
{
software_reset.sw_reset = PROPERTY_DISABLE;
ret = stts22h_write_reg(ctx, STTS22H_SOFTWARE_RESET,
(uint8_t *)&software_reset, 1);
}
}
if ((val == STTS22H_1Hz) && (ret == 0))
{
software_reset.sw_reset = PROPERTY_ENABLE;
software_reset.low_odr_enable = PROPERTY_ENABLE;
ret = stts22h_write_reg(ctx, STTS22H_SOFTWARE_RESET,
(uint8_t *)&software_reset, 1);
if (ret == 0)
{
software_reset.sw_reset = PROPERTY_DISABLE;
software_reset.low_odr_enable = PROPERTY_ENABLE;
ret = stts22h_write_reg(ctx, STTS22H_SOFTWARE_RESET,
(uint8_t *)&software_reset, 1);
}
}
if (ret == 0)
{
ctrl.one_shot = (uint8_t)val & 0x01U;
ctrl.freerun = ((uint8_t)val & 0x02U) >> 1;
ctrl.low_odr_start = ((uint8_t)val & 0x04U) >> 2;
ctrl.avg = ((uint8_t)val & 0x30U) >> 4;
ret = stts22h_write_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
}
return ret;
}
/**
* @brief Temperature sensor data rate selection..[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Get the values of one_shot in reg CTRL.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_data_rate_get(stmdev_ctx_t *ctx,
stts22h_odr_temp_t *val)
{
stts22h_ctrl_t ctrl;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL,
(uint8_t *)&ctrl, 1);
switch (ctrl.one_shot | (ctrl.freerun << 1) | (ctrl.low_odr_start <<
2) |
(ctrl.avg << 4))
{
case STTS22H_POWER_DOWN:
*val = STTS22H_POWER_DOWN;
break;
case STTS22H_ONE_SHOT:
*val = STTS22H_ONE_SHOT;
break;
case STTS22H_1Hz:
*val = STTS22H_1Hz;
break;
case STTS22H_25Hz:
*val = STTS22H_25Hz;
break;
case STTS22H_50Hz:
*val = STTS22H_50Hz;
break;
case STTS22H_100Hz:
*val = STTS22H_100Hz;
break;
case STTS22H_200Hz:
*val = STTS22H_200Hz;
break;
default:
*val = STTS22H_POWER_DOWN;
break;
}
return ret;
}
/**
* @brief Block data update.[set]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Change the values of bdu in reg CTRL.
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_block_data_update_set(stmdev_ctx_t *ctx, uint8_t val)
{
stts22h_ctrl_t ctrl;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
if (ret == 0)
{
ctrl.bdu = val;
ret = stts22h_write_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
}
return ret;
}
/**
* @brief Block data update.[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Get the values of bdu in reg CTRL.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_block_data_update_get(stmdev_ctx_t *ctx, uint8_t *val)
{
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL, (uint8_t *)val, 1);
return ret;
}
/**
* @brief New data available from temperature sensor..[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Return an option of "stts22h_uint8_t".(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_flag_data_ready_get(stmdev_ctx_t *ctx,
uint8_t *val)
{
stts22h_status_t status;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_STATUS, (uint8_t *)&status, 1);
if (status.busy == PROPERTY_DISABLE)
{
*val = PROPERTY_ENABLE;
}
else
{
*val = PROPERTY_DISABLE;
}
return ret;
}
/**
* @}
*
*/
/**
* @defgroup STTS22H_Dataoutput
* @brief This section groups all the data output functions.
* @{
*
*/
/**
* @brief Temperature data output register(r). L and H registers
* together express a 16-bit word in two's complement..[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param buff Buffer that stores the data read.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temperature_raw_get(stmdev_ctx_t *ctx, int16_t *val)
{
uint8_t buff[2];
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_TEMP_L_OUT, buff, 2);
*val = (int16_t)buff[1];
*val = (*val * 256) + (int16_t)buff[0];
return ret;
}
/**
* @}
*
*/
/**
* @defgroup STTS22H_Common
* @brief This section groups common useful functions.
* @{
*
*/
/**
* @brief Device Who am I..[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param buff Buffer that stores the data read.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_dev_id_get(stmdev_ctx_t *ctx, uint8_t *buff)
{
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_WHOAMI, buff, 1);
return ret;
}
/**
* @brief Device status register.[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val In one-shot mode this bit is high when the
* conversion is in progress..(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_dev_status_get(stmdev_ctx_t *ctx,
stts22h_dev_status_t *val)
{
stts22h_status_t status;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_STATUS, (uint8_t *)&status, 1);
val->busy = status.busy;
return ret;
}
/**
* @}
*
*/
/**
* @defgroup STTS22H_Serial_interface
* @brief This section groups all the functions concerning main
* serial interface management.
* @{
*
*/
/**
* @brief SMBus mode..[set]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Change the values of "time_out_dis" in reg STTS22H.
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_smbus_interface_set(stmdev_ctx_t *ctx,
stts22h_smbus_md_t val)
{
stts22h_ctrl_t ctrl;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
if (ret == 0)
{
ctrl.time_out_dis = (uint8_t)val;
ret = stts22h_write_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
}
return ret;
}
/**
* @brief SMBus mode..[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Get the values of time_out_dis in reg CTRL.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_smbus_interface_get(stmdev_ctx_t *ctx,
stts22h_smbus_md_t *val)
{
stts22h_ctrl_t ctrl;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL,
(uint8_t *)&ctrl, 1);
switch (ctrl.time_out_dis)
{
case STTS22H_SMBUS_TIMEOUT_ENABLE:
*val = STTS22H_SMBUS_TIMEOUT_ENABLE;
break;
case STTS22H_SMBUS_TIMEOUT_DISABLE:
*val = STTS22H_SMBUS_TIMEOUT_DISABLE;
break;
default:
*val = STTS22H_SMBUS_TIMEOUT_ENABLE;
break;
}
return ret;
}
/**
* @brief Register address automatically incremented during a multiple
* byte access with a serial interface.[set]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Change the values of "if_add_inc" in reg STTS22H.
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_auto_increment_set(stmdev_ctx_t *ctx, uint8_t val)
{
stts22h_ctrl_t ctrl;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
if (ret == 0)
{
ctrl.if_add_inc = (uint8_t)val;
ret = stts22h_write_reg(ctx, STTS22H_CTRL, (uint8_t *)&ctrl, 1);
}
return ret;
}
/**
* @brief Register address automatically incremented during a multiple
* byte access with a serial interface.[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Get the values of if_add_inc in reg CTRL.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_auto_increment_get(stmdev_ctx_t *ctx, uint8_t *val)
{
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_CTRL, (uint8_t *)&val, 1);
return ret;
}
/**
* @}
*
*/
/**
* @defgroup STTS22H_ Interrupt_on_threshold
* @brief This section group all the functions concerning the
* interrupt on threshold configuration.
* @{
*
*/
/**
* @brief Over temperature interrupt value. ( degC / 0.64 ) + 63.[set]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Change the values of thl in reg TEMP_H_LIMIT.
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_trshld_high_set(stmdev_ctx_t *ctx, uint8_t val)
{
stts22h_temp_h_limit_t temp_h_limit;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_TEMP_H_LIMIT,
(uint8_t *)&temp_h_limit, 1);
if (ret == 0)
{
temp_h_limit.thl = val;
ret = stts22h_write_reg(ctx, STTS22H_TEMP_H_LIMIT,
(uint8_t *)&temp_h_limit, 1);
}
return ret;
}
/**
* @brief Over temperature interrupt value. ( degC / 0.64 ) + 63.[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Get the values of thl in reg TEMP_H_LIMIT.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_trshld_high_get(stmdev_ctx_t *ctx, uint8_t *val)
{
stts22h_temp_h_limit_t temp_h_limit;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_TEMP_H_LIMIT,
(uint8_t *)&temp_h_limit, 1);
*val = temp_h_limit.thl;
return ret;
}
/**
* @brief Under temperature interrupt value. ( degC / 0.64 ) + 63.[set]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Change the values of tll in reg TEMP_L_LIMIT.
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_trshld_low_set(stmdev_ctx_t *ctx, uint8_t val)
{
stts22h_temp_l_limit_t temp_l_limit;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_TEMP_L_LIMIT,
(uint8_t *)&temp_l_limit, 1);
if (ret == 0)
{
temp_l_limit.tll = val;
ret = stts22h_write_reg(ctx, STTS22H_TEMP_L_LIMIT,
(uint8_t *)&temp_l_limit, 1);
}
return ret;
}
/**
* @brief Under temperature interrupt value. ( degC / 0.64 ) + 63.[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Get the values of tll in reg TEMP_L_LIMIT.(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_trshld_low_get(stmdev_ctx_t *ctx, uint8_t *val)
{
stts22h_temp_l_limit_t temp_l_limit;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_TEMP_L_LIMIT,
(uint8_t *)&temp_l_limit, 1);
*val = temp_l_limit.tll;
return ret;
}
/**
* @brief Temperature interrupt on threshold source.[get]
*
* @param ctx Read / write interface definitions.(ptr)
* @param val Low limit temperature exceeded..(ptr)
* @retval Interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t stts22h_temp_trshld_src_get(stmdev_ctx_t *ctx,
stts22h_temp_trlhd_src_t *val)
{
stts22h_status_t status;
int32_t ret;
ret = stts22h_read_reg(ctx, STTS22H_STATUS, (uint8_t *)&status, 1);
val->under_thl = status.under_thl;
val->over_thh = status.over_thh;
return ret;
}
/**
* @}
*
*/
/**
* @}
*
*/