/**
******************************************************************************
* @file lsm6dso.h
* @author MEMS Software Solutions Team
* @brief LSM6DSO header driver file
******************************************************************************
* @attention
*
*
© Copyright (c) 2019 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
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef LSM6DSO_H
#define LSM6DSO_H
#ifdef __cplusplus
extern "C"
{
#endif
/* Includes ------------------------------------------------------------------*/
#include "lsm6dso_reg.h"
#include
/** @addtogroup BSP BSP
* @{
*/
/** @addtogroup Component Component
* @{
*/
/** @addtogroup LSM6DSO LSM6DSO
* @{
*/
/** @defgroup LSM6DSO_Exported_Types LSM6DSO Exported Types
* @{
*/
typedef int32_t (*LSM6DSO_Init_Func)(void);
typedef int32_t (*LSM6DSO_DeInit_Func)(void);
typedef int32_t (*LSM6DSO_GetTick_Func)(void);
typedef int32_t (*LSM6DSO_WriteReg_Func)(uint16_t, uint16_t, uint8_t *, uint16_t);
typedef int32_t (*LSM6DSO_ReadReg_Func)(uint16_t, uint16_t, uint8_t *, uint16_t);
typedef enum
{
LSM6DSO_INT1_PIN,
LSM6DSO_INT2_PIN,
} LSM6DSO_SensorIntPin_t;
typedef enum
{
LSM6DSO_ACC_HIGH_PERFORMANCE_MODE,
LSM6DSO_ACC_LOW_POWER_NORMAL_MODE,
LSM6DSO_ACC_ULTRA_LOW_POWER_MODE
} LSM6DSO_ACC_Operating_Mode_t;
typedef enum
{
LSM6DSO_GYRO_HIGH_PERFORMANCE_MODE,
LSM6DSO_GYRO_LOW_POWER_NORMAL_MODE
} LSM6DSO_GYRO_Operating_Mode_t;
typedef struct
{
LSM6DSO_Init_Func Init;
LSM6DSO_DeInit_Func DeInit;
uint32_t BusType; /*0 means I2C, 1 means SPI 4-Wires, 2 means SPI-3-Wires */
uint8_t Address;
LSM6DSO_WriteReg_Func WriteReg;
LSM6DSO_ReadReg_Func ReadReg;
LSM6DSO_GetTick_Func GetTick;
} LSM6DSO_IO_t;
typedef struct
{
int16_t x;
int16_t y;
int16_t z;
} LSM6DSO_AxesRaw_t;
typedef struct
{
int32_t x;
int32_t y;
int32_t z;
} LSM6DSO_Axes_t;
typedef struct
{
unsigned int FreeFallStatus : 1;
unsigned int TapStatus : 1;
unsigned int DoubleTapStatus : 1;
unsigned int WakeUpStatus : 1;
unsigned int StepStatus : 1;
unsigned int TiltStatus : 1;
unsigned int D6DOrientationStatus : 1;
unsigned int SleepStatus : 1;
} LSM6DSO_Event_Status_t;
typedef struct
{
LSM6DSO_IO_t IO;
stmdev_ctx_t Ctx;
uint8_t is_initialized;
uint8_t acc_is_enabled;
uint8_t gyro_is_enabled;
lsm6dso_odr_xl_t acc_odr;
lsm6dso_odr_g_t gyro_odr;
} LSM6DSO_Object_t;
typedef struct
{
uint8_t Acc;
uint8_t Gyro;
uint8_t Magneto;
uint8_t LowPower;
uint32_t GyroMaxFS;
uint32_t AccMaxFS;
uint32_t MagMaxFS;
float_t GyroMaxOdr;
float_t AccMaxOdr;
float_t MagMaxOdr;
} LSM6DSO_Capabilities_t;
typedef struct
{
int32_t (*Init)(LSM6DSO_Object_t *);
int32_t (*DeInit)(LSM6DSO_Object_t *);
int32_t (*ReadID)(LSM6DSO_Object_t *, uint8_t *);
int32_t (*GetCapabilities)(LSM6DSO_Object_t *, LSM6DSO_Capabilities_t *);
} LSM6DSO_CommonDrv_t;
typedef struct
{
int32_t (*Enable)(LSM6DSO_Object_t *);
int32_t (*Disable)(LSM6DSO_Object_t *);
int32_t (*GetSensitivity)(LSM6DSO_Object_t *, float_t *);
int32_t (*GetOutputDataRate)(LSM6DSO_Object_t *, float_t *);
int32_t (*SetOutputDataRate)(LSM6DSO_Object_t *, float_t);
int32_t (*GetFullScale)(LSM6DSO_Object_t *, int32_t *);
int32_t (*SetFullScale)(LSM6DSO_Object_t *, int32_t);
int32_t (*GetAxes)(LSM6DSO_Object_t *, LSM6DSO_Axes_t *);
int32_t (*GetAxesRaw)(LSM6DSO_Object_t *, LSM6DSO_AxesRaw_t *);
} LSM6DSO_ACC_Drv_t;
typedef struct
{
int32_t (*Enable)(LSM6DSO_Object_t *);
int32_t (*Disable)(LSM6DSO_Object_t *);
int32_t (*GetSensitivity)(LSM6DSO_Object_t *, float_t *);
int32_t (*GetOutputDataRate)(LSM6DSO_Object_t *, float_t *);
int32_t (*SetOutputDataRate)(LSM6DSO_Object_t *, float_t);
int32_t (*GetFullScale)(LSM6DSO_Object_t *, int32_t *);
int32_t (*SetFullScale)(LSM6DSO_Object_t *, int32_t);
int32_t (*GetAxes)(LSM6DSO_Object_t *, LSM6DSO_Axes_t *);
int32_t (*GetAxesRaw)(LSM6DSO_Object_t *, LSM6DSO_AxesRaw_t *);
} LSM6DSO_GYRO_Drv_t;
typedef union{
int16_t i16bit[3];
uint8_t u8bit[6];
} lsm6dso_axis3bit16_t;
typedef union{
int16_t i16bit;
uint8_t u8bit[2];
} lsm6dso_axis1bit16_t;
typedef union{
int32_t i32bit[3];
uint8_t u8bit[12];
} lsm6dso_axis3bit32_t;
typedef union{
int32_t i32bit;
uint8_t u8bit[4];
} lsm6dso_axis1bit32_t;
/**
* @}
*/
/** @defgroup LSM6DSO_Exported_Constants LSM6DSO Exported Constants
* @{
*/
#define LSM6DSO_OK 0
#define LSM6DSO_ERROR -1
#define LSM6DSO_I2C_BUS 0U
#define LSM6DSO_SPI_4WIRES_BUS 1U
#define LSM6DSO_SPI_3WIRES_BUS 2U
#define LSM6DSO_ACC_SENSITIVITY_FS_2G 0.061f
#define LSM6DSO_ACC_SENSITIVITY_FS_4G 0.122f
#define LSM6DSO_ACC_SENSITIVITY_FS_8G 0.244f
#define LSM6DSO_ACC_SENSITIVITY_FS_16G 0.488f
#define LSM6DSO_GYRO_SENSITIVITY_FS_125DPS 4.375f
#define LSM6DSO_GYRO_SENSITIVITY_FS_250DPS 8.750f
#define LSM6DSO_GYRO_SENSITIVITY_FS_500DPS 17.500f
#define LSM6DSO_GYRO_SENSITIVITY_FS_1000DPS 35.000f
#define LSM6DSO_GYRO_SENSITIVITY_FS_2000DPS 70.000f
/**
* @}
*/
/** @addtogroup LSM6DSO_Exported_Functions LSM6DSO Exported Functions
* @{
*/
int32_t LSM6DSO_RegisterBusIO(LSM6DSO_Object_t *pObj, LSM6DSO_IO_t *pIO);
int32_t LSM6DSO_Init(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_DeInit(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ReadID(LSM6DSO_Object_t *pObj, uint8_t *Id);
int32_t LSM6DSO_GetCapabilities(LSM6DSO_Object_t *pObj, LSM6DSO_Capabilities_t *Capabilities);
int32_t LSM6DSO_ACC_Enable(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Disable(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_GetSensitivity(LSM6DSO_Object_t *pObj, float_t *Sensitivity);
int32_t LSM6DSO_ACC_GetOutputDataRate(LSM6DSO_Object_t *pObj, float_t *Odr);
int32_t LSM6DSO_ACC_SetOutputDataRate(LSM6DSO_Object_t *pObj, float_t Odr);
int32_t LSM6DSO_ACC_SetOutputDataRate_With_Mode(LSM6DSO_Object_t *pObj, float_t Odr, LSM6DSO_ACC_Operating_Mode_t Mode);
int32_t LSM6DSO_ACC_GetFullScale(LSM6DSO_Object_t *pObj, int32_t *FullScale);
int32_t LSM6DSO_ACC_SetFullScale(LSM6DSO_Object_t *pObj, int32_t FullScale);
int32_t LSM6DSO_ACC_GetAxesRaw(LSM6DSO_Object_t *pObj, LSM6DSO_AxesRaw_t *Value);
int32_t LSM6DSO_ACC_GetAxes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *Acceleration);
int32_t LSM6DSO_GYRO_Enable(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_GYRO_Disable(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_GYRO_GetSensitivity(LSM6DSO_Object_t *pObj, float_t *Sensitivity);
int32_t LSM6DSO_GYRO_GetOutputDataRate(LSM6DSO_Object_t *pObj, float_t *Odr);
int32_t LSM6DSO_GYRO_SetOutputDataRate(LSM6DSO_Object_t *pObj, float_t Odr);
int32_t LSM6DSO_GYRO_SetOutputDataRate_With_Mode(LSM6DSO_Object_t *pObj, float_t Odr, LSM6DSO_GYRO_Operating_Mode_t Mode);
int32_t LSM6DSO_GYRO_GetFullScale(LSM6DSO_Object_t *pObj, int32_t *FullScale);
int32_t LSM6DSO_GYRO_SetFullScale(LSM6DSO_Object_t *pObj, int32_t FullScale);
int32_t LSM6DSO_GYRO_GetAxesRaw(LSM6DSO_Object_t *pObj, LSM6DSO_AxesRaw_t *Value);
int32_t LSM6DSO_GYRO_GetAxes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *AngularRate);
int32_t LSM6DSO_Read_Reg(LSM6DSO_Object_t *pObj, uint8_t reg, uint8_t *Data);
int32_t LSM6DSO_Write_Reg(LSM6DSO_Object_t *pObj, uint8_t reg, uint8_t Data);
int32_t LSM6DSO_Set_Interrupt_Latch(LSM6DSO_Object_t *pObj, uint8_t Status);
int32_t LSM6DSO_ACC_Enable_Free_Fall_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
int32_t LSM6DSO_ACC_Disable_Free_Fall_Detection(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Set_Free_Fall_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
int32_t LSM6DSO_ACC_Set_Free_Fall_Duration(LSM6DSO_Object_t *pObj, uint8_t Duration);
int32_t LSM6DSO_ACC_Enable_Pedometer(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Disable_Pedometer(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Get_Step_Count(LSM6DSO_Object_t *pObj, uint16_t *StepCount);
int32_t LSM6DSO_ACC_Step_Counter_Reset(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Enable_Tilt_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
int32_t LSM6DSO_ACC_Disable_Tilt_Detection(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Enable_Wake_Up_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
int32_t LSM6DSO_ACC_Disable_Wake_Up_Detection(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Set_Wake_Up_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
int32_t LSM6DSO_ACC_Set_Wake_Up_Duration(LSM6DSO_Object_t *pObj, uint8_t Duration);
int32_t LSM6DSO_ACC_Enable_Single_Tap_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
int32_t LSM6DSO_ACC_Disable_Single_Tap_Detection(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Enable_Double_Tap_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
int32_t LSM6DSO_ACC_Disable_Double_Tap_Detection(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Set_Tap_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
int32_t LSM6DSO_ACC_Set_Tap_Shock_Time(LSM6DSO_Object_t *pObj, uint8_t Time);
int32_t LSM6DSO_ACC_Set_Tap_Quiet_Time(LSM6DSO_Object_t *pObj, uint8_t Time);
int32_t LSM6DSO_ACC_Set_Tap_Duration_Time(LSM6DSO_Object_t *pObj, uint8_t Time);
int32_t LSM6DSO_ACC_Enable_6D_Orientation(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
int32_t LSM6DSO_ACC_Disable_6D_Orientation(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Set_6D_Orientation_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
int32_t LSM6DSO_ACC_Get_6D_Orientation_XL(LSM6DSO_Object_t *pObj, uint8_t *XLow);
int32_t LSM6DSO_ACC_Get_6D_Orientation_XH(LSM6DSO_Object_t *pObj, uint8_t *XHigh);
int32_t LSM6DSO_ACC_Get_6D_Orientation_YL(LSM6DSO_Object_t *pObj, uint8_t *YLow);
int32_t LSM6DSO_ACC_Get_6D_Orientation_YH(LSM6DSO_Object_t *pObj, uint8_t *YHigh);
int32_t LSM6DSO_ACC_Get_6D_Orientation_ZL(LSM6DSO_Object_t *pObj, uint8_t *ZLow);
int32_t LSM6DSO_ACC_Get_6D_Orientation_ZH(LSM6DSO_Object_t *pObj, uint8_t *ZHigh);
int32_t LSM6DSO_ACC_Get_DRDY_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
int32_t LSM6DSO_ACC_Get_Event_Status(LSM6DSO_Object_t *pObj, LSM6DSO_Event_Status_t *Status);
int32_t LSM6DSO_ACC_Set_SelfTest(LSM6DSO_Object_t *pObj, uint8_t Status);
int32_t LSM6DSO_GYRO_Get_DRDY_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
int32_t LSM6DSO_GYRO_Set_SelfTest(LSM6DSO_Object_t *pObj, uint8_t Status);
int32_t LSM6DSO_FIFO_Get_Num_Samples(LSM6DSO_Object_t *pObj, uint16_t *NumSamples);
int32_t LSM6DSO_FIFO_Get_Full_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
int32_t LSM6DSO_FIFO_Set_INT1_FIFO_Full(LSM6DSO_Object_t *pObj, uint8_t Status);
int32_t LSM6DSO_FIFO_Set_Watermark_Level(LSM6DSO_Object_t *pObj, uint16_t Watermark);
int32_t LSM6DSO_FIFO_Set_Stop_On_Fth(LSM6DSO_Object_t *pObj, uint8_t Status);
int32_t LSM6DSO_FIFO_Set_Mode(LSM6DSO_Object_t *pObj, uint8_t Mode);
int32_t LSM6DSO_FIFO_Get_Tag(LSM6DSO_Object_t *pObj, uint8_t *Tag);
int32_t LSM6DSO_FIFO_Get_Data(LSM6DSO_Object_t *pObj, uint8_t *Data);
int32_t LSM6DSO_FIFO_Get_Empty_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
int32_t LSM6DSO_FIFO_Get_Overrun_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
int32_t LSM6DSO_FIFO_ACC_Get_Axes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *Acceleration);
int32_t LSM6DSO_FIFO_ACC_Set_BDR(LSM6DSO_Object_t *pObj, float_t Bdr);
int32_t LSM6DSO_FIFO_GYRO_Get_Axes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *AngularVelocity);
int32_t LSM6DSO_FIFO_GYRO_Set_BDR(LSM6DSO_Object_t *pObj, float_t Bdr);
int32_t LSM6DSO_ACC_Enable_DRDY_On_INT1(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Disable_DRDY_On_INT1(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Set_Power_Mode(LSM6DSO_Object_t *pObj, uint8_t PowerMode);
int32_t LSM6DSO_ACC_Set_Filter_Mode(LSM6DSO_Object_t *pObj, uint8_t LowHighPassFlag, uint8_t FilterMode);
int32_t LSM6DSO_ACC_Enable_Inactivity_Detection(LSM6DSO_Object_t *pObj, lsm6dso_inact_en_t InactMode, LSM6DSO_SensorIntPin_t IntPin);
int32_t LSM6DSO_ACC_Disable_Inactivity_Detection(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_ACC_Set_Sleep_Duration(LSM6DSO_Object_t *pObj, uint8_t Duration);
int32_t LSM6DSO_GYRO_Enable_DRDY_On_INT2(LSM6DSO_Object_t *pObj);
int32_t LSM6DSO_GYRO_Set_Power_Mode(LSM6DSO_Object_t *pObj, uint8_t PowerMode);
int32_t LSM6DSO_GYRO_Set_Filter_Mode(LSM6DSO_Object_t *pObj, uint8_t LowHighPassFlag, uint8_t FilterMode);
int32_t LSM6DSO_DRDY_Set_Mode(LSM6DSO_Object_t *pObj, uint8_t Mode);
/**
* @}
*/
/** @addtogroup LSM6DSO_Exported_Variables LSM6DSO Exported Variables
* @{
*/
extern LSM6DSO_CommonDrv_t LSM6DSO_COMMON_Driver;
extern LSM6DSO_ACC_Drv_t LSM6DSO_ACC_Driver;
extern LSM6DSO_GYRO_Drv_t LSM6DSO_GYRO_Driver;
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/