638 lines
14 KiB
C
638 lines
14 KiB
C
/**
|
|
******************************************************************************
|
|
* @file stts22h.c
|
|
* @author MEMS Software Solutions 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.
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "stts22h.h"
|
|
|
|
/** @addtogroup BSP BSP
|
|
* @{
|
|
*/
|
|
|
|
/** @addtogroup Component Component
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup STTS22H STTS22H
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup STTS22H_Exported_Variables STTS22H Exported Variables
|
|
* @{
|
|
*/
|
|
|
|
STTS22H_CommonDrv_t STTS22H_COMMON_Driver =
|
|
{
|
|
STTS22H_Init,
|
|
STTS22H_DeInit,
|
|
STTS22H_ReadID,
|
|
STTS22H_GetCapabilities,
|
|
};
|
|
|
|
STTS22H_TEMP_Drv_t STTS22H_TEMP_Driver =
|
|
{
|
|
STTS22H_TEMP_Enable,
|
|
STTS22H_TEMP_Disable,
|
|
STTS22H_TEMP_GetOutputDataRate,
|
|
STTS22H_TEMP_SetOutputDataRate,
|
|
STTS22H_TEMP_GetTemperature,
|
|
};
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup STTS22H_Private_Function_Prototypes STTS22H Private Function Prototypes
|
|
* @{
|
|
*/
|
|
|
|
static int32_t ReadRegWrap(void *Handle, uint8_t Reg, uint8_t *pData, uint16_t Length);
|
|
static int32_t WriteRegWrap(void *Handle, uint8_t Reg, uint8_t *pData, uint16_t Length);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup STTS22H_Exported_Functions STTS22H Exported Functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Register Component Bus IO operations
|
|
* @param pObj the device pObj
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_RegisterBusIO(STTS22H_Object_t *pObj, STTS22H_IO_t *pIO)
|
|
{
|
|
int32_t ret;
|
|
|
|
if (pObj == NULL)
|
|
{
|
|
ret = STTS22H_ERROR;
|
|
}
|
|
else
|
|
{
|
|
pObj->IO.Init = pIO->Init;
|
|
pObj->IO.DeInit = pIO->DeInit;
|
|
pObj->IO.BusType = pIO->BusType;
|
|
pObj->IO.Address = pIO->Address;
|
|
pObj->IO.WriteReg = pIO->WriteReg;
|
|
pObj->IO.ReadReg = pIO->ReadReg;
|
|
pObj->IO.GetTick = pIO->GetTick;
|
|
|
|
pObj->Ctx.read_reg = ReadRegWrap;
|
|
pObj->Ctx.write_reg = WriteRegWrap;
|
|
pObj->Ctx.handle = pObj;
|
|
|
|
if (pObj->IO.Init != NULL)
|
|
{
|
|
ret = pObj->IO.Init();
|
|
}
|
|
else
|
|
{
|
|
ret = STTS22H_ERROR;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Initialize the STTS22H sensor
|
|
* @param pObj the device pObj
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_Init(STTS22H_Object_t *pObj)
|
|
{
|
|
if (pObj->is_initialized == 0U)
|
|
{
|
|
/* Set default ODR */
|
|
pObj->temp_odr = 1.0f;
|
|
|
|
/* Enable BDU */
|
|
if (stts22h_block_data_update_set(&(pObj->Ctx), PROPERTY_ENABLE) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
/* Enable Automatic Address Increment */
|
|
if (stts22h_auto_increment_set(&(pObj->Ctx), PROPERTY_ENABLE) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
/* Put the component in standby mode. */
|
|
if (stts22h_temp_data_rate_set(&(pObj->Ctx), STTS22H_POWER_DOWN) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
}
|
|
|
|
pObj->is_initialized = 1;
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Deinitialize the STTS22H sensor
|
|
* @param pObj the device pObj
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_DeInit(STTS22H_Object_t *pObj)
|
|
{
|
|
if (pObj->is_initialized == 1U)
|
|
{
|
|
/* Put the component in standby mode */
|
|
if (STTS22H_TEMP_Disable(pObj) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
}
|
|
|
|
pObj->is_initialized = 0;
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get WHO_AM_I value
|
|
* @param pObj the device pObj
|
|
* @param Id the WHO_AM_I value
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_ReadID(STTS22H_Object_t *pObj, uint8_t *Id)
|
|
{
|
|
uint8_t buf;
|
|
|
|
if (stts22h_dev_id_get(&(pObj->Ctx), &buf) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
*Id = buf;
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get STTS22H sensor capabilities
|
|
* @param pObj Component object pointer
|
|
* @param Capabilities pointer to STTS22H sensor capabilities
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_GetCapabilities(STTS22H_Object_t *pObj, STTS22H_Capabilities_t *Capabilities)
|
|
{
|
|
/* Prevent unused argument(s) compilation warning */
|
|
(void)(pObj);
|
|
|
|
Capabilities->Humidity = 0;
|
|
Capabilities->Pressure = 0;
|
|
Capabilities->Temperature = 1;
|
|
Capabilities->LowPower = 0;
|
|
Capabilities->HumMaxOdr = 0.0f;
|
|
Capabilities->TempMaxOdr = 200.0f;
|
|
Capabilities->PressMaxOdr = 0.0f;
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the STTS22H initialization status
|
|
* @param pObj the device pObj
|
|
* @param Status 1 if initialized, 0 otherwise
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_Get_Init_Status(STTS22H_Object_t *pObj, uint8_t *Status)
|
|
{
|
|
if (pObj == NULL)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
*Status = pObj->is_initialized;
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable the STTS22H temperature sensor
|
|
* @param pObj the device pObj
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_Enable(STTS22H_Object_t *pObj)
|
|
{
|
|
/* Check if the component is already enabled */
|
|
if (pObj->temp_is_enabled == 1U)
|
|
{
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/* Power on the component and set the odr. */
|
|
if (STTS22H_TEMP_SetOutputDataRate(pObj, pObj->temp_odr) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
pObj->temp_is_enabled = 1;
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable the STTS22H temperature sensor
|
|
* @param pObj the device pObj
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_Disable(STTS22H_Object_t *pObj)
|
|
{
|
|
/* Check if the component is already disabled */
|
|
if (pObj->temp_is_enabled == 0U)
|
|
{
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/* Save the current odr. */
|
|
if (STTS22H_TEMP_GetOutputDataRate(pObj, &pObj->temp_odr) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
/* Put the component in standby mode. */
|
|
if (stts22h_temp_data_rate_set(&(pObj->Ctx), STTS22H_POWER_DOWN) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
pObj->temp_is_enabled = 0;
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the STTS22H temperature sensor output data rate
|
|
* @param pObj the device pObj
|
|
* @param Odr pointer where the output data rate is written
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_GetOutputDataRate(STTS22H_Object_t *pObj, float *Odr)
|
|
{
|
|
int32_t ret = STTS22H_OK;
|
|
stts22h_odr_temp_t odr_low_level;
|
|
|
|
if (stts22h_temp_data_rate_get(&(pObj->Ctx), &odr_low_level) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
switch (odr_low_level)
|
|
{
|
|
case STTS22H_POWER_DOWN:
|
|
case STTS22H_ONE_SHOT:
|
|
*Odr = 0.0f;
|
|
break;
|
|
|
|
case STTS22H_1Hz:
|
|
*Odr = 1.0f;
|
|
break;
|
|
|
|
case STTS22H_25Hz:
|
|
*Odr = 25.0f;
|
|
break;
|
|
|
|
case STTS22H_50Hz:
|
|
*Odr = 50.0f;
|
|
break;
|
|
|
|
case STTS22H_100Hz:
|
|
*Odr = 100.0f;
|
|
break;
|
|
|
|
case STTS22H_200Hz:
|
|
*Odr = 200.0f;
|
|
break;
|
|
|
|
default:
|
|
ret = STTS22H_ERROR;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the STTS22H temperature sensor output data rate
|
|
* @param pObj the device pObj
|
|
* @param Odr the output data rate value to be set
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_SetOutputDataRate(STTS22H_Object_t *pObj, float Odr)
|
|
{
|
|
stts22h_odr_temp_t new_odr;
|
|
|
|
new_odr = (Odr <= 1.0f) ? STTS22H_1Hz
|
|
: (Odr <= 25.0f) ? STTS22H_25Hz
|
|
: (Odr <= 50.0f) ? STTS22H_50Hz
|
|
: (Odr <= 100.0f) ? STTS22H_100Hz
|
|
: STTS22H_200Hz;
|
|
|
|
if (stts22h_temp_data_rate_set(&(pObj->Ctx), new_odr) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the STTS22H temperature value
|
|
* @param pObj the device pObj
|
|
* @param Value pointer where the temperature value is written
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_GetTemperature(STTS22H_Object_t *pObj, float *Value)
|
|
{
|
|
int16_t raw_value;
|
|
|
|
/* Get the temperature */
|
|
if (stts22h_temperature_raw_get(&(pObj->Ctx), &raw_value) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
*Value = stts22h_from_lsb_to_celsius(raw_value);
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the STTS22H temperature data ready bit value
|
|
* @param pObj the device pObj
|
|
* @param Status the status of data ready bit
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_Get_DRDY_Status(STTS22H_Object_t *pObj, uint8_t *Status)
|
|
{
|
|
uint8_t val;
|
|
|
|
if (stts22h_temp_flag_data_ready_get(&(pObj->Ctx), &val) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
if (val)
|
|
{
|
|
*Status = 1;
|
|
}
|
|
else
|
|
{
|
|
*Status = 0;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the STTS22H high temperature threshold value
|
|
* @param pObj the device pObj
|
|
* @param Value the high temperature threshold to be set
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_SetHighTemperatureThreshold(STTS22H_Object_t *pObj, float Value)
|
|
{
|
|
uint8_t raw_value;
|
|
|
|
raw_value = (uint8_t)((Value / 0.64f) + 63.0f);
|
|
|
|
/* Set the temperature threshold */
|
|
if (stts22h_temp_trshld_high_set(&(pObj->Ctx), raw_value) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the STTS22H low temperature threshold value
|
|
* @param pObj the device pObj
|
|
* @param Value the high temperature threshold to be set
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_SetLowTemperatureThreshold(STTS22H_Object_t *pObj, float Value)
|
|
{
|
|
uint8_t raw_value;
|
|
|
|
raw_value = (uint8_t)((Value / 0.64f) + 63.0f);
|
|
|
|
/* Set the temperature threshold */
|
|
if (stts22h_temp_trshld_low_set(&(pObj->Ctx), raw_value) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the STTS22H temperature limits status
|
|
* @param pObj the device pObj
|
|
* @param HighLimit indicates that high temperature limit has been exceeded
|
|
* @param LowhLimit indicates that low temperature limit has been exceeded
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_TEMP_GetTemperatureLimitStatus(STTS22H_Object_t *pObj, uint8_t *HighLimit, uint8_t *LowLimit)
|
|
{
|
|
stts22h_temp_trlhd_src_t status;
|
|
|
|
/* Read status register */
|
|
if (stts22h_temp_trshld_src_get(&(pObj->Ctx), &status) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
if (HighLimit != NULL)
|
|
{
|
|
*HighLimit = status.over_thh;
|
|
}
|
|
|
|
if (LowLimit != NULL)
|
|
{
|
|
*LowLimit = status.under_thl;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the STTS22H register value
|
|
* @param pObj the device pObj
|
|
* @param Reg address to be read
|
|
* @param Data pointer where the value is written
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_Read_Reg(STTS22H_Object_t *pObj, uint8_t Reg, uint8_t *Data)
|
|
{
|
|
if (stts22h_read_reg(&(pObj->Ctx), Reg, Data, 1) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the STTS22H register value
|
|
* @param pObj the device pObj
|
|
* @param Reg address to be written
|
|
* @param Data value to be written
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_Write_Reg(STTS22H_Object_t *pObj, uint8_t Reg, uint8_t Data)
|
|
{
|
|
if (stts22h_write_reg(&(pObj->Ctx), Reg, &Data, 1) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Set the STTS22H One Shot Mode
|
|
* @param pObj the device pObj
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_Set_One_Shot(STTS22H_Object_t *pObj)
|
|
{
|
|
/* Start One Shot Measurement */
|
|
if (stts22h_temp_data_rate_set(&(pObj->Ctx), STTS22H_ONE_SHOT) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the STTS22H One Shot Status
|
|
* @param pObj the device pObj
|
|
* @param Status pointer to the one shot status (1 means measurements available, 0 means measurements not available yet)
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
int32_t STTS22H_Get_One_Shot_Status(STTS22H_Object_t *pObj, uint8_t *Status)
|
|
{
|
|
stts22h_dev_status_t status;
|
|
|
|
/* Get Busy flag */
|
|
if (stts22h_dev_status_get(&(pObj->Ctx), &status) != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
|
|
if (status.busy)
|
|
{
|
|
*Status = 0;
|
|
}
|
|
else
|
|
{
|
|
*Status = 1;
|
|
}
|
|
|
|
return STTS22H_OK;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup STTS22H_Private_Functions STTS22H Private Functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Wrap Read register component function to Bus IO function
|
|
* @param Handle the device handler
|
|
* @param Reg the register address
|
|
* @param pData the stored data pointer
|
|
* @param Length the length
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
static int32_t ReadRegWrap(void *Handle, uint8_t Reg, uint8_t *pData, uint16_t Length)
|
|
{
|
|
uint16_t i;
|
|
int32_t ret = STTS22H_OK;
|
|
STTS22H_Object_t *pObj = (STTS22H_Object_t *)Handle;
|
|
|
|
if (pObj->IO.BusType == (uint32_t)STTS22H_I2C_BUS) /* I2C */
|
|
{
|
|
for (i = 0; i < Length; i++)
|
|
{
|
|
ret = pObj->IO.ReadReg(pObj->IO.Address, (Reg + i), &pData[i], 1);
|
|
if (ret != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Wrap Write register component function to Bus IO function
|
|
* @param Handle the device handler
|
|
* @param Reg the register address
|
|
* @param pData the stored data pointer
|
|
* @param Length the length
|
|
* @retval 0 in case of success, an error code otherwise
|
|
*/
|
|
static int32_t WriteRegWrap(void *Handle, uint8_t Reg, uint8_t *pData, uint16_t Length)
|
|
{
|
|
uint16_t i;
|
|
int32_t ret = STTS22H_OK;
|
|
STTS22H_Object_t *pObj = (STTS22H_Object_t *)Handle;
|
|
|
|
if (pObj->IO.BusType == (uint32_t)STTS22H_I2C_BUS) /* I2C */
|
|
{
|
|
for (i = 0; i < Length; i++)
|
|
{
|
|
ret = pObj->IO.WriteReg(pObj->IO.Address, (Reg + i), &pData[i], 1);
|
|
if (ret != STTS22H_OK)
|
|
{
|
|
return STTS22H_ERROR;
|
|
}
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|