46 #define EX_LSM6DS0_VERSION "1.1.1" 51 #define EX_LSM6DS0_MAJOR 1 56 #define EX_LSM6DS0_MINOR 1 61 #define EX_LSM6DS0_PATCH 1 72 #define LSM6DS0_ACC_NUMBER_OF_AXES 3U 74 #define LSM6DS0_ACC_2G 2.0f 75 #define LSM6DS0_ACC_4G 4.0f 76 #define LSM6DS0_ACC_8G 8.0f 77 #define LSM6DS0_ACC_16G 16.0f 79 #define LSM6DS0_ACC_SENS_2G 0.061f 80 #define LSM6DS0_ACC_SENS_4G 0.122f 81 #define LSM6DS0_ACC_SENS_8G 0.244f 82 #define LSM6DS0_ACC_SENS_16G 0.732f 84 #define LSM6DS0_ACC_BIAS 0.0f 95 #define LSM6DS0_GYRO_NUMBER_OF_AXES 3U 97 #define LSM6DS0_GYRO_245DPS 245.0f 98 #define LSM6DS0_GYRO_500DPS 500.0f 99 #define LSM6DS0_GYRO_2000DPS 2000.0f 101 #define LSM6DS0_GYRO_SENS_245DPS 0.00875f 102 #define LSM6DS0_GYRO_SENS_500DPS 0.01750f 103 #define LSM6DS0_GYRO_SENS_2000DPS 0.07000f 105 #define LSM6DS0_GYRO_BIAS 0.0f 112 #define LSM6DS0_DI_MASK 0xFF 113 #define LSM6DS0_DI(n) (1 << n) 114 #define LSM6DS0_AD_MASK 0x7F 115 #define LSM6DS0_AD(n) (1 << n) 116 #define LSM6DS0_MS (1 << 7) 123 #define LSM6DS0_AD_ACT_THS 0x04 124 #define LSM6DS0_AD_ACT_DUR 0x05 125 #define LSM6DS0_AD_INT_GEN_CFG_XL 0x06 126 #define LSM6DS0_AD_INT_GEN_THS_X_XL 0x07 127 #define LSM6DS0_AD_INT_GEN_THS_Y_XL 0x08 128 #define LSM6DS0_AD_INT_GEN_THS_Z_XL 0x09 129 #define LSM6DS0_AD_INT_GEN_DUR_XL 0x0A 130 #define LSM6DS0_AD_REFERENCE_G 0x0B 131 #define LSM6DS0_AD_INT_CTRL 0x0C 132 #define LSM6DS0_AD_WHO_AM_I 0x0F 133 #define LSM6DS0_AD_CTRL_REG1_G 0x10 134 #define LSM6DS0_AD_CTRL_REG2_G 0x11 135 #define LSM6DS0_AD_CTRL_REG3_G 0x12 136 #define LSM6DS0_AD_ORIENT_CFG_G 0x13 137 #define LSM6DS0_AD_INT_GEN_SRC_G 0x14 138 #define LSM6DS0_AD_OUT_TEMP_L 0x15 139 #define LSM6DS0_AD_OUT_TEMP_H 0x16 140 #define LSM6DS0_AD_STATUS_REG1 0x17 141 #define LSM6DS0_AD_OUT_X_L_G 0x18 142 #define LSM6DS0_AD_OUT_X_H_G 0x19 143 #define LSM6DS0_AD_OUT_Y_L_G 0x1A 144 #define LSM6DS0_AD_OUT_Y_H_G 0x1B 145 #define LSM6DS0_AD_OUT_Z_L_G 0x1C 146 #define LSM6DS0_AD_OUT_Z_H_G 0x1D 147 #define LSM6DS0_AD_CTRL_REG4 0x1E 148 #define LSM6DS0_AD_CTRL_REG5_XL 0x1F 149 #define LSM6DS0_AD_CTRL_REG6_XL 0x20 150 #define LSM6DS0_AD_CTRL_REG7_XL 0x21 151 #define LSM6DS0_AD_CTRL_REG8 0x22 152 #define LSM6DS0_AD_CTRL_REG9 0x23 153 #define LSM6DS0_AD_CTRL_REG10 0x24 154 #define LSM6DS0_AD_INT_GEN_SRC_XL 0x26 155 #define LSM6DS0_AD_STATUS_REG2 0x27 156 #define LSM6DS0_AD_OUT_X_L_XL 0x28 157 #define LSM6DS0_AD_OUT_X_H_XL 0x29 158 #define LSM6DS0_AD_OUT_Y_L_XL 0x2A 159 #define LSM6DS0_AD_OUT_Y_H_XL 0x2B 160 #define LSM6DS0_AD_OUT_Z_L_XL 0x2C 161 #define LSM6DS0_AD_OUT_Z_H_XL 0x2D 162 #define LSM6DS0_AD_FIFO_CTRL 0x2E 163 #define LSM6DS0_AD_FIFO_SRC 0x2F 164 #define LSM6DS0_AD_INT_GEN_CFG_G 0x30 165 #define LSM6DS0_AD_INT_GEN_THS_XH_G 0x31 166 #define LSM6DS0_AD_INT_GEN_THS_XL_G 0x32 167 #define LSM6DS0_AD_INT_GEN_THS_YH_G 0x33 168 #define LSM6DS0_AD_INT_GEN_THS_YL_G 0x34 169 #define LSM6DS0_AD_INT_GEN_THS_ZH_G 0x35 170 #define LSM6DS0_AD_INT_GEN_THS_ZL_G 0x36 171 #define LSM6DS0_AD_INT_GEN_DUR_G 0x37 178 #define LSM6DS0_CTRL_REG1_G 0xFA 179 #define LSM6DS0_CTRL_REG1_G_BW_G0 (1 << 0) 180 #define LSM6DS0_CTRL_REG1_G_BW_G1 (1 << 1) 181 #define LSM6DS0_CTRL_REG1_G_FS_MASK 0x1F 182 #define LSM6DS0_CTRL_REG1_G_FS_G0 (1 << 3) 183 #define LSM6DS0_CTRL_REG1_G_FS_G1 (1 << 4) 184 #define LSM6DS0_CTRL_REG1_G_ODR_G0 (1 << 5) 185 #define LSM6DS0_CTRL_REG1_G_ODR_G1 (1 << 6) 186 #define LSM6DS0_CTRL_REG1_G_ODR_G2 (1 << 7) 193 #define LSM6DS0_CTRL_REG2_G 0x0F 194 #define LSM6DS0_CTRL_REG2_G_OUT_SEL0 (1 << 0) 195 #define LSM6DS0_CTRL_REG2_G_OUT_SEL1 (1 << 1) 196 #define LSM6DS0_CTRL_REG2_G_INT_SEL0 (1 << 2) 197 #define LSM6DS0_CTRL_REG2_G_INT_SEL1 (1 << 3) 204 #define LSM6DS0_CTRL_REG3_G 0x64 205 #define LSM6DS0_CTRL_REG3_G_HP_CF0_G (1 << 0) 206 #define LSM6DS0_CTRL_REG3_G_HP_CF1_G (1 << 1) 207 #define LSM6DS0_CTRL_REG3_G_HP_CF2_G (1 << 2) 208 #define LSM6DS0_CTRL_REG3_G_HP_CF3_G (1 << 3) 209 #define LSM6DS0_CTRL_REG3_G_HP_EN (1 << 6) 210 #define LSM6DS0_CTRL_REG3_G_LP_MODE (1 << 7) 217 #define LSM6DS0_CTRL_REG4 0x3A 218 #define LSM6DS0_CTRL_REG4_4D_XL1 (1 << 0) 219 #define LSM6DS0_CTRL_REG4_LIR_XL1 (1 << 1) 220 #define LSM6DS0_CTRL_REG4_XEN_G (1 << 3) 221 #define LSM6DS0_CTRL_REG4_YEN_G (1 << 4) 222 #define LSM6DS0_CTRL_REG4_ZEN_G (1 << 5) 229 #define LSM6DS0_CTRL_REG5_XL 0xF8 230 #define LSM6DS0_CTRL_REG5_XL_XEN_XL (1 << 3) 231 #define LSM6DS0_CTRL_REG5_XL_YEN_XL (1 << 4) 232 #define LSM6DS0_CTRL_REG5_XL_ZEN_XL (1 << 5) 233 #define LSM6DS0_CTRL_REG5_XL_DEC0 (1 << 6) 234 #define LSM6DS0_CTRL_REG5_XL_DEC1 (1 << 7) 241 #define LSM6DS0_CTRL_REG6_XL 0xFF 242 #define LSM6DS0_CTRL_REG6_XL_BW_XL0 (1 << 0) 243 #define LSM6DS0_CTRL_REG6_XL_BW_XL1 (1 << 1) 244 #define LSM6DS0_CTRL_REG6_XL_BW_SCAL_ODR (1 << 2) 245 #define LSM6DS0_CTRL_REG6_XL_FS_MASK 0x1F 246 #define LSM6DS0_CTRL_REG6_XL_FS0_XL (1 << 3) 247 #define LSM6DS0_CTRL_REG6_XL_FS1_XL (1 << 4) 248 #define LSM6DS0_CTRL_REG6_XL_ODR_XL0 (1 << 5) 249 #define LSM6DS0_CTRL_REG6_XL_ODR_XL1 (1 << 6) 250 #define LSM6DS0_CTRL_REG6_XL_ODR_XL2 (1 << 7) 257 #define LSM6DS0_CTRL_REG7_XL 0xE5 258 #define LSM6DS0_CTRL_REG7_XL_HPIS1 (1 << 0) 259 #define LSM6DS0_CTRL_REG7_XL_FDS (1 << 2) 260 #define LSM6DS0_CTRL_REG7_XL_DCF0 (1 << 5) 261 #define LSM6DS0_CTRL_REG7_XL_DCF1 (1 << 6) 262 #define LSM6DS0_CTRL_REG7_XL_HR (1 << 7) 269 #define LSM6DS0_CTRL_REG8 0xFF 270 #define LSM6DS0_CTRL_REG8_SW_RESET (1 << 0) 271 #define LSM6DS0_CTRL_REG8_BLE (1 << 1) 272 #define LSM6DS0_CTRL_REG8_IF_ADD_INC (1 << 2) 273 #define LSM6DS0_CTRL_REG8_SIM (1 << 3) 274 #define LSM6DS0_CTRL_REG8_PP_OD (1 << 4) 275 #define LSM6DS0_CTRL_REG8_H_LACTIVE (1 << 5) 276 #define LSM6DS0_CTRL_REG8_BDU (1 << 6) 277 #define LSM6DS0_CTRL_REG8_BOOT (1 << 7) 284 #define LSM6DS0_CTRL_REG9 0x5F 285 #define LSM6DS0_CTRL_REG9_STOP_ON_FTH (1 << 0) 286 #define LSM6DS0_CTRL_REG9_FIFO_EN (1 << 1) 287 #define LSM6DS0_CTRL_REG9_I2C_DISABLE (1 << 2) 288 #define LSM6DS0_CTRL_REG9_DRDY_MASK_BIT (1 << 3) 289 #define LSM6DS0_CTRL_REG9_FIFO_TEMP_EN (1 << 4) 290 #define LSM6DS0_CTRL_REG9_SLEEP_G (1 << 6) 297 #define LSM6DS0_CTRL_REG10 0x05 298 #define LSM6DS0_CTRL_REG10_ST_XL (1 << 0) 299 #define LSM6DS0_CTRL_REG10_ST_G (1 << 2) 315 #if !defined(LSM6DS0_USE_SPI) || defined(__DOXYGEN__) 316 #define LSM6DS0_USE_SPI FALSE 325 #if !defined(LSM6DS0_SHARED_SPI) || defined(__DOXYGEN__) 326 #define LSM6DS0_SHARED_SPI FALSE 334 #if !defined(LSM6DS0_USE_I2C) || defined(__DOXYGEN__) 335 #define LSM6DS0_USE_I2C TRUE 344 #if !defined(LSM6DS0_SHARED_I2C) || defined(__DOXYGEN__) 345 #define LSM6DS0_SHARED_I2C FALSE 353 #if !defined(LSM6DS0_USE_ADVANCED) || defined(__DOXYGEN__) 354 #define LSM6DS0_USE_ADVANCED FALSE 363 #if !defined(LSM6DS0_ACC_USE_ADVANCED) || defined(__DOXYGEN__) 364 #define LSM6DS0_ACC_USE_ADVANCED FALSE 373 #if !defined(LSM6DS0_GYRO_USE_ADVANCED) || defined(__DOXYGEN__) 374 #define LSM6DS0_GYRO_USE_ADVANCED FALSE 382 #if !defined(LSM6DS0_GYRO_BIAS_ACQ_TIMES) || defined(__DOXYGEN__) 383 #define LSM6DS0_GYRO_BIAS_ACQ_TIMES 50 390 #if !defined(LSM6DS0_GYRO_BIAS_SETTLING_US) || defined(__DOXYGEN__) 391 #define LSM6DS0_GYRO_BIAS_SETTLING_US 5000 399 #if !(LSM6DS0_USE_SPI ^ LSM6DS0_USE_I2C) 400 #error "LSM6DS0_USE_SPI and LSM6DS0_USE_I2C cannot be both true or both false" 403 #if LSM6DS0_USE_SPI && !HAL_USE_SPI 404 #error "LSM6DS0_USE_SPI requires HAL_USE_SPI" 407 #if LSM6DS0_SHARED_SPI && !SPI_USE_MUTUAL_EXCLUSION 408 #error "LSM6DS0_SHARED_SPI requires SPI_USE_MUTUAL_EXCLUSION" 411 #if LSM6DS0_USE_I2C && !HAL_USE_I2C 412 #error "LSM6DS0_USE_I2C requires HAL_USE_I2C" 415 #if LSM6DS0_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION 416 #error "LSM6DS0_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION" 423 #error "LSM6DS0 over SPI still not supported" 493 LSM6DS0_GYRO_ODR_PD = 0x00,
494 LSM6DS0_GYRO_ODR_95HZ_FC_25 = 0x10,
495 LSM6DS0_GYRO_ODR_14_9HZ_FC_5 = 0X20,
496 LSM6DS0_GYRO_ODR_59_5HZ_FC_16 = 0X40,
497 LSM6DS0_GYRO_ODR_119HZ_FC_14 = 0X60,
498 LSM6DS0_GYRO_ODR_119HZ_FC_31 = 0X61,
499 LSM6DS0_GYRO_ODR_238HZ_FC_14 = 0X80,
500 LSM6DS0_GYRO_ODR_238HZ_FC_29 = 0X81,
501 LSM6DS0_GYRO_ODR_238HZ_FC_63 = 0X82,
502 LSM6DS0_GYRO_ODR_238HZ_FC_78 = 0X83,
503 LSM6DS0_GYRO_ODR_476HZ_FC_21 = 0XA0,
504 LSM6DS0_GYRO_ODR_476HZ_FC_28 = 0XA1,
505 LSM6DS0_GYRO_ODR_476HZ_FC_57 = 0XA2,
506 LSM6DS0_GYRO_ODR_476HZ_FC_100 = 0XA3,
507 LSM6DS0_GYRO_ODR_952HZ_FC_33 = 0XC0,
508 LSM6DS0_GYRO_ODR_952HZ_FC_40 = 0XC1,
509 LSM6DS0_GYRO_ODR_952HZ_FC_58 = 0XC2,
510 LSM6DS0_GYRO_ODR_952HZ_FC_100 = 0XC3
543 LSM6DS0_GYRO_HPCF_1 = 0x01,
544 LSM6DS0_GYRO_HPCF_2 = 0x02,
545 LSM6DS0_GYRO_HPCF_3 = 0x03,
546 LSM6DS0_GYRO_HPCF_4 = 0x04,
547 LSM6DS0_GYRO_HPCF_5 = 0x05,
548 LSM6DS0_GYRO_HPCF_6 = 0x06,
549 LSM6DS0_GYRO_HPCF_7 = 0x07,
550 LSM6DS0_GYRO_HPCF_8 = 0x08,
551 LSM6DS0_GYRO_HPCF_9 = 0x09
583 #if (LSM6DS0_USE_SPI) || defined(__DOXYGEN__) 594 #if (LSM6DS0_USE_I2C) || defined(__DOXYGEN__) 625 #if LSM6DS0_ACC_USE_ADVANCED || defined(__DOXYGEN__) 647 #if LSM6DS0_GYRO_USE_ADVANCED || defined(__DOXYGEN__) 665 #if (LSM6DS0_USE_ADVANCED) || defined(__DOXYGEN__) 680 #define _lsm6ds0_methods_alone \ 682 msg_t (*acc_set_full_scale)(LSM6DS0Driver *devp, lsm6ds0_acc_fs_t fs); \ 684 msg_t (*gyro_set_full_scale)(LSM6DS0Driver *devp, lsm6ds0_gyro_fs_t fs); 689 #define _lsm6ds0_methods \ 690 _base_object_methods \ 691 _lsm6ds0_methods_alone 705 #define _lsm6ds0_data \ 708 lsm6ds0_state_t state; \ 710 const LSM6DS0Config *config; \ 714 float accsensitivity[LSM6DS0_ACC_NUMBER_OF_AXES]; \ 716 float accbias[LSM6DS0_ACC_NUMBER_OF_AXES]; \ 718 float accfullscale; \ 722 float gyrosensitivity[LSM6DS0_GYRO_NUMBER_OF_AXES]; \ 724 float gyrobias[LSM6DS0_GYRO_NUMBER_OF_AXES]; \ 755 #define lsm6ds0AccelerometerGetAxesNumber(devp) \ 756 accelerometerGetAxesNumber(&((devp)->acc_if)) 776 #define lsm6ds0AccelerometerReadRaw(devp, axes) \ 777 accelerometerReadRaw(&((devp)->acc_if), axes) 798 #define lsm6ds0AccelerometerReadCooked(devp, axes) \ 799 accelerometerReadCooked(&((devp)->acc_if), axes) 815 #define lsm6ds0AccelerometerSetBias(devp, bp) \ 816 accelerometerSetBias(&((devp)->acc_if), bp) 830 #define lsm6ds0AccelerometerResetBias(devp) \ 831 accelerometerResetBias(&((devp)->acc_if)) 847 #define lsm6ds0AccelerometerSetSensitivity(devp, sp) \ 848 accelerometerSetSensitivity(&((devp)->acc_if), sp) 862 #define lsm6ds0AccelerometerResetSensitivity(devp) \ 863 accelerometerResetSensitivity(&((devp)->acc_if)) 880 #define lsm6ds0AccelerometerSetFullScale(devp, fs) \ 881 (devp)->vmt->acc_set_full_scale(devp, fs) 892 #define lsm6ds0GyroscopeGetAxesNumber(devp) \ 893 gyroscopeGetAxesNumber(&((devp)->gyro_if)) 913 #define lsm6ds0GyroscopeReadRaw(devp, axes) \ 914 gyroscopeReadRaw(&((devp)->gyro_if), axes) 935 #define lsm6ds0GyroscopeReadCooked(devp, axes) \ 936 gyroscopeReadCooked(&((devp)->gyro_if), axes) 955 #define lsm6ds0GyroscopeSampleBias(devp) \ 956 gyroscopeSampleBias(&((devp)->gyro_if)) 972 #define lsm6ds0GyroscopeSetBias(devp, bp) \ 973 gyroscopeSetBias(&((devp)->gyro_if), bp) 987 #define lsm6ds0GyroscopeResetBias(devp) \ 988 gyroscopeResetBias(&((devp)->gyro_if)) 1004 #define lsm6ds0GyroscopeSetSensitivity(devp, sp) \ 1005 gyroscopeSetSensitivity(&((devp)->gyro_if), sp) 1019 #define lsm6ds0GyroscopeResetSensitivity(devp) \ 1020 gyroscopeResetSensitivity(&((devp)->gyro_if)) 1037 #define lsm6ds0GyroscopeSetFullScale(devp, fs) \ 1038 (devp)->vmt->acc_set_full_scale(devp, fs) LSM6DS0 configuration structure.
lsm6ds0_state_t
Driver state machine possible states.
Type of I2C driver configuration structure.
lsm6ds0_acc_fs_t
LSM6DS0 accelerometer subsystem full scale.
float * gyrosensitivity
LSM6DS0 gyroscope subsystem initial sensitivity.
LSM6DS0 virtual methods table.
lsm6ds0_gyro_hp_t gyrohpfenable
LSM6DS0 gyroscope subsystem high pass filter.
I2CDriver * i2cp
I2C driver associated to this LSM6DS0.
float * accsensitivity
LSM6DS0 accelerometer subsystem initial sensitivity.
lsm6ds0_gyro_lp_t
LSM6DS0 gyroscope subsystem low mode configuration.
LSM6DS0 6-axis accelerometer/gyroscope class.
lsm6ds0_gyro_lp_t gyrolowmodecfg
LSM6DS0 gyroscope subsystem low mode configuration.
void lsm6ds0ObjectInit(LSM6DS0Driver *devp)
Initializes an instance.
BaseGyroscope gyro_if
Base gyroscope interface.
lsm6ds0_end_t endianness
LSM6DS0 endianness.
Generic gyroscope interface header.
const struct LSM6DS0VMT * vmt
Virtual Methods Table.
#define _lsm6ds0_data
LSM6DS0Driver specific data.
lsm6ds0_sad_t
Accelerometer and Gyroscope Slave Address.
void lsm6ds0Stop(LSM6DS0Driver *devp)
Deactivates the LSM6DS0 Complex Driver peripheral.
lsm6ds0_gyro_fs_t
LSM6DS0 gyroscope subsystem full scale.
lsm6ds0_acc_fs_t accfullscale
LSM6DS0 accelerometer subsystem full scale.
Structure representing an I2C driver.
lsm6ds0_sad_t slaveaddress
LSM6DS0 Slave Address.
lsm6ds0_acc_odr_t
LSM6DS0 accelerometer subsystem output data rate.
lsm6ds0_gyro_odr_t gyrooutdatarate
LSM6DS0 gyroscope subsystem output data rate.
lsm6ds0_gyro_out_sel_t gyrooutsel
LSM6DS0 gyroscope subsystem output selection.
lsm6ds0_gyro_fs_t gyrofullscale
LSM6DS0 gyroscope subsystem full scale.
lsm6ds0_gyro_out_sel_t
LSM6DS0 gyroscope subsystem output selection.
Driver configuration structure.
BaseAccelerometer acc_if
Base accelerometer interface.
lsm6ds0_bdu_t
LSM6DS0 block data update.
Generic accelerometer interface header.
SPIDriver * spip
SPI driver associated to this LSM6DS0.
lsm6ds0_acc_dec_t accdecmode
LSM6DS0 accelerometer subsystem decimation mode.
lsm6ds0_end_t
LSM6DS0 endianness.
void lsm6ds0Start(LSM6DS0Driver *devp, const LSM6DS0Config *config)
Configures and activates LSM6DS0 Complex Driver peripheral.
lsm6ds0_gyro_hpcf_t gyrohpcfg
LSM6DS0 gyroscope subsystem high pass filter configuration.
lsm6ds0_bdu_t blockdataupdate
LSM6DS0 block data update.
lsm6ds0_acc_dec_t
LSM6DS0 accelerometer subsystem decimation mode.
lsm6ds0_gyro_hpcf_t
LSM6DS0 gyroscope subsystem high pass filter configuration.
const SPIConfig * accspicfg
SPI configuration associated to this LSM6DS0 accelerometer subsystem.
Base accelerometer class.
float * accbias
LSM6DS0 accelerometer subsystem initial bias.
Structure representing an SPI driver.
lsm6ds0_acc_odr_t accoutdatarate
LSM6DS0 accelerometer subsystem output data rate.
const I2CConfig * i2ccfg
I2C configuration associated to this LSM6DS0 accelerometer subsystem.
#define _lsm6ds0_methods
LSM6DS0 specific methods with inherited ones.
lsm6ds0_gyro_hp_t
LSM6DS0 gyroscope subsystem high pass filter.
lsm6ds0_gyro_odr_t
LSM6DS0 gyroscope subsystem output data rate.
float * gyrobias
LSM6DS0 gyroscope subsystem initial bias.