ChibiOS  0.0.0
lsm6dsl.h
Go to the documentation of this file.
1 /*
2  ChibiOS - Copyright (C) 2016..2018 Rocco Marco Guglielmi
3 
4  This file is part of ChibiOS.
5 
6  ChibiOS is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 3 of the License, or
9  (at your option) any later version.
10 
11  ChibiOS is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 
19 */
20 
21 /**
22  * @file lsm6dsl.h
23  * @brief LSM6DSL MEMS interface module header.
24  *
25  * @addtogroup LSM6DSL
26  * @ingroup EX_ST
27  * @{
28  */
29 #ifndef _LSM6DSL_H_
30 #define _LSM6DSL_H_
31 
32 #include "hal_accelerometer.h"
33 #include "hal_gyroscope.h"
34 
35 /*===========================================================================*/
36 /* Driver constants. */
37 /*===========================================================================*/
38 
39 /**
40  * @name Version identification
41  * @{
42  */
43 /**
44  * @brief LSM6DSL driver version string.
45  */
46 #define EX_LSM6DSL_VERSION "1.0.0"
47 
48 /**
49  * @brief LSM6DSL driver version major number.
50  */
51 #define EX_LSM6DSL_MAJOR 1
52 
53 /**
54  * @brief LSM6DSL driver version minor number.
55  */
56 #define EX_LSM6DSL_MINOR 0
57 
58 /**
59  * @brief LSM6DSL driver version patch number.
60  */
61 #define EX_LSM6DSL_PATCH 0
62 /** @} */
63 
64 /**
65  * @brief LSM6DSL accelerometer subsystem characteristics.
66  * @note Sensitivity is expressed as milli-G/LSB whereas
67  * 1 milli-G = 0.00980665 m/s^2.
68  * @note Bias is expressed as milli-G.
69  *
70  * @{
71  */
72 #define LSM6DSL_ACC_NUMBER_OF_AXES 3U
73 
74 #define LSM6DSL_ACC_2G 2.0f
75 #define LSM6DSL_ACC_4G 4.0f
76 #define LSM6DSL_ACC_8G 8.0f
77 #define LSM6DSL_ACC_16G 16.0f
78 
79 #define LSM6DSL_ACC_SENS_2G 0.061f
80 #define LSM6DSL_ACC_SENS_4G 0.122f
81 #define LSM6DSL_ACC_SENS_8G 0.244f
82 #define LSM6DSL_ACC_SENS_16G 0.488f
83 
84 #define LSM6DSL_ACC_BIAS 0.0f
85 /** @} */
86 
87 /**
88  * @brief L3GD20 gyroscope system characteristics.
89  * @note Sensitivity is expressed as DPS/LSB whereas DPS stand for Degree
90  * per second [°/s].
91  * @note Bias is expressed as DPS.
92  *
93  * @{
94  */
95 #define LSM6DSL_GYRO_NUMBER_OF_AXES 3U
96 
97 #define LSM6DSL_GYRO_125DPS 125.0f
98 #define LSM6DSL_GYRO_250DPS 250.0f
99 #define LSM6DSL_GYRO_500DPS 500.0f
100 #define LSM6DSL_GYRO_1000DPS 1000.0f
101 #define LSM6DSL_GYRO_2000DPS 2000.0f
102 
103 #define LSM6DSL_GYRO_SENS_125DPS 0.004375f
104 #define LSM6DSL_GYRO_SENS_250DPS 0.008750f
105 #define LSM6DSL_GYRO_SENS_500DPS 0.017500f
106 #define LSM6DSL_GYRO_SENS_1000DPS 0.035000f
107 #define LSM6DSL_GYRO_SENS_2000DPS 0.070000f
108 
109 #define LSM6DSL_GYRO_BIAS 0.0f
110 /** @} */
111 
112 /**
113  * @name LSM6DSL communication interfaces related bit masks
114  * @{
115  */
116 #define LSM6DSL_DI_MASK 0xFF
117 #define LSM6DSL_DI(n) (1 << n)
118 #define LSM6DSL_AD_MASK 0x7F
119 #define LSM6DSL_AD(n) (1 << n)
120 #define LSM6DSL_MS (1 << 7)
121 /** @} */
122 
123 /**
124  * @name LSM6DSL register addresses
125  * @{
126  */
127 #define LSM6DSL_AD_FUNC_CFG_ACCESS 0x01
128 #define LSM6DSL_AD_SENSOR_SYNC_TIME_FRAME 0x04
129 #define LSM6DSL_AD_SENSOR_SYNC_RES_RATIO 0x05
130 #define LSM6DSL_AD_FIFO_CTRL1 0x06
131 #define LSM6DSL_AD_FIFO_CTRL2 0x07
132 #define LSM6DSL_AD_FIFO_CTRL3 0x08
133 #define LSM6DSL_AD_FIFO_CTRL4 0x09
134 #define LSM6DSL_AD_FIFO_CTRL5 0x0A
135 #define LSM6DSL_AD_DRDY_PULSE_CFG_G 0x0B
136 #define LSM6DSL_AD_INT1_CTRL 0x0D
137 #define LSM6DSL_AD_INT2_CTRL 0x0E
138 #define LSM6DSL_AD_WHO_AM_I 0x0F
139 #define LSM6DSL_AD_CTRL1_XL 0x10
140 #define LSM6DSL_AD_CTRL2_G 0x11
141 #define LSM6DSL_AD_CTRL3_C 0x12
142 #define LSM6DSL_AD_CTRL4_C 0x13
143 #define LSM6DSL_AD_CTRL5_C 0x14
144 #define LSM6DSL_AD_CTRL6_C 0x15
145 #define LSM6DSL_AD_CTRL7_G 0x16
146 #define LSM6DSL_AD_CTRL8_XL 0x17
147 #define LSM6DSL_AD_CTRL9_XL 0x18
148 #define LSM6DSL_AD_CTRL10_C 0x19
149 #define LSM6DSL_AD_MASTER_CONFIG 0x1A
150 #define LSM6DSL_AD_WAKE_UP_SRC 0x1B
151 #define LSM6DSL_AD_TAP_SRC 0x1C
152 #define LSM6DSL_AD_D6D_SRC 0x1D
153 #define LSM6DSL_AD_STATUS_REG 0x1E
154 #define LSM6DSL_AD_OUT_TEMP_L 0x20
155 #define LSM6DSL_AD_OUT_TEMP_H 0x21
156 #define LSM6DSL_AD_OUTX_L_G 0x22
157 #define LSM6DSL_AD_OUTX_H_G 0x23
158 #define LSM6DSL_AD_OUTY_L_G 0x24
159 #define LSM6DSL_AD_OUTY_H_G 0x25
160 #define LSM6DSL_AD_OUTZ_L_G 0x26
161 #define LSM6DSL_AD_OUTZ_H_G 0x27
162 #define LSM6DSL_AD_OUTX_L_XL 0x28
163 #define LSM6DSL_AD_OUTX_H_XL 0x29
164 #define LSM6DSL_AD_OUTY_L_XL 0x2A
165 #define LSM6DSL_AD_OUTY_H_XL 0x2B
166 #define LSM6DSL_AD_OUTZ_L_XL 0x2C
167 #define LSM6DSL_AD_OUTZ_H_XL 0x2D
168 #define LSM6DSL_AD_SENSORHUB1_REG 0x2E
169 #define LSM6DSL_AD_SENSORHUB2_REG 0x2F
170 #define LSM6DSL_AD_SENSORHUB3_REG 0x30
171 #define LSM6DSL_AD_SENSORHUB4_REG 0x31
172 #define LSM6DSL_AD_SENSORHUB5_REG 0x32
173 #define LSM6DSL_AD_SENSORHUB6_REG 0x33
174 #define LSM6DSL_AD_SENSORHUB7_REG 0x34
175 #define LSM6DSL_AD_SENSORHUB8_REG 0x35
176 #define LSM6DSL_AD_SENSORHUB9_REG 0x36
177 #define LSM6DSL_AD_SENSORHUB10_REG 0x37
178 #define LSM6DSL_AD_SENSORHUB11_REG 0x38
179 #define LSM6DSL_AD_SENSORHUB12_REG 0x39
180 #define LSM6DSL_AD_FIFO_STATUS1 0x3A
181 #define LSM6DSL_AD_FIFO_STATUS2 0x3B
182 #define LSM6DSL_AD_FIFO_STATUS3 0x3C
183 #define LSM6DSL_AD_FIFO_STATUS4 0x3D
184 #define LSM6DSL_AD_FIFO_DATA_OUT_L 0x3E
185 #define LSM6DSL_AD_FIFO_DATA_OUT_H 0x3F
186 #define LSM6DSL_AD_TIMESTAMP0_REG 0x40
187 #define LSM6DSL_AD_TIMESTAMP1_REG 0x41
188 #define LSM6DSL_AD_TIMESTAMP2_REG 0x42
189 #define LSM6DSL_AD_STEP_TIMESTAMP_L 0x49
190 #define LSM6DSL_AD_STEP_TIMESTAMP_H 0x4A
191 #define LSM6DSL_AD_STEP_COUNTER_L 0x4B
192 #define LSM6DSL_AD_STEP_COUNTER_H 0x4C
193 #define LSM6DSL_AD_SENSORHUB13_REG 0x4D
194 #define LSM6DSL_AD_SENSORHUB14_REG 0x4E
195 #define LSM6DSL_AD_SENSORHUB15_REG 0x4F
196 #define LSM6DSL_AD_SENSORHUB16_REG 0x50
197 #define LSM6DSL_AD_SENSORHUB17_REG 0x51
198 #define LSM6DSL_AD_SENSORHUB18_REG 0x52
199 #define LSM6DSL_AD_FUNC_SRC1 0x53
200 #define LSM6DSL_AD_FUNC_SRC2 0x54
201 #define LSM6DSL_AD_WRIST_TILT_IA 0x55
202 #define LSM6DSL_AD_TAP_CFG 0x58
203 #define LSM6DSL_AD_TAP_THS_6D 0x59
204 #define LSM6DSL_AD_INT_DUR2 0x5A
205 #define LSM6DSL_AD_WAKE_UP_THS 0x5B
206 #define LSM6DSL_AD_WAKE_UP_DUR 0x5C
207 #define LSM6DSL_AD_FREE_FALL 0x5D
208 #define LSM6DSL_AD_MD1_CFG 0x5E
209 #define LSM6DSL_AD_MD2_CFG 0x5F
210 #define LSM6DSL_AD_MASTER_CMD_CODE 0x60
211 #define LSM6DSL_AD_SENS_SYNC_SPI_ERROR_CODE 0x61
212 #define LSM6DSL_AD_OUT_MAG_RAW_X_L 0x66
213 #define LSM6DSL_AD_OUT_MAG_RAW_X_H 0x67
214 #define LSM6DSL_AD_OUT_MAG_RAW_Y_L 0x68
215 #define LSM6DSL_AD_OUT_MAG_RAW_Y_H 0x69
216 #define LSM6DSL_AD_OUT_MAG_RAW_Z_L 0x6A
217 #define LSM6DSL_AD_OUT_MAG_RAW_Z_H 0x6B
218 #define LSM6DSL_AD_X_OFS_USR 0x73
219 #define LSM6DSL_AD_Y_OFS_USR 0x74
220 #define LSM6DSL_AD_Z_OFS_USR 0x75
221 /** @} */
222 
223 /**
224  * @name LSM6DSL_AD_CTRL1_XL register bits definitions
225  * @{
226  */
227 #define LSMDSL_CTRL1_XL_BW0_XL (1 << 0)
228 #define LSMDSL_CTRL1_XL_LPF1_BW_SEL (1 << 1)
229 #define LSMDSL_CTRL1_XL_FS_MASK 0x0C
230 #define LSMDSL_CTRL1_XL_FS_XL0 (1 << 2)
231 #define LSMDSL_CTRL1_XL_FS_XL1 (1 << 3)
232 #define LSMDSL_CTRL1_XL_ODR_XL0 (1 << 4)
233 #define LSMDSL_CTRL1_XL_ODR_XL1 (1 << 5)
234 #define LSMDSL_CTRL1_XL_ODR_XL2 (1 << 6)
235 #define LSMDSL_CTRL1_XL_ODR_XL3 (1 << 7)
236 /** @} */
237 
238 /**
239  * @name LSM6DSL_AD_CTRL2_G register bits definitions
240  * @{
241  */
242 #define LSMDSL_CTRL2_G_FS_MASK 0x0E
243 #define LSMDSL_CTRL2_G_FS_125 (1 << 1)
244 #define LSMDSL_CTRL2_G_FS_G0 (1 << 2)
245 #define LSMDSL_CTRL2_G_FS_G1 (1 << 3)
246 #define LSMDSL_CTRL2_G_ODR_G0 (1 << 4)
247 #define LSMDSL_CTRL2_G_ODR_G1 (1 << 5)
248 #define LSMDSL_CTRL2_G_ODR_G2 (1 << 6)
249 #define LSMDSL_CTRL2_G_ODR_G3 (1 << 7)
250 /** @} */
251 
252 /**
253  * @name LSM6DSL_AD_CTRL3_C register bits definitions
254  * @{
255  */
256 #define LSMDSL_CTRL3_C_SW_RESET (1 << 0)
257 #define LSMDSL_CTRL3_C_BLE (1 << 1)
258 #define LSMDSL_CTRL3_C_IF_INC (1 << 2)
259 #define LSMDSL_CTRL3_C_SIM (1 << 3)
260 #define LSMDSL_CTRL3_C_PP_OD (1 << 4)
261 #define LSMDSL_CTRL3_C_H_LACTIVE (1 << 5)
262 #define LSMDSL_CTRL3_C_BDU (1 << 6)
263 #define LSMDSL_CTRL3_C_BOOT (1 << 7)
264 /** @} */
265 
266 /**
267  * @name LSM6DSL_AD_CTRL4_C register bits definitions
268  * @{
269  */
270 #define LSMDSL_CTRL4_C_NOT_USED_01 (1 << 0)
271 #define LSMDSL_CTRL4_C_LPF1_SEL_G (1 << 1)
272 #define LSMDSL_CTRL4_C_I2C_DISABLE (1 << 2)
273 #define LSMDSL_CTRL4_C_DRDY_MASK (1 << 3)
274 #define LSMDSL_CTRL4_C_DEN_DRDY_IN (1 << 4)
275 #define LSMDSL_CTRL4_C_INT2_ON_INT (1 << 5)
276 #define LSMDSL_CTRL4_C_SLEEP (1 << 6)
277 #define LSMDSL_CTRL4_C_DEN_XL_EN (1 << 7)
278 /** @} */
279 
280 /**
281  * @name LSM6DSL_AD_CTRL5_C register bits definitions
282  * @{
283  */
284 #define LSMDSL_CTRL5_C_ST0_XL (1 << 0)
285 #define LSMDSL_CTRL5_C_ST1_XL (1 << 1)
286 #define LSMDSL_CTRL5_C_ST0_G (1 << 2)
287 #define LSMDSL_CTRL5_C_ST1_G (1 << 3)
288 #define LSMDSL_CTRL5_C_DEN_LH (1 << 4)
289 #define LSMDSL_CTRL5_C_ROUNDING0 (1 << 5)
290 #define LSMDSL_CTRL5_C_ROUNDING1 (1 << 6)
291 #define LSMDSL_CTRL5_C_ROUNDING2 (1 << 7)
292 /** @} */
293 
294 /**
295  * @name LSM6DSL_AD_CTRL6_C register bits definitions
296  * @{
297  */
298 #define LSMDSL_CTRL6_C_FTYPE_0 (1 << 0)
299 #define LSMDSL_CTRL6_C_FTYPE_1 (1 << 1)
300 #define LSMDSL_CTRL6_C_USR_OFF_W (1 << 3)
301 #define LSMDSL_CTRL6_C_XL_HM_MODE (1 << 4)
302 #define LSMDSL_CTRL6_C_LVL2_EN (1 << 5)
303 #define LSMDSL_CTRL6_C_LVL_EN (1 << 6)
304 #define LSMDSL_CTRL6_C_TRIG_EN (1 << 7)
305 /** @} */
306 
307 /**
308  * @name LSM6DSL_AD_CTRL7_G register bits definitions
309  * @{
310  */
311 #define LSMDSL_CTRL7_G_ROUNDING_ST (1 << 2)
312 #define LSMDSL_CTRL7_G_HPM0_G (1 << 4)
313 #define LSMDSL_CTRL7_G_HPM1_G (1 << 5)
314 #define LSMDSL_CTRL7_G_HP_EN_G (1 << 6)
315 #define LSMDSL_CTRL7_G_G_HM_MODE (1 << 7)
316 /** @} */
317 
318 /**
319  * @name LSM6DSL_AD_CTRL8_XL register bits definitions
320  * @{
321  */
322 #define LSMDSL_CTRL8_XL_LOW_PASS_ON (1 << 0)
323 #define LSMDSL_CTRL8_XL_HP_SLOPE_XL (1 << 2)
324 #define LSMDSL_CTRL8_XL_INPUT_COMPO (1 << 3)
325 #define LSMDSL_CTRL8_XL_HP_REF_MODE (1 << 4)
326 #define LSMDSL_CTRL8_XL_HPCF_XL0 (1 << 5)
327 #define LSMDSL_CTRL8_XL_HPCF_XL1 (1 << 6)
328 #define LSMDSL_CTRL8_XL_LPF2_XL_EN (1 << 7)
329 /** @} */
330 
331 /**
332  * @name LSM6DSL_AD_CTRL9_XL register bits definitions
333  * @{
334  */
335 #define LSMDSL_CTRL9_XL_SOFT_EN (1 << 2)
336 #define LSMDSL_CTRL9_XL_DEN_XL_G (1 << 4)
337 #define LSMDSL_CTRL9_XL_DEN_Z (1 << 5)
338 #define LSMDSL_CTRL9_XL_DEN_Y (1 << 6)
339 #define LSMDSL_CTRL9_XL_DEN_X (1 << 7)
340 /** @} */
341 
342 /**
343  * @name LSM6DSL_AD_CTRL10_C register bits definitions
344  * @{
345  */
346 #define LSMDSL_CTRL10_C_SIGN_MOTION (1 << 0)
347 #define LSMDSL_CTRL10_C_PEDO_RST_ST (1 << 1)
348 #define LSMDSL_CTRL10_C_FUNC_EN (1 << 2)
349 #define LSMDSL_CTRL10_C_TILT_EN (1 << 3)
350 #define LSMDSL_CTRL10_C_PEDO_EN (1 << 4)
351 #define LSMDSL_CTRL10_C_TIMER_EN (1 << 5)
352 #define LSMDSL_CTRL10_C_WRIST_TILT (1 << 7)
353 /** @} */
354 
355 /*===========================================================================*/
356 /* Driver pre-compile time settings. */
357 /*===========================================================================*/
358 
359 /**
360  * @name Configuration options
361  * @{
362  */
363 /**
364  * @brief LSM6DSL SPI interface switch.
365  * @details If set to @p TRUE the support for SPI is included.
366  * @note The default is @p FALSE.
367  */
368 #if !defined(LSM6DSL_USE_SPI) || defined(__DOXYGEN__)
369 #define LSM6DSL_USE_SPI FALSE
370 #endif
371 
372 /**
373  * @brief LSM6DSL shared SPI switch.
374  * @details If set to @p TRUE the device acquires SPI bus ownership
375  * on each transaction.
376  * @note The default is @p FALSE. Requires SPI_USE_MUTUAL_EXCLUSION.
377  */
378 #if !defined(LSM6DSL_SHARED_SPI) || defined(__DOXYGEN__)
379 #define LSM6DSL_SHARED_SPI FALSE
380 #endif
381 
382 /**
383  * @brief LSM6DSL I2C interface switch.
384  * @details If set to @p TRUE the support for I2C is included.
385  * @note The default is @p TRUE.
386  */
387 #if !defined(LSM6DSL_USE_I2C) || defined(__DOXYGEN__)
388 #define LSM6DSL_USE_I2C TRUE
389 #endif
390 
391 /**
392  * @brief LSM6DSL shared I2C switch.
393  * @details If set to @p TRUE the device acquires I2C bus ownership
394  * on each transaction.
395  * @note The default is @p FALSE. Requires I2C_USE_MUTUAL_EXCLUSION.
396  */
397 #if !defined(LSM6DSL_SHARED_I2C) || defined(__DOXYGEN__)
398 #define LSM6DSL_SHARED_I2C FALSE
399 #endif
400 
401 /**
402  * @brief LSM6DSL advanced configurations switch.
403  * @details If set to @p TRUE more configurations are available.
404  * @note The default is @p FALSE.
405  */
406 #if !defined(LSM6DSL_USE_ADVANCED) || defined(__DOXYGEN__)
407 #define LSM6DSL_USE_ADVANCED FALSE
408 #endif
409 
410 /**
411  * @brief LSM6DSL accelerometer subsystem advanced configurations
412  * switch.
413  * @details If set to @p TRUE more configurations are available.
414  * @note The default is @p FALSE.
415  */
416 #if !defined(LSM6DSL_ACC_USE_ADVANCED) || defined(__DOXYGEN__)
417 #define LSM6DSL_ACC_USE_ADVANCED FALSE
418 #endif
419 
420 /**
421  * @brief LSM6DSL gyroscope subsystem advanced configurations
422  * switch.
423  * @details If set to @p TRUE more configurations are available.
424  * @note The default is @p FALSE.
425  */
426 #if !defined(LSM6DSL_GYRO_USE_ADVANCED) || defined(__DOXYGEN__)
427 #define LSM6DSL_GYRO_USE_ADVANCED FALSE
428 #endif
429 
430 /**
431  * @brief Number of acquisitions for gyroscope bias removal.
432  * @details This is the number of acquisitions performed to compute the
433  * bias. A repetition is required in order to remove noise.
434  */
435 #if !defined(LSM6DSL_GYRO_BIAS_ACQ_TIMES) || defined(__DOXYGEN__)
436 #define LSM6DSL_GYRO_BIAS_ACQ_TIMES 50
437 #endif
438 
439 /**
440  * @brief Settling time for gyroscope bias removal.
441  * @details This is the time between each bias acquisition.
442  */
443 #if !defined(LSM6DSL_GYRO_BIAS_SETTLING_US) || defined(__DOXYGEN__)
444 #define LSM6DSL_GYRO_BIAS_SETTLING_US 5000
445 #endif
446 /** @} */
447 
448 /*===========================================================================*/
449 /* Derived constants and error checks. */
450 /*===========================================================================*/
451 
452 #if !(LSM6DSL_USE_SPI ^ LSM6DSL_USE_I2C)
453 #error "LSM6DSL_USE_SPI and LSM6DSL_USE_I2C cannot be both true or both false"
454 #endif
455 
456 #if LSM6DSL_USE_SPI && !HAL_USE_SPI
457 #error "LSM6DSL_USE_SPI requires HAL_USE_SPI"
458 #endif
459 
460 #if LSM6DSL_SHARED_SPI && !SPI_USE_MUTUAL_EXCLUSION
461 #error "LSM6DSL_SHARED_SPI requires SPI_USE_MUTUAL_EXCLUSION"
462 #endif
463 
464 #if LSM6DSL_USE_I2C && !HAL_USE_I2C
465 #error "LSM6DSL_USE_I2C requires HAL_USE_I2C"
466 #endif
467 
468 #if LSM6DSL_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION
469 #error "LSM6DSL_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION"
470 #endif
471 
472 /**
473  * @todo Add support for LSM6DSL over SPI.
474  */
475 #if LSM6DSL_USE_SPI
476 #error "LSM6DSL over SPI still not supported"
477 #endif
478 
479 /*===========================================================================*/
480 /* Driver data structures and types. */
481 /*===========================================================================*/
482 
483 /**
484  * @name LSM6DSL data structures and types.
485  * @{
486  */
487 /**
488  * @brief Structure representing a LSM6DSL driver.
489  */
491 
492 /**
493  * @brief Accelerometer and Gyroscope Slave Address.
494  */
495 typedef enum {
496  LSM6DSL_SAD_GND = 0x6A, /**< SAD pin connected to GND. */
497  LSM6DSL_SAD_VCC = 0x6B /**< SAD pin connected to VCC. */
498 } lsm6dsl_sad_t;
499 
500 /**
501  * @brief LSM6DSL accelerometer subsystem full scale.
502  */
503 typedef enum {
504  LSM6DSL_ACC_FS_2G = 0x00, /**< Full scale ±2g. */
505  LSM6DSL_ACC_FS_4G = 0x40, /**< Full scale ±4g. */
506  LSM6DSL_ACC_FS_8G = 0x80, /**< Full scale ±8g. */
507  LSM6DSL_ACC_FS_16G = 0xC0 /**< Full scale ±16g. */
509 
510 /**
511  * @brief LSM6DSL accelerometer subsystem output data rate.
512  */
513 typedef enum {
514  LSM6DSL_ACC_ODR_PD = 0x00, /**< Power down */
515  LSM6DSL_ACC_ODR_1P6Hz = 0xB0, /**< ODR 1.6 Hz (Low Power only) */
516  LSM6DSL_ACC_ODR_12P5Hz = 0x10, /**< ODR 12.5 Hz */
517  LSM6DSL_ACC_ODR_26Hz = 0x20, /**< ODR 26 Hz */
518  LSM6DSL_ACC_ODR_52Hz = 0x30, /**< ODR 52 Hz */
519  LSM6DSL_ACC_ODR_104Hz = 0x40, /**< ODR 104 Hz */
520  LSM6DSL_ACC_ODR_208Hz = 0x50, /**< ODR 208 Hz */
521  LSM6DSL_ACC_ODR_416Hz = 0x60, /**< ODR 416 Hz */
522  LSM6DSL_ACC_ODR_833Hz = 0x70, /**< ODR 833 Hz */
523  LSM6DSL_ACC_ODR_1P66Hz = 0x80, /**< ODR 1.66 kHz */
524  LSM6DSL_ACC_ODR_3P33Hz = 0x90, /**< ODR 3.33 kHz */
525  LSM6DSL_ACC_ODR_6P66Hz = 0xA0 /**< ODR 6.66 kHz */
527 
528 /**
529  * @brief LSM6DSL accelerometer subsystem output data rate.
530  */
531 typedef enum {
532  LSM6DSL_ACC_LP_DISABLED = 0x00, /**< Low power disabled */
533  LSM6DSL_ACC_LP_ENABLED = 0x10 /**< Low power enabled */
535 
536 /**
537  * @brief LSM6DSL gyroscope subsystem full scale.
538  */
539 typedef enum {
540  LSM6DSL_GYRO_FS_125DPS = 0x02, /**< Full scale ±125 degree per second */
541  LSM6DSL_GYRO_FS_250DPS = 0x00, /**< Full scale ±250 degree per second */
542  LSM6DSL_GYRO_FS_500DPS = 0x04, /**< Full scale ±500 degree per second */
543  LSM6DSL_GYRO_FS_1000DPS = 0x08, /**< Full scale ±1000 degree per second */
544  LSM6DSL_GYRO_FS_2000DPS = 0x0C /**< Full scale ±2000 degree per second */
546 
547 /**
548  * @brief LSM6DSL gyroscope subsystem output data rate.
549  */
550 typedef enum {
551  LSM6DSL_GYRO_ODR_PD = 0x00, /**< Power down */
552  LSM6DSL_GYRO_ODR_12P5Hz = 0x10, /**< ODR 12.5 Hz */
553  LSM6DSL_GYRO_ODR_26Hz = 0x20, /**< ODR 26 Hz */
554  LSM6DSL_GYRO_ODR_52Hz = 0x30, /**< ODR 52 Hz */
555  LSM6DSL_GYRO_ODR_104Hz = 0x40, /**< ODR 104 Hz */
556  LSM6DSL_GYRO_ODR_208Hz = 0x50, /**< ODR 208 Hz */
557  LSM6DSL_GYRO_ODR_416Hz = 0x60, /**< ODR 416 Hz */
558  LSM6DSL_GYRO_ODR_833Hz = 0x70, /**< ODR 833 Hz */
559  LSM6DSL_GYRO_ODR_1P66Hz = 0x80, /**< ODR 1.66 kHz */
560  LSM6DSL_GYRO_ODR_3P33Hz = 0x90, /**< ODR 3.33 kHz */
561  LSM6DSL_GYRO_ODR_6P66Hz = 0xA0 /**< ODR 6.66 kHz */
563 
564 /**
565  * @brief LSM6DSL gyroscope subsystem low mode configuration.
566  */
567 typedef enum {
568  LSM6DSL_GYRO_LP_DISABLED = 0x00, /**< Low power mode disabled. */
569  LSM6DSL_GYRO_LP_ENABLED = 0x80 /**< Low power mode enabled. */
571 
572 /**
573  * @brief LSM6DSL gyroscope subsystem output selection.
574  */
575 typedef enum {
576  LSM6DSL_GYRO_LPF_DISABLED = -1, /**< Low pass filter disabled. */
577  LSM6DSL_GYRO_LPF_FTYPE0 = 0x00, /**< Refer to table 68 of Datasheet. */
578  LSM6DSL_GYRO_LPF_FTYPE1 = 0x01, /**< Refer to table 68 of Datasheet. */
579  LSM6DSL_GYRO_LPF_FTYPE2 = 0x10, /**< Refer to table 68 of Datasheet. */
580  LSM6DSL_GYRO_LPF_FTYPE3 = 0x11 /**< Refer to table 68 of Datasheet. */
582 
583 /**
584  * @brief LSM6DSL block data update.
585  */
586 typedef enum {
587  LSM6DSL_BDU_CONTINUOUS = 0x00, /**< Block data continuously updated. */
588  LSM6DSL_BDU_BLOCKED = 0x40 /**< Block data updated after reading. */
589 } lsm6dsl_bdu_t;
590 
591 /**
592  * @brief LSM6DSL endianness.
593  */
594 typedef enum {
595  LSM6DSL_END_LITTLE = 0x00, /**< Little endian. */
596  LSM6DSL_END_BIG = 0x20 /**< Big endian. */
597 } lsm6dsl_end_t;
598 
599 /**
600  * @brief Driver state machine possible states.
601  */
602 typedef enum {
603  LSM6DSL_UNINIT = 0, /**< Not initialized. */
604  LSM6DSL_STOP = 1, /**< Stopped. */
605  LSM6DSL_READY = 2, /**< Ready. */
607 
608 /**
609  * @brief LSM6DSL configuration structure.
610  */
611 typedef struct {
612 #if (LSM6DSL_USE_SPI) || defined(__DOXYGEN__)
613  /**
614  * @brief SPI driver associated to this LSM6DSL.
615  */
617  /**
618  * @brief SPI configuration associated to this LSM6DSL accelerometer
619  * subsystem.
620  */
622 #endif /* LSM6DSL_USE_SPI */
623 #if (LSM6DSL_USE_I2C) || defined(__DOXYGEN__)
624  /**
625  * @brief I2C driver associated to this LSM6DSL.
626  */
628  /**
629  * @brief I2C configuration associated to this LSM6DSL accelerometer
630  * subsystem.
631  */
633  /**
634  * @brief LSM6DSL Slave Address
635  */
637 #endif /* LSM6DSL_USE_I2C */
638  /**
639  * @brief LSM6DSL accelerometer subsystem initial sensitivity.
640  */
642  /**
643  * @brief LSM6DSL accelerometer subsystem initial bias.
644  */
645  float *accbias;
646  /**
647  * @brief LSM6DSL accelerometer subsystem full scale.
648  */
650  /**
651  * @brief LSM6DSL accelerometer subsystem output data rate.
652  */
654 #if LSM6DSL_ACC_USE_ADVANCED || defined(__DOXYGEN__)
655  /**
656  * @brief LSM6DSL accelerometer subsystem low power mode.
657  */
659 #endif /* LSM6DSL_ACC_USE_ADVANCED */
660  /**
661  * @brief LSM6DSL gyroscope subsystem initial sensitivity.
662  */
664  /**
665  * @brief LSM6DSL gyroscope subsystem initial bias.
666  */
667  float *gyrobias;
668  /**
669  * @brief LSM6DSL gyroscope subsystem full scale.
670  */
672  /**
673  * @brief LSM6DSL gyroscope subsystem output data rate.
674  */
676 #if LSM6DSL_GYRO_USE_ADVANCED || defined(__DOXYGEN__)
677  /**
678  * @brief LSM6DSL gyroscope subsystem low mode configuration.
679  */
681  /**
682  * @brief LSM6DSL gyroscope subsystem low pass filter configuration.
683  */
685 #endif /* LSM6DSL_GYRO_USE_ADVANCED */
686 #if (LSM6DSL_USE_ADVANCED) || defined(__DOXYGEN__)
687  /**
688  * @brief LSM6DSL block data update
689  */
691  /**
692  * @brief LSM6DSL endianness
693  */
695 #endif /* LSM6DSL_USE_ADVANCED */
696 } LSM6DSLConfig;
697 
698 /**
699  * @brief @p LSM6DSL specific methods.
700  */
701 #define _lsm6dsl_methods_alone \
702  /* Change full scale value of LSM6DSL accelerometer subsystem .*/ \
703  msg_t (*acc_set_full_scale)(LSM6DSLDriver *devp, lsm6dsl_acc_fs_t fs); \
704  /* Change full scale value of LSM6DSL gyroscope subsystem .*/ \
705  msg_t (*gyro_set_full_scale)(LSM6DSLDriver *devp, lsm6dsl_gyro_fs_t fs);
706 
707 /**
708  * @brief @p LSM6DSL specific methods with inherited ones.
709  */
710 #define _lsm6dsl_methods \
711  _base_object_methods \
712  _lsm6dsl_methods_alone
713 
714 /**
715  * @extends BaseObjectVMT
716  *
717  * @brief @p LSM6DSL virtual methods table.
718  */
719 struct LSM6DSLVMT {
721 };
722 
723 /**
724  * @brief @p LSM6DSLDriver specific data.
725  */
726 #define _lsm6dsl_data \
727  _base_sensor_data \
728  /* Driver state.*/ \
729  lsm6dsl_state_t state; \
730  /* Current configuration data.*/ \
731  const LSM6DSLConfig *config; \
732  /* Accelerometer subsystem axes number.*/ \
733  size_t accaxes; \
734  /* Accelerometer subsystem current sensitivity.*/ \
735  float accsensitivity[LSM6DSL_ACC_NUMBER_OF_AXES]; \
736  /* Accelerometer subsystem current bias .*/ \
737  float accbias[LSM6DSL_ACC_NUMBER_OF_AXES]; \
738  /* Accelerometer subsystem current full scale value.*/ \
739  float accfullscale; \
740  /* Gyroscope subsystem axes number.*/ \
741  size_t gyroaxes; \
742  /* Gyroscope subsystem current sensitivity.*/ \
743  float gyrosensitivity[LSM6DSL_GYRO_NUMBER_OF_AXES]; \
744  /* Gyroscope subsystem current Bias.*/ \
745  float gyrobias[LSM6DSL_GYRO_NUMBER_OF_AXES]; \
746  /* Gyroscope subsystem current full scale value.*/ \
747  float gyrofullscale;
748 
749 /**
750  * @brief LSM6DSL 6-axis accelerometer/gyroscope class.
751  */
753  /** @brief Virtual Methods Table.*/
754  const struct LSM6DSLVMT *vmt;
755  /** @brief Base accelerometer interface.*/
757  /** @brief Base gyroscope interface.*/
760 };
761 /** @} */
762 
763 /*===========================================================================*/
764 /* Driver macros. */
765 /*===========================================================================*/
766 
767 /**
768  * @brief Return the number of axes of the BaseAccelerometer.
769  *
770  * @param[in] devp pointer to @p LSM6DSLDriver.
771  *
772  * @return the number of axes.
773  *
774  * @api
775  */
776 #define lsm6dslAccelerometerGetAxesNumber(devp) \
777  accelerometerGetAxesNumber(&((devp)->acc_if))
778 
779 /**
780  * @brief Retrieves raw data from the BaseAccelerometer.
781  * @note This data is retrieved from MEMS register without any algebraical
782  * manipulation.
783  * @note The axes array must be at least the same size of the
784  * BaseAccelerometer axes number.
785  *
786  * @param[in] devp pointer to @p LSM6DSLDriver.
787  * @param[out] axes a buffer which would be filled with raw data.
788  *
789  * @return The operation status.
790  * @retval MSG_OK if the function succeeded.
791  * @retval MSG_RESET if one or more I2C errors occurred, the errors can
792  * be retrieved using @p i2cGetErrors().
793  * @retval MSG_TIMEOUT if a timeout occurred before operation end.
794  *
795  * @api
796  */
797 #define lsm6dslAccelerometerReadRaw(devp, axes) \
798  accelerometerReadRaw(&((devp)->acc_if), axes)
799 
800 /**
801  * @brief Retrieves cooked data from the BaseAccelerometer.
802  * @note This data is manipulated according to the formula
803  * cooked = (raw * sensitivity) - bias.
804  * @note Final data is expressed as milli-G.
805  * @note The axes array must be at least the same size of the
806  * BaseAccelerometer axes number.
807  *
808  * @param[in] devp pointer to @p LSM6DSLDriver.
809  * @param[out] axes a buffer which would be filled with cooked data.
810  *
811  * @return The operation status.
812  * @retval MSG_OK if the function succeeded.
813  * @retval MSG_RESET if one or more I2C errors occurred, the errors can
814  * be retrieved using @p i2cGetErrors().
815  * @retval MSG_TIMEOUT if a timeout occurred before operation end.
816  *
817  * @api
818  */
819 #define lsm6dslAccelerometerReadCooked(devp, axes) \
820  accelerometerReadCooked(&((devp)->acc_if), axes)
821 
822 /**
823  * @brief Set bias values for the BaseAccelerometer.
824  * @note Bias must be expressed as milli-G.
825  * @note The bias buffer must be at least the same size of the
826  * BaseAccelerometer axes number.
827  *
828  * @param[in] devp pointer to @p LSM6DSLDriver.
829  * @param[in] bp a buffer which contains biases.
830  *
831  * @return The operation status.
832  * @retval MSG_OK if the function succeeded.
833  *
834  * @api
835  */
836 #define lsm6dslAccelerometerSetBias(devp, bp) \
837  accelerometerSetBias(&((devp)->acc_if), bp)
838 
839 /**
840  * @brief Reset bias values for the BaseAccelerometer.
841  * @note Default biases value are obtained from device datasheet when
842  * available otherwise they are considered zero.
843  *
844  * @param[in] devp pointer to @p LSM6DSLDriver.
845  *
846  * @return The operation status.
847  * @retval MSG_OK if the function succeeded.
848  *
849  * @api
850  */
851 #define lsm6dslAccelerometerResetBias(devp) \
852  accelerometerResetBias(&((devp)->acc_if))
853 
854 /**
855  * @brief Set sensitivity values for the BaseAccelerometer.
856  * @note Sensitivity must be expressed as milli-G/LSB.
857  * @note The sensitivity buffer must be at least the same size of the
858  * BaseAccelerometer axes number.
859  *
860  * @param[in] devp pointer to @p LSM6DSLDriver.
861  * @param[in] sp a buffer which contains sensitivities.
862  *
863  * @return The operation status.
864  * @retval MSG_OK if the function succeeded.
865  *
866  * @api
867  */
868 #define lsm6dslAccelerometerSetSensitivity(devp, sp) \
869  accelerometerSetSensitivity(&((devp)->acc_if), sp)
870 
871 /**
872  * @brief Reset sensitivity values for the BaseAccelerometer.
873  * @note Default sensitivities value are obtained from device datasheet.
874  *
875  * @param[in] devp pointer to @p LSM6DSLDriver.
876  *
877  * @return The operation status.
878  * @retval MSG_OK if the function succeeded.
879  * @retval MSG_RESET otherwise.
880  *
881  * @api
882  */
883 #define lsm6dslAccelerometerResetSensitivity(devp) \
884  accelerometerResetSensitivity(&((devp)->acc_if))
885 
886 /**
887  * @brief Changes the LSM6DSLDriver accelerometer fullscale value.
888  * @note This function also rescale sensitivities and biases based on
889  * previous and next fullscale value.
890  * @note A recalibration is highly suggested after calling this function.
891  *
892  * @param[in] devp pointer to @p LSM6DSLDriver.
893  * @param[in] fs new fullscale value.
894  *
895  * @return The operation status.
896  * @retval MSG_OK if the function succeeded.
897  * @retval MSG_RESET otherwise.
898  *
899  * @api
900  */
901 #define lsm6dslAccelerometerSetFullScale(devp, fs) \
902  (devp)->vmt->acc_set_full_scale(devp, fs)
903 
904 /**
905  * @brief Return the number of axes of the BaseGyroscope.
906  *
907  * @param[in] devp pointer to @p LSM6DSLDriver.
908  *
909  * @return the number of axes.
910  *
911  * @api
912  */
913 #define lsm6dslGyroscopeGetAxesNumber(devp) \
914  gyroscopeGetAxesNumber(&((devp)->gyro_if))
915 
916 /**
917  * @brief Retrieves raw data from the BaseGyroscope.
918  * @note This data is retrieved from MEMS register without any algebraical
919  * manipulation.
920  * @note The axes array must be at least the same size of the
921  * BaseGyroscope axes number.
922  *
923  * @param[in] devp pointer to @p LSM6DSLDriver.
924  * @param[out] axes a buffer which would be filled with raw data.
925  *
926  * @return The operation status.
927  * @retval MSG_OK if the function succeeded.
928  * @retval MSG_RESET if one or more I2C errors occurred, the errors can
929  * be retrieved using @p i2cGetErrors().
930  * @retval MSG_TIMEOUT if a timeout occurred before operation end.
931  *
932  * @api
933  */
934 #define lsm6dslGyroscopeReadRaw(devp, axes) \
935  gyroscopeReadRaw(&((devp)->gyro_if), axes)
936 
937 /**
938  * @brief Retrieves cooked data from the BaseGyroscope.
939  * @note This data is manipulated according to the formula
940  * cooked = (raw * sensitivity) - bias.
941  * @note Final data is expressed as DPS.
942  * @note The axes array must be at least the same size of the
943  * BaseGyroscope axes number.
944  *
945  * @param[in] devp pointer to @p LSM6DSLDriver.
946  * @param[out] axes a buffer which would be filled with cooked data.
947  *
948  * @return The operation status.
949  * @retval MSG_OK if the function succeeded.
950  * @retval MSG_RESET if one or more I2C errors occurred, the errors can
951  * be retrieved using @p i2cGetErrors().
952  * @retval MSG_TIMEOUT if a timeout occurred before operation end.
953  *
954  * @api
955  */
956 #define lsm6dslGyroscopeReadCooked(devp, axes) \
957  gyroscopeReadCooked(&((devp)->gyro_if), axes)
958 
959 /**
960  * @brief Samples bias values for the BaseGyroscope.
961  * @note The LSM6DSL shall not be moved during the whole procedure.
962  * @note After this function internal bias is automatically updated.
963  * @note The behavior of this function depends on @p LSM6DSL_BIAS_ACQ_TIMES
964  * and @p LSM6DSL_BIAS_SETTLING_US.
965  *
966  * @param[in] devp pointer to @p LSM6DSLDriver.
967  *
968  * @return The operation status.
969  * @retval MSG_OK if the function succeeded.
970  * @retval MSG_RESET if one or more I2C errors occurred, the errors can
971  * be retrieved using @p i2cGetErrors().
972  * @retval MSG_TIMEOUT if a timeout occurred before operation end.
973  *
974  * @api
975  */
976 #define lsm6dslGyroscopeSampleBias(devp) \
977  gyroscopeSampleBias(&((devp)->gyro_if))
978 
979 /**
980  * @brief Set bias values for the BaseGyroscope.
981  * @note Bias must be expressed as DPS.
982  * @note The bias buffer must be at least the same size of the BaseGyroscope
983  * axes number.
984  *
985  * @param[in] devp pointer to @p LSM6DSLDriver.
986  * @param[in] bp a buffer which contains biases.
987  *
988  * @return The operation status.
989  * @retval MSG_OK if the function succeeded.
990  *
991  * @api
992  */
993 #define lsm6dslGyroscopeSetBias(devp, bp) \
994  gyroscopeSetBias(&((devp)->gyro_if), bp)
995 
996 /**
997  * @brief Reset bias values for the BaseGyroscope.
998  * @note Default biases value are obtained from device datasheet when
999  * available otherwise they are considered zero.
1000  *
1001  * @param[in] devp pointer to @p LSM6DSLDriver.
1002  *
1003  * @return The operation status.
1004  * @retval MSG_OK if the function succeeded.
1005  *
1006  * @api
1007  */
1008 #define lsm6dslGyroscopeResetBias(devp) \
1009  gyroscopeResetBias(&((devp)->gyro_if))
1010 
1011 /**
1012  * @brief Set sensitivity values for the BaseGyroscope.
1013  * @note Sensitivity must be expressed as DPS/LSB.
1014  * @note The sensitivity buffer must be at least the same size of the
1015  * BaseGyroscope axes number.
1016  *
1017  * @param[in] devp pointer to @p LSM6DSLDriver.
1018  * @param[in] sp a buffer which contains sensitivities.
1019  *
1020  * @return The operation status.
1021  * @retval MSG_OK if the function succeeded.
1022  *
1023  * @api
1024  */
1025 #define lsm6dslGyroscopeSetSensitivity(devp, sp) \
1026  gyroscopeSetSensitivity(&((devp)->gyro_if), sp)
1027 
1028 /**
1029  * @brief Reset sensitivity values for the BaseGyroscope.
1030  * @note Default sensitivities value are obtained from device datasheet.
1031  *
1032  * @param[in] devp pointer to @p LSM6DSLDriver.
1033  *
1034  * @return The operation status.
1035  * @retval MSG_OK if the function succeeded.
1036  * @retval MSG_RESET otherwise.
1037  *
1038  * @api
1039  */
1040 #define lsm6dslGyroscopeResetSensitivity(devp) \
1041  gyroscopeResetSensitivity(&((devp)->gyro_if))
1042 
1043 /**
1044  * @brief Changes the LSM6DSLDriver gyroscope fullscale value.
1045  * @note This function also rescale sensitivities and biases based on
1046  * previous and next fullscale value.
1047  * @note A recalibration is highly suggested after calling this function.
1048  *
1049  * @param[in] devp pointer to @p LSM6DSLDriver.
1050  * @param[in] fs new fullscale value.
1051  *
1052  * @return The operation status.
1053  * @retval MSG_OK if the function succeeded.
1054  * @retval MSG_RESET otherwise.
1055  *
1056  * @api
1057  */
1058 #define lsm6dslGyroscopeSetFullScale(devp, fs) \
1059  (devp)->vmt->acc_set_full_scale(devp, fs)
1060 
1061 /*===========================================================================*/
1062 /* External declarations. */
1063 /*===========================================================================*/
1064 
1065 #ifdef __cplusplus
1066 extern "C" {
1067 #endif
1068  void lsm6dslObjectInit(LSM6DSLDriver *devp);
1069  void lsm6dslStart(LSM6DSLDriver *devp, const LSM6DSLConfig *config);
1070  void lsm6dslStop(LSM6DSLDriver *devp);
1071 #ifdef __cplusplus
1072 }
1073 #endif
1074 
1075 #endif /* _LSM6DSL_H_ */
1076 
1077 /** @} */
lsm6dsl_gyro_fs_t
LSM6DSL gyroscope subsystem full scale.
Definition: lsm6dsl.h:539
lsm6dsl_gyro_fs_t gyrofullscale
LSM6DSL gyroscope subsystem full scale.
Definition: lsm6dsl.h:671
void lsm6dslObjectInit(LSM6DSLDriver *devp)
Initializes an instance.
Definition: lsm6dsl.c:832
lsm6dsl_sad_t slaveaddress
LSM6DSL Slave Address.
Definition: lsm6dsl.h:636
Type of I2C driver configuration structure.
Definition: hal_i2c_lld.h:75
void lsm6dslStop(LSM6DSLDriver *devp)
Deactivates the LSM6DSL Complex Driver peripheral.
Definition: lsm6dsl.c:1087
lsm6dsl_end_t endianness
LSM6DSL endianness.
Definition: lsm6dsl.h:694
I2CDriver * i2cp
I2C driver associated to this LSM6DSL.
Definition: lsm6dsl.h:627
lsm6dsl_gyro_lpf_t
LSM6DSL gyroscope subsystem output selection.
Definition: lsm6dsl.h:575
BaseAccelerometer acc_if
Base accelerometer interface.
Definition: lsm6dsl.h:756
float * gyrosensitivity
LSM6DSL gyroscope subsystem initial sensitivity.
Definition: lsm6dsl.h:663
lsm6dsl_gyro_lpf_t gyrolowpassfilter
LSM6DSL gyroscope subsystem low pass filter configuration.
Definition: lsm6dsl.h:684
LSM6DSL virtual methods table.
Definition: lsm6dsl.h:719
Base gyroscope class.
Definition: hal_gyroscope.h:88
LSM6DSL configuration structure.
Definition: lsm6dsl.h:611
lsm6dsl_acc_fs_t
LSM6DSL accelerometer subsystem full scale.
Definition: lsm6dsl.h:503
lsm6dsl_acc_odr_t accoutdatarate
LSM6DSL accelerometer subsystem output data rate.
Definition: lsm6dsl.h:653
lsm6dsl_gyro_odr_t gyrooutdatarate
LSM6DSL gyroscope subsystem output data rate.
Definition: lsm6dsl.h:675
Generic gyroscope interface header.
#define _lsm6dsl_data
LSM6DSLDriver specific data.
Definition: lsm6dsl.h:726
const SPIConfig * accspicfg
SPI configuration associated to this LSM6DSL accelerometer subsystem.
Definition: lsm6dsl.h:621
SPIDriver * spip
SPI driver associated to this LSM6DSL.
Definition: lsm6dsl.h:616
float * gyrobias
LSM6DSL gyroscope subsystem initial bias.
Definition: lsm6dsl.h:667
lsm6dsl_end_t
LSM6DSL endianness.
Definition: lsm6dsl.h:594
Structure representing an I2C driver.
Definition: hal_i2c_lld.h:88
lsm6dsl_gyro_odr_t
LSM6DSL gyroscope subsystem output data rate.
Definition: lsm6dsl.h:550
Driver configuration structure.
Definition: hal_spi_lld.h:83
float * accbias
LSM6DSL accelerometer subsystem initial bias.
Definition: lsm6dsl.h:645
void lsm6dslStart(LSM6DSLDriver *devp, const LSM6DSLConfig *config)
Configures and activates LSM6DSL Complex Driver peripheral.
Definition: lsm6dsl.c:853
lsm6dsl_sad_t
Accelerometer and Gyroscope Slave Address.
Definition: lsm6dsl.h:495
lsm6dsl_bdu_t
LSM6DSL block data update.
Definition: lsm6dsl.h:586
Generic accelerometer interface header.
lsm6dsl_acc_fs_t accfullscale
LSM6DSL accelerometer subsystem full scale.
Definition: lsm6dsl.h:649
BaseGyroscope gyro_if
Base gyroscope interface.
Definition: lsm6dsl.h:758
lsm6dsl_acc_lp_t
LSM6DSL accelerometer subsystem output data rate.
Definition: lsm6dsl.h:531
float * accsensitivity
LSM6DSL accelerometer subsystem initial sensitivity.
Definition: lsm6dsl.h:641
const I2CConfig * i2ccfg
I2C configuration associated to this LSM6DSL accelerometer subsystem.
Definition: lsm6dsl.h:632
const struct LSM6DSLVMT * vmt
Virtual Methods Table.
Definition: lsm6dsl.h:754
lsm6dsl_acc_odr_t
LSM6DSL accelerometer subsystem output data rate.
Definition: lsm6dsl.h:513
lsm6dsl_bdu_t blockdataupdate
LSM6DSL block data update.
Definition: lsm6dsl.h:690
Base accelerometer class.
lsm6dsl_state_t
Driver state machine possible states.
Definition: lsm6dsl.h:602
lsm6dsl_gyro_lp_t gyrolpmode
LSM6DSL gyroscope subsystem low mode configuration.
Definition: lsm6dsl.h:680
Structure representing an SPI driver.
Definition: hal_spi_lld.h:128
lsm6dsl_acc_lp_t acclpmode
LSM6DSL accelerometer subsystem low power mode.
Definition: lsm6dsl.h:658
LSM6DSL 6-axis accelerometer/gyroscope class.
Definition: lsm6dsl.h:752
#define _lsm6dsl_methods
LSM6DSL specific methods with inherited ones.
Definition: lsm6dsl.h:710
lsm6dsl_gyro_lp_t
LSM6DSL gyroscope subsystem low mode configuration.
Definition: lsm6dsl.h:567