lsm6dso.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. /**
  2. ******************************************************************************
  3. * @file lsm6dso.h
  4. * @author MEMS Software Solutions Team
  5. * @brief LSM6DSO header driver file
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* Define to prevent recursive inclusion -------------------------------------*/
  19. #ifndef LSM6DSO_H
  20. #define LSM6DSO_H
  21. #ifdef __cplusplus
  22. extern "C"
  23. {
  24. #endif
  25. /* Includes ------------------------------------------------------------------*/
  26. #include "lsm6dso_reg.h"
  27. #include <string.h>
  28. /** @addtogroup BSP BSP
  29. * @{
  30. */
  31. /** @addtogroup Component Component
  32. * @{
  33. */
  34. /** @addtogroup LSM6DSO LSM6DSO
  35. * @{
  36. */
  37. /** @defgroup LSM6DSO_Exported_Types LSM6DSO Exported Types
  38. * @{
  39. */
  40. typedef int32_t (*LSM6DSO_Init_Func)(void);
  41. typedef int32_t (*LSM6DSO_DeInit_Func)(void);
  42. typedef int32_t (*LSM6DSO_GetTick_Func)(void);
  43. typedef void (*LSM6DSO_Delay_Func)(uint32_t);
  44. typedef int32_t (*LSM6DSO_WriteReg_Func)(uint16_t, uint16_t, uint8_t *, uint16_t);
  45. typedef int32_t (*LSM6DSO_ReadReg_Func)(uint16_t, uint16_t, uint8_t *, uint16_t);
  46. typedef enum
  47. {
  48. LSM6DSO_INT1_PIN,
  49. LSM6DSO_INT2_PIN,
  50. } LSM6DSO_SensorIntPin_t;
  51. typedef enum
  52. {
  53. LSM6DSO_ACC_HIGH_PERFORMANCE_MODE,
  54. LSM6DSO_ACC_LOW_POWER_NORMAL_MODE,
  55. LSM6DSO_ACC_ULTRA_LOW_POWER_MODE
  56. } LSM6DSO_ACC_Operating_Mode_t;
  57. typedef enum
  58. {
  59. LSM6DSO_GYRO_HIGH_PERFORMANCE_MODE,
  60. LSM6DSO_GYRO_LOW_POWER_NORMAL_MODE
  61. } LSM6DSO_GYRO_Operating_Mode_t;
  62. typedef struct
  63. {
  64. LSM6DSO_Init_Func Init;
  65. LSM6DSO_DeInit_Func DeInit;
  66. uint32_t BusType; /*0 means I2C, 1 means SPI 4-Wires, 2 means SPI-3-Wires */
  67. uint8_t Address;
  68. LSM6DSO_WriteReg_Func WriteReg;
  69. LSM6DSO_ReadReg_Func ReadReg;
  70. LSM6DSO_GetTick_Func GetTick;
  71. LSM6DSO_Delay_Func Delay;
  72. } LSM6DSO_IO_t;
  73. typedef struct
  74. {
  75. int16_t x;
  76. int16_t y;
  77. int16_t z;
  78. } LSM6DSO_AxesRaw_t;
  79. typedef struct
  80. {
  81. int32_t x;
  82. int32_t y;
  83. int32_t z;
  84. } LSM6DSO_Axes_t;
  85. typedef struct
  86. {
  87. unsigned int FreeFallStatus : 1;
  88. unsigned int TapStatus : 1;
  89. unsigned int DoubleTapStatus : 1;
  90. unsigned int WakeUpStatus : 1;
  91. unsigned int StepStatus : 1;
  92. unsigned int TiltStatus : 1;
  93. unsigned int D6DOrientationStatus : 1;
  94. unsigned int SleepStatus : 1;
  95. } LSM6DSO_Event_Status_t;
  96. typedef struct
  97. {
  98. LSM6DSO_IO_t IO;
  99. stmdev_ctx_t Ctx;
  100. uint8_t is_initialized;
  101. uint8_t acc_is_enabled;
  102. uint8_t gyro_is_enabled;
  103. lsm6dso_odr_xl_t acc_odr;
  104. lsm6dso_odr_g_t gyro_odr;
  105. } LSM6DSO_Object_t;
  106. typedef struct
  107. {
  108. uint8_t Acc;
  109. uint8_t Gyro;
  110. uint8_t Magneto;
  111. uint8_t LowPower;
  112. uint32_t GyroMaxFS;
  113. uint32_t AccMaxFS;
  114. uint32_t MagMaxFS;
  115. float_t GyroMaxOdr;
  116. float_t AccMaxOdr;
  117. float_t MagMaxOdr;
  118. } LSM6DSO_Capabilities_t;
  119. typedef struct
  120. {
  121. int32_t (*Init)(LSM6DSO_Object_t *);
  122. int32_t (*DeInit)(LSM6DSO_Object_t *);
  123. int32_t (*ReadID)(LSM6DSO_Object_t *, uint8_t *);
  124. int32_t (*GetCapabilities)(LSM6DSO_Object_t *, LSM6DSO_Capabilities_t *);
  125. } LSM6DSO_CommonDrv_t;
  126. typedef struct
  127. {
  128. int32_t (*Enable)(LSM6DSO_Object_t *);
  129. int32_t (*Disable)(LSM6DSO_Object_t *);
  130. int32_t (*GetSensitivity)(LSM6DSO_Object_t *, float_t *);
  131. int32_t (*GetOutputDataRate)(LSM6DSO_Object_t *, float_t *);
  132. int32_t (*SetOutputDataRate)(LSM6DSO_Object_t *, float_t);
  133. int32_t (*GetFullScale)(LSM6DSO_Object_t *, int32_t *);
  134. int32_t (*SetFullScale)(LSM6DSO_Object_t *, int32_t);
  135. int32_t (*GetAxes)(LSM6DSO_Object_t *, LSM6DSO_Axes_t *);
  136. int32_t (*GetAxesRaw)(LSM6DSO_Object_t *, LSM6DSO_AxesRaw_t *);
  137. } LSM6DSO_ACC_Drv_t;
  138. typedef struct
  139. {
  140. int32_t (*Enable)(LSM6DSO_Object_t *);
  141. int32_t (*Disable)(LSM6DSO_Object_t *);
  142. int32_t (*GetSensitivity)(LSM6DSO_Object_t *, float_t *);
  143. int32_t (*GetOutputDataRate)(LSM6DSO_Object_t *, float_t *);
  144. int32_t (*SetOutputDataRate)(LSM6DSO_Object_t *, float_t);
  145. int32_t (*GetFullScale)(LSM6DSO_Object_t *, int32_t *);
  146. int32_t (*SetFullScale)(LSM6DSO_Object_t *, int32_t);
  147. int32_t (*GetAxes)(LSM6DSO_Object_t *, LSM6DSO_Axes_t *);
  148. int32_t (*GetAxesRaw)(LSM6DSO_Object_t *, LSM6DSO_AxesRaw_t *);
  149. } LSM6DSO_GYRO_Drv_t;
  150. typedef union
  151. {
  152. int16_t i16bit[3];
  153. uint8_t u8bit[6];
  154. } lsm6dso_axis3bit16_t;
  155. typedef union
  156. {
  157. int16_t i16bit;
  158. uint8_t u8bit[2];
  159. } lsm6dso_axis1bit16_t;
  160. typedef union
  161. {
  162. int32_t i32bit[3];
  163. uint8_t u8bit[12];
  164. } lsm6dso_axis3bit32_t;
  165. typedef union
  166. {
  167. int32_t i32bit;
  168. uint8_t u8bit[4];
  169. } lsm6dso_axis1bit32_t;
  170. /**
  171. * @}
  172. */
  173. /** @defgroup LSM6DSO_Exported_Constants LSM6DSO Exported Constants
  174. * @{
  175. */
  176. #define LSM6DSO_OK 0
  177. #define LSM6DSO_ERROR -1
  178. #define LSM6DSO_I2C_BUS 0U
  179. #define LSM6DSO_SPI_4WIRES_BUS 1U
  180. #define LSM6DSO_SPI_3WIRES_BUS 2U
  181. #define LSM6DSO_ACC_SENSITIVITY_FS_2G 0.061f
  182. #define LSM6DSO_ACC_SENSITIVITY_FS_4G 0.122f
  183. #define LSM6DSO_ACC_SENSITIVITY_FS_8G 0.244f
  184. #define LSM6DSO_ACC_SENSITIVITY_FS_16G 0.488f
  185. #define LSM6DSO_GYRO_SENSITIVITY_FS_125DPS 4.375f
  186. #define LSM6DSO_GYRO_SENSITIVITY_FS_250DPS 8.750f
  187. #define LSM6DSO_GYRO_SENSITIVITY_FS_500DPS 17.500f
  188. #define LSM6DSO_GYRO_SENSITIVITY_FS_1000DPS 35.000f
  189. #define LSM6DSO_GYRO_SENSITIVITY_FS_2000DPS 70.000f
  190. /**
  191. * @}
  192. */
  193. /** @addtogroup LSM6DSO_Exported_Functions LSM6DSO Exported Functions
  194. * @{
  195. */
  196. int32_t LSM6DSO_RegisterBusIO(LSM6DSO_Object_t *pObj, LSM6DSO_IO_t *pIO);
  197. int32_t LSM6DSO_Init(LSM6DSO_Object_t *pObj);
  198. int32_t LSM6DSO_DeInit(LSM6DSO_Object_t *pObj);
  199. int32_t LSM6DSO_ReadID(LSM6DSO_Object_t *pObj, uint8_t *Id);
  200. int32_t LSM6DSO_GetCapabilities(LSM6DSO_Object_t *pObj, LSM6DSO_Capabilities_t *Capabilities);
  201. int32_t LSM6DSO_ACC_Enable(LSM6DSO_Object_t *pObj);
  202. int32_t LSM6DSO_ACC_Disable(LSM6DSO_Object_t *pObj);
  203. int32_t LSM6DSO_ACC_GetSensitivity(LSM6DSO_Object_t *pObj, float_t *Sensitivity);
  204. int32_t LSM6DSO_ACC_GetOutputDataRate(LSM6DSO_Object_t *pObj, float_t *Odr);
  205. int32_t LSM6DSO_ACC_SetOutputDataRate(LSM6DSO_Object_t *pObj, float_t Odr);
  206. int32_t LSM6DSO_ACC_SetOutputDataRate_With_Mode(LSM6DSO_Object_t *pObj, float_t Odr, LSM6DSO_ACC_Operating_Mode_t Mode);
  207. int32_t LSM6DSO_ACC_GetFullScale(LSM6DSO_Object_t *pObj, int32_t *FullScale);
  208. int32_t LSM6DSO_ACC_SetFullScale(LSM6DSO_Object_t *pObj, int32_t FullScale);
  209. int32_t LSM6DSO_ACC_GetAxesRaw(LSM6DSO_Object_t *pObj, LSM6DSO_AxesRaw_t *Value);
  210. int32_t LSM6DSO_ACC_GetAxes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *Acceleration);
  211. int32_t LSM6DSO_GYRO_Enable(LSM6DSO_Object_t *pObj);
  212. int32_t LSM6DSO_GYRO_Disable(LSM6DSO_Object_t *pObj);
  213. int32_t LSM6DSO_GYRO_GetSensitivity(LSM6DSO_Object_t *pObj, float_t *Sensitivity);
  214. int32_t LSM6DSO_GYRO_GetOutputDataRate(LSM6DSO_Object_t *pObj, float_t *Odr);
  215. int32_t LSM6DSO_GYRO_SetOutputDataRate(LSM6DSO_Object_t *pObj, float_t Odr);
  216. int32_t LSM6DSO_GYRO_SetOutputDataRate_With_Mode(LSM6DSO_Object_t *pObj, float_t Odr,
  217. LSM6DSO_GYRO_Operating_Mode_t Mode);
  218. int32_t LSM6DSO_GYRO_GetFullScale(LSM6DSO_Object_t *pObj, int32_t *FullScale);
  219. int32_t LSM6DSO_GYRO_SetFullScale(LSM6DSO_Object_t *pObj, int32_t FullScale);
  220. int32_t LSM6DSO_GYRO_GetAxesRaw(LSM6DSO_Object_t *pObj, LSM6DSO_AxesRaw_t *Value);
  221. int32_t LSM6DSO_GYRO_GetAxes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *AngularRate);
  222. int32_t LSM6DSO_Read_Reg(LSM6DSO_Object_t *pObj, uint8_t reg, uint8_t *Data);
  223. int32_t LSM6DSO_Write_Reg(LSM6DSO_Object_t *pObj, uint8_t reg, uint8_t Data);
  224. int32_t LSM6DSO_Set_Interrupt_Latch(LSM6DSO_Object_t *pObj, uint8_t Status);
  225. int32_t LSM6DSO_ACC_Enable_Free_Fall_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
  226. int32_t LSM6DSO_ACC_Disable_Free_Fall_Detection(LSM6DSO_Object_t *pObj);
  227. int32_t LSM6DSO_ACC_Set_Free_Fall_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
  228. int32_t LSM6DSO_ACC_Set_Free_Fall_Duration(LSM6DSO_Object_t *pObj, uint8_t Duration);
  229. int32_t LSM6DSO_ACC_Enable_Pedometer(LSM6DSO_Object_t *pObj);
  230. int32_t LSM6DSO_ACC_Disable_Pedometer(LSM6DSO_Object_t *pObj);
  231. int32_t LSM6DSO_ACC_Get_Step_Count(LSM6DSO_Object_t *pObj, uint16_t *StepCount);
  232. int32_t LSM6DSO_ACC_Step_Counter_Reset(LSM6DSO_Object_t *pObj);
  233. int32_t LSM6DSO_ACC_Enable_Tilt_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
  234. int32_t LSM6DSO_ACC_Disable_Tilt_Detection(LSM6DSO_Object_t *pObj);
  235. int32_t LSM6DSO_ACC_Enable_Wake_Up_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
  236. int32_t LSM6DSO_ACC_Disable_Wake_Up_Detection(LSM6DSO_Object_t *pObj);
  237. int32_t LSM6DSO_ACC_Set_Wake_Up_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
  238. int32_t LSM6DSO_ACC_Set_Wake_Up_Duration(LSM6DSO_Object_t *pObj, uint8_t Duration);
  239. int32_t LSM6DSO_ACC_Enable_Single_Tap_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
  240. int32_t LSM6DSO_ACC_Disable_Single_Tap_Detection(LSM6DSO_Object_t *pObj);
  241. int32_t LSM6DSO_ACC_Enable_Double_Tap_Detection(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
  242. int32_t LSM6DSO_ACC_Disable_Double_Tap_Detection(LSM6DSO_Object_t *pObj);
  243. int32_t LSM6DSO_ACC_Set_Tap_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
  244. int32_t LSM6DSO_ACC_Set_Tap_Shock_Time(LSM6DSO_Object_t *pObj, uint8_t Time);
  245. int32_t LSM6DSO_ACC_Set_Tap_Quiet_Time(LSM6DSO_Object_t *pObj, uint8_t Time);
  246. int32_t LSM6DSO_ACC_Set_Tap_Duration_Time(LSM6DSO_Object_t *pObj, uint8_t Time);
  247. int32_t LSM6DSO_ACC_Enable_6D_Orientation(LSM6DSO_Object_t *pObj, LSM6DSO_SensorIntPin_t IntPin);
  248. int32_t LSM6DSO_ACC_Disable_6D_Orientation(LSM6DSO_Object_t *pObj);
  249. int32_t LSM6DSO_ACC_Set_6D_Orientation_Threshold(LSM6DSO_Object_t *pObj, uint8_t Threshold);
  250. int32_t LSM6DSO_ACC_Get_6D_Orientation_XL(LSM6DSO_Object_t *pObj, uint8_t *XLow);
  251. int32_t LSM6DSO_ACC_Get_6D_Orientation_XH(LSM6DSO_Object_t *pObj, uint8_t *XHigh);
  252. int32_t LSM6DSO_ACC_Get_6D_Orientation_YL(LSM6DSO_Object_t *pObj, uint8_t *YLow);
  253. int32_t LSM6DSO_ACC_Get_6D_Orientation_YH(LSM6DSO_Object_t *pObj, uint8_t *YHigh);
  254. int32_t LSM6DSO_ACC_Get_6D_Orientation_ZL(LSM6DSO_Object_t *pObj, uint8_t *ZLow);
  255. int32_t LSM6DSO_ACC_Get_6D_Orientation_ZH(LSM6DSO_Object_t *pObj, uint8_t *ZHigh);
  256. int32_t LSM6DSO_ACC_Get_DRDY_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
  257. int32_t LSM6DSO_ACC_Get_Event_Status(LSM6DSO_Object_t *pObj, LSM6DSO_Event_Status_t *Status);
  258. int32_t LSM6DSO_ACC_Set_SelfTest(LSM6DSO_Object_t *pObj, uint8_t Status);
  259. int32_t LSM6DSO_GYRO_Get_DRDY_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
  260. int32_t LSM6DSO_GYRO_Set_SelfTest(LSM6DSO_Object_t *pObj, uint8_t Status);
  261. int32_t LSM6DSO_FIFO_Get_Num_Samples(LSM6DSO_Object_t *pObj, uint16_t *NumSamples);
  262. int32_t LSM6DSO_FIFO_Get_Full_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
  263. int32_t LSM6DSO_FIFO_Set_INT1_FIFO_Full(LSM6DSO_Object_t *pObj, uint8_t Status);
  264. int32_t LSM6DSO_FIFO_Set_Watermark_Level(LSM6DSO_Object_t *pObj, uint16_t Watermark);
  265. int32_t LSM6DSO_FIFO_Set_Stop_On_Fth(LSM6DSO_Object_t *pObj, uint8_t Status);
  266. int32_t LSM6DSO_FIFO_Set_Mode(LSM6DSO_Object_t *pObj, uint8_t Mode);
  267. int32_t LSM6DSO_FIFO_Get_Tag(LSM6DSO_Object_t *pObj, uint8_t *Tag);
  268. int32_t LSM6DSO_FIFO_Get_Data(LSM6DSO_Object_t *pObj, uint8_t *Data);
  269. int32_t LSM6DSO_FIFO_Get_Empty_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
  270. int32_t LSM6DSO_FIFO_Get_Overrun_Status(LSM6DSO_Object_t *pObj, uint8_t *Status);
  271. int32_t LSM6DSO_FIFO_ACC_Get_Axes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *Acceleration);
  272. int32_t LSM6DSO_FIFO_ACC_Set_BDR(LSM6DSO_Object_t *pObj, float_t Bdr);
  273. int32_t LSM6DSO_FIFO_GYRO_Get_Axes(LSM6DSO_Object_t *pObj, LSM6DSO_Axes_t *AngularVelocity);
  274. int32_t LSM6DSO_FIFO_GYRO_Set_BDR(LSM6DSO_Object_t *pObj, float_t Bdr);
  275. int32_t LSM6DSO_ACC_Enable_DRDY_On_INT1(LSM6DSO_Object_t *pObj);
  276. int32_t LSM6DSO_ACC_Disable_DRDY_On_INT1(LSM6DSO_Object_t *pObj);
  277. int32_t LSM6DSO_ACC_Set_Power_Mode(LSM6DSO_Object_t *pObj, uint8_t PowerMode);
  278. int32_t LSM6DSO_ACC_Set_Filter_Mode(LSM6DSO_Object_t *pObj, uint8_t LowHighPassFlag, uint8_t FilterMode);
  279. int32_t LSM6DSO_ACC_Enable_Inactivity_Detection(LSM6DSO_Object_t *pObj, lsm6dso_inact_en_t InactMode,
  280. LSM6DSO_SensorIntPin_t IntPin);
  281. int32_t LSM6DSO_ACC_Disable_Inactivity_Detection(LSM6DSO_Object_t *pObj);
  282. int32_t LSM6DSO_ACC_Set_Sleep_Duration(LSM6DSO_Object_t *pObj, uint8_t Duration);
  283. int32_t LSM6DSO_GYRO_Enable_DRDY_On_INT2(LSM6DSO_Object_t *pObj);
  284. int32_t LSM6DSO_GYRO_Set_Power_Mode(LSM6DSO_Object_t *pObj, uint8_t PowerMode);
  285. int32_t LSM6DSO_GYRO_Set_Filter_Mode(LSM6DSO_Object_t *pObj, uint8_t LowHighPassFlag, uint8_t FilterMode);
  286. int32_t LSM6DSO_DRDY_Set_Mode(LSM6DSO_Object_t *pObj, uint8_t Mode);
  287. /**
  288. * @}
  289. */
  290. /** @addtogroup LSM6DSO_Exported_Variables LSM6DSO Exported Variables
  291. * @{
  292. */
  293. extern LSM6DSO_CommonDrv_t LSM6DSO_COMMON_Driver;
  294. extern LSM6DSO_ACC_Drv_t LSM6DSO_ACC_Driver;
  295. extern LSM6DSO_GYRO_Drv_t LSM6DSO_GYRO_Driver;
  296. /**
  297. * @}
  298. */
  299. #ifdef __cplusplus
  300. }
  301. #endif
  302. #endif
  303. /**
  304. * @}
  305. */
  306. /**
  307. * @}
  308. */
  309. /**
  310. * @}
  311. */