Go to the documentation of this file.
29 #ifndef _LSM303DLHC_H_
30 #define _LSM303DLHC_H_
46 #define EX_LSM303DLHC_VERSION "1.1.2"
51 #define EX_LSM303DLHC_MAJOR 1
56 #define EX_LSM303DLHC_MINOR 1
61 #define EX_LSM303DLHC_PATCH 2
72 #define LSM303DLHC_ACC_NUMBER_OF_AXES 3U
74 #define LSM303DLHC_ACC_2G 2.0f
75 #define LSM303DLHC_ACC_4G 4.0f
76 #define LSM303DLHC_ACC_8G 8.0f
77 #define LSM303DLHC_ACC_16G 16.0f
79 #define LSM303DLHC_ACC_SENS_2G 0.0610f
80 #define LSM303DLHC_ACC_SENS_4G 0.1221f
81 #define LSM303DLHC_ACC_SENS_8G 0.2442f
82 #define LSM303DLHC_ACC_SENS_16G 0.4884f
84 #define LSM303DLHC_ACC_BIAS 0.0f
94 #define LSM303DLHC_COMP_NUMBER_OF_AXES 3U
96 #define LSM303DLHC_COMP_1P3GA 1.3f
97 #define LSM303DLHC_COMP_1P9GA 1.9f
98 #define LSM303DLHC_COMP_2P5GA 2.5f
99 #define LSM303DLHC_COMP_4P0GA 4.0f
100 #define LSM303DLHC_COMP_4P7GA 4.7f
101 #define LSM303DLHC_COMP_5P6GA 5.6f
102 #define LSM303DLHC_COMP_8P1GA 8.1f
104 #define LSM303DLHC_COMP_SENS_XY_1P3GA 0.000909f
105 #define LSM303DLHC_COMP_SENS_XY_1P9GA 0.001169f
106 #define LSM303DLHC_COMP_SENS_XY_2P5GA 0.0014925f
107 #define LSM303DLHC_COMP_SENS_XY_4P0GA 0.0022222f
108 #define LSM303DLHC_COMP_SENS_XY_4P7GA 0.0025000f
109 #define LSM303DLHC_COMP_SENS_XY_5P6GA 0.0030303f
110 #define LSM303DLHC_COMP_SENS_XY_8P1GA 0.0043478f
112 #define LSM303DLHC_COMP_SENS_Z_1P3GA 0.0010204f
113 #define LSM303DLHC_COMP_SENS_Z_1P9GA 0.0013071f
114 #define LSM303DLHC_COMP_SENS_Z_2P5GA 0.0016666f
115 #define LSM303DLHC_COMP_SENS_Z_4P0GA 0.0025000f
116 #define LSM303DLHC_COMP_SENS_Z_4P7GA 0.0028169f
117 #define LSM303DLHC_COMP_SENS_Z_5P6GA 0.0033898f
118 #define LSM303DLHC_COMP_SENS_Z_8P1GA 0.0048780f
120 #define LSM303DLHC_COMP_BIAS 0.0f
127 #define LSM303DLHC_DI_MASK 0xFF
128 #define LSM303DLHC_DI(n) (1 << n)
129 #define LSM303DLHC_AD_MASK 0x7F
130 #define LSM303DLHC_AD(n) (1 << n)
131 #define LSM303DLHC_MS (1 << 7)
138 #define LSM303DLHC_AD_ACC_CTRL_REG1 0x20
139 #define LSM303DLHC_AD_ACC_CTRL_REG2 0x21
140 #define LSM303DLHC_AD_ACC_CTRL_REG3 0x22
141 #define LSM303DLHC_AD_ACC_CTRL_REG4 0x23
142 #define LSM303DLHC_AD_ACC_CTRL_REG5 0x24
143 #define LSM303DLHC_AD_ACC_CTRL_REG6 0x25
144 #define LSM303DLHC_AD_ACC_REFERENCE 0x26
145 #define LSM303DLHC_AD_ACC_STATUS_REG 0x27
146 #define LSM303DLHC_AD_ACC_OUT_X_L 0x28
147 #define LSM303DLHC_AD_ACC_OUT_X_H 0x29
148 #define LSM303DLHC_AD_ACC_OUT_Y_L 0x2A
149 #define LSM303DLHC_AD_ACC_OUT_Y_H 0x2B
150 #define LSM303DLHC_AD_ACC_OUT_Z_L 0x2C
151 #define LSM303DLHC_AD_ACC_OUT_Z_H 0x2D
152 #define LSM303DLHC_AD_ACC_FIFO_CTRL_REG 0x2E
153 #define LSM303DLHC_AD_ACC_FIFO_SRC_REG 0x2F
154 #define LSM303DLHC_AD_ACC_INT1_CFG 0x30
155 #define LSM303DLHC_AD_ACC_INT1_SRC 0x31
156 #define LSM303DLHC_AD_ACC_INT1_THS 0x32
157 #define LSM303DLHC_AD_ACC_INT1_DURATION 0x33
158 #define LSM303DLHC_AD_ACC_INT2_CFG 0x34
159 #define LSM303DLHC_AD_ACC_INT2_SRC 0x35
160 #define LSM303DLHC_AD_ACC_INT2_THS 0x36
161 #define LSM303DLHC_AD_ACC_INT2_DURATION 0x37
162 #define LSM303DLHC_AD_ACC_CLICK_CFG 0x38
163 #define LSM303DLHC_AD_ACC_CLICK_SRC 0x39
164 #define LSM303DLHC_AD_ACC_CLICK_THS 0x3A
165 #define LSM303DLHC_AD_ACC_TIME_LIMIT 0x3B
166 #define LSM303DLHC_AD_ACC_TIME_LATENCY 0x3C
167 #define LSM303DLHC_AD_ACC_TIME_WINDOW 0x3D
168 #define LSM303DLHC_AD_COMP_CRA_REG 0x00
169 #define LSM303DLHC_AD_COMP_CRB_REG 0x01
170 #define LSM303DLHC_AD_COMP_MR_REG 0x02
171 #define LSM303DLHC_AD_COMP_OUT_X_H 0x03
172 #define LSM303DLHC_AD_COMP_OUT_X_L 0x04
173 #define LSM303DLHC_AD_COMP_OUT_Z_H 0x05
174 #define LSM303DLHC_AD_COMP_OUT_Z_L 0x06
175 #define LSM303DLHC_AD_COMP_OUT_Y_H 0x07
176 #define LSM303DLHC_AD_COMP_OUT_Y_L 0x08
177 #define LSM303DLHC_AD_COMP_SR_REG 0x09
178 #define LSM303DLHC_AD_COMP_IRA_REG 0x0A
179 #define LSM303DLHC_AD_COMP_IRB_REG 0x0B
180 #define LSM303DLHC_AD_COMP_IRC_REG 0x0C
181 #define LSM303DLHC_AD_COMP_TEMP_OUT_H 0x31
182 #define LSM303DLHC_AD_COMP_TEMP_OUT_L 0x32
189 #define LSM303DLHC_CTRL_REG1_A_MASK 0xFF
190 #define LSM303DLHC_CTRL_REG1_A_XEN (1 << 0)
191 #define LSM303DLHC_CTRL_REG1_A_YEN (1 << 1)
192 #define LSM303DLHC_CTRL_REG1_A_ZEN (1 << 2)
193 #define LSM303DLHC_CTRL_REG1_A_LPEN (1 << 3)
194 #define LSM303DLHC_CTRL_REG1_A_ODR0 (1 << 4)
195 #define LSM303DLHC_CTRL_REG1_A_ODR1 (1 << 5)
196 #define LSM303DLHC_CTRL_REG1_A_ODR2 (1 << 6)
197 #define LSM303DLHC_CTRL_REG1_A_ODR3 (1 << 7)
204 #define LSM303DLHC_CTRL_REG2_A_MASK 0xFF
205 #define LSM303DLHC_CTRL_REG2_A_HPIS1 (1 << 0)
206 #define LSM303DLHC_CTRL_REG2_A_HPIS2 (1 << 1)
207 #define LSM303DLHC_CTRL_REG2_A_HPCLICK (1 << 2)
208 #define LSM303DLHC_CTRL_REG2_A_FDS (1 << 3)
209 #define LSM303DLHC_CTRL_REG2_A_HPCF1 (1 << 4)
210 #define LSM303DLHC_CTRL_REG2_A_HPCF2 (1 << 5)
211 #define LSM303DLHC_CTRL_REG2_A_HPM0 (1 << 6)
212 #define LSM303DLHC_CTRL_REG2_A_HPM1 (1 << 7)
219 #define LSM303DLHC_CTRL_REG3_A_MASK 0xFD
220 #define LSM303DLHC_CTRL_REG3_A_I1_OVERRUN (1 << 1)
221 #define LSM303DLHC_CTRL_REG3_A_I1_WTM (1 << 2)
222 #define LSM303DLHC_CTRL_REG3_A_I1_DRDY2 (1 << 3)
223 #define LSM303DLHC_CTRL_REG3_A_I1_DRDY1 (1 << 4)
224 #define LSM303DLHC_CTRL_REG3_A_I1_AOI2 (1 << 5)
225 #define LSM303DLHC_CTRL_REG3_A_I1_AOI1 (1 << 6)
226 #define LSM303DLHC_CTRL_REG3_A_I1_CLICK (1 << 7)
233 #define LSM303DLHC_CTRL_REG4_A_MASK 0xF9
234 #define LSM303DLHC_CTRL_REG4_A_SIM (1 << 0)
235 #define LSM303DLHC_CTRL_REG4_A_HR (1 << 3)
236 #define LSM303DLHC_CTRL_REG4_A_FS_MASK 0x30
237 #define LSM303DLHC_CTRL_REG4_A_FS0 (1 << 4)
238 #define LSM303DLHC_CTRL_REG4_A_FS1 (1 << 5)
239 #define LSM303DLHC_CTRL_REG4_A_BLE (1 << 6)
240 #define LSM303DLHC_CTRL_REG4_A_BDU (1 << 7)
247 #define LSM303DLHC_CTRL_REG5_A_MASK 0xCF
248 #define LSM303DLHC_CTRL_REG5_A_D4D_INT2 (1 << 0)
249 #define LSM303DLHC_CTRL_REG5_A_LIR_INT2 (1 << 1)
250 #define LSM303DLHC_CTRL_REG5_A_D4D_INT1 (1 << 2)
251 #define LSM303DLHC_CTRL_REG5_A_LIR_INT1 (1 << 3)
252 #define LSM303DLHC_CTRL_REG5_A_FIFO_EN (1 << 6)
253 #define LSM303DLHC_CTRL_REG5_A_BOOT (1 << 7)
260 #define LSM303DLHC_CTRL_REG6_A_MASK 0xFA
261 #define LSM303DLHC_CTRL_REG6_A_H_LACTIVE (1 << 1)
262 #define LSM303DLHC_CTRL_REG6_A_P2_ACT (1 << 3)
263 #define LSM303DLHC_CTRL_REG6_A_BOOT_I1 (1 << 4)
264 #define LSM303DLHC_CTRL_REG6_A_I2_INT2 (1 << 5)
265 #define LSM303DLHC_CTRL_REG6_A_I2_INT1 (1 << 6)
266 #define LSM303DLHC_CTRL_REG6_A_I2_CLICKEN (1 << 7)
273 #define LSM303DLHC_CRA_REG_M_MASK 0x9C
274 #define LSM303DLHC_CRA_REG_M_DO0 (1 << 2)
275 #define LSM303DLHC_CRA_REG_M_DO1 (1 << 3)
276 #define LSM303DLHC_CRA_REG_M_DO2 (1 << 4)
277 #define LSM303DLHC_CRA_REG_M_TEMP_EN (1 << 7)
284 #define LSM303DLHC_CRB_REG_M_MASK 0xE0
285 #define LSM303DLHC_CRB_REG_M_GN_MASK 0xE0
286 #define LSM303DLHC_CRB_REG_M_GN0 (1 << 5)
287 #define LSM303DLHC_CRB_REG_M_GN1 (1 << 6)
288 #define LSM303DLHC_CRB_REG_M_GN2 (1 << 7)
295 #define LSM303DLHC_MR_REG_M_MASK 0x03
296 #define LSM303DLHC_MR_REG_M_MD0 (1 << 0)
297 #define LSM303DLHC_MR_REG_M_MD1 (1 << 1)
313 #if !defined(LSM303DLHC_USE_SPI) || defined(__DOXYGEN__)
314 #define LSM303DLHC_USE_SPI FALSE
323 #if !defined(LSM303DLHC_SHARED_SPI) || defined(__DOXYGEN__)
324 #define LSM303DLHC_SHARED_SPI FALSE
332 #if !defined(LSM303DLHC_USE_I2C) || defined(__DOXYGEN__)
333 #define LSM303DLHC_USE_I2C TRUE
342 #if !defined(LSM303DLHC_SHARED_I2C) || defined(__DOXYGEN__)
343 #define LSM303DLHC_SHARED_I2C FALSE
351 #if !defined(LSM303DLHC_USE_ADVANCED) || defined(__DOXYGEN__)
352 #define LSM303DLHC_USE_ADVANCED FALSE
360 #if !(LSM303DLHC_USE_SPI ^ LSM303DLHC_USE_I2C)
361 #error "LSM303DLHC_USE_SPI and LSM303DLHC_USE_I2C cannot be both true or both false"
364 #if LSM303DLHC_USE_SPI && !HAL_USE_SPI
365 #error "LSM303DLHC_USE_SPI requires HAL_USE_SPI"
368 #if LSM303DLHC_SHARED_SPI && !SPI_USE_MUTUAL_EXCLUSION
369 #error "LSM303DLHC_SHARED_SPI requires SPI_USE_MUTUAL_EXCLUSION"
372 #if LSM303DLHC_USE_I2C && !HAL_USE_I2C
373 #error "LSM303DLHC_USE_I2C requires HAL_USE_I2C"
376 #if LSM303DLHC_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION
377 #error "LSM303DLHC_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION"
383 #if LSM303DLHC_USE_SPI
384 #error "LSM303DLHC over SPI still not supported"
555 #if LSM303DLHC_USE_ADVANCED || defined(__DOXYGEN__)
589 #if LSM303DLHC_USE_ADVANCED || defined(__DOXYGEN__)
600 #define _lsm303dlhc_methods_alone \
602 msg_t (*acc_set_full_scale)(LSM303DLHCDriver *devp, \
603 lsm303dlhc_acc_fs_t fs); \
605 msg_t (*comp_set_full_scale)(LSM303DLHCDriver *devp, \
606 lsm303dlhc_comp_fs_t fs); \
611 #define _lsm303dlhc_methods \
612 _base_object_methods \
613 _lsm303dlhc_methods_alone
627 #define _lsm303dlhc_data \
630 lsm303dlhc_state_t state; \
632 const LSM303DLHCConfig *config; \
636 float accsensitivity[LSM303DLHC_ACC_NUMBER_OF_AXES]; \
638 float accbias[LSM303DLHC_ACC_NUMBER_OF_AXES]; \
640 float accfullscale; \
644 float compsensitivity[LSM303DLHC_COMP_NUMBER_OF_AXES];\
646 float compbias[LSM303DLHC_COMP_NUMBER_OF_AXES]; \
677 #define lsm303dlhcAccelerometerGetAxesNumber(devp) \
678 accelerometerGetAxesNumber(&((devp)->acc_if))
698 #define lsm303dlhcAccelerometerReadRaw(devp, axes) \
699 accelerometerReadRaw(&((devp)->acc_if), axes)
720 #define lsm303dlhcAccelerometerReadCooked(devp, axes) \
721 accelerometerReadCooked(&((devp)->acc_if), axes)
737 #define lsm303dlhcAccelerometerSetBias(devp, bp) \
738 accelerometerSetBias(&((devp)->acc_if), bp)
752 #define lsm303dlhcAccelerometerResetBias(devp) \
753 accelerometerResetBias(&((devp)->acc_if))
769 #define lsm303dlhcAccelerometerSetSensitivity(devp, sp) \
770 accelerometerSetSensitivity(&((devp)->acc_if), sp)
784 #define lsm303dlhcAccelerometerResetSensitivity(devp) \
785 accelerometerResetSensitivity(&((devp)->acc_if))
802 #define lsm303dlhcAccelerometerSetFullScale(devp, fs) \
803 (devp)->vmt->acc_set_full_scale(devp, fs)
814 #define lsm303dlhcCompassGetAxesNumber(devp) \
815 compassGetAxesNumber(&((devp)->comp_if))
835 #define lsm303dlhcCompassReadRaw(devp, axes) \
836 compassReadRaw(&((devp)->comp_if), axes)
857 #define lsm303dlhcCompassReadCooked(devp, axes) \
858 compassReadCooked(&((devp)->comp_if), axes)
874 #define lsm303dlhcCompassSetBias(devp, bp) \
875 compassSetBias(&((devp)->comp_if), bp)
889 #define lsm303dlhcCompassResetBias(devp) \
890 compassResetBias(&((devp)->comp_if))
906 #define lsm303dlhcCompassSetSensitivity(devp, sp) \
907 compassSetSensitivity(&((devp)->comp_if), sp)
921 #define lsm303dlhcCompassResetSensitivity(devp) \
922 compassResetSensitivity(&((devp)->comp_if))
939 #define lsm303dlhcCompassSetFullScale(devp, fs) \
940 (devp)->vmt->comp_set_full_scale(devp, fs)
Structure representing an I2C driver.
#define _lsm303dlhc_data
LSM303DLHCDriver specific data.
lsm303dlhc_acc_ae_t
LSM303DLHC accelerometer subsystem axes enabling.
@ LSM303DLHC_COMP_ODR_220HZ
@ LSM303DLHC_COMP_FS_4P0GA
I2CDriver * i2cp
I2C driver associated to this LSM303DLHC.
float * compsensitivity
LSM303DLHC compass initial sensitivity.
lsm303dlhc_acc_lp_t
LSM303DLHC accelerometer subsystem low power mode.
BaseCompass comp_if
Base compass interface.
float * compbias
LSM303DLHC compass initial bias.
lsm303dlhc_comp_fs_t
LSM303DLHC compass subsystem full scale.
@ LSM303DLHC_ACC_ODR_100Hz
lsm303dlhc_acc_fs_t accfullscale
LSM303DLHC accelerometer subsystem initial full scale.
lsm303dlhc_acc_lp_t acclowpower
LSM303DLHC accelerometer subsystem low power mode.
@ LSM303DLHC_ACC_ODR_1620Hz
@ LSM303DLHC_ACC_LP_DISABLED
@ LSM303DLHC_ACC_BDU_CONT
@ LSM303DLHC_COMP_FS_2P5GA
@ LSM303DLHC_ACC_BDU_BLOCK
@ LSM303DLHC_COMP_ODR_1P5HZ
@ LSM303DLHC_COMP_ODR_30HZ
@ LSM303DLHC_COMP_MD_SLEEP
@ LSM303DLHC_COMP_FS_8P1GA
@ LSM303DLHC_COMP_ODR_7P5HZ
lsm303dlhc_acc_bdu_t
LSM303DLHC accelerometer subsystem block data update.
@ LSM303DLHC_COMP_FS_5P6GA
Base accelerometer class.
lsm303dlhc_state_t
Driver state machine possible states.
@ LSM303DLHC_ACC_ODR_200Hz
@ LSM303DLHC_COMP_FS_1P3GA
@ LSM303DLHC_ACC_END_LITTLE
Generic accelerometer interface header.
lsm303dlhc_comp_odr_t
LSM303DLHC compass subsystem output data rate.
#define _lsm303dlhc_methods
LSM303DLHC specific methods with inherited ones.
@ LSM303DLHC_COMP_MD_BLOCK
LSM303DLHC configuration structure.
@ LSM303DLHC_COMP_FS_1P9GA
lsm303dlhc_acc_end_t accendianess
LSM303DLHC accelerometer endianness.
void lsm303dlhcStop(LSM303DLHCDriver *devp)
Deactivates the LSM303DLHC Complex Driver peripheral.
lsm303dlhc_comp_md_t
LSM303DLHC compass subsystem working mode.
@ LSM303DLHC_ACC_ODR_1344Hz
@ LSM303DLHC_COMP_FS_4P7GA
@ LSM303DLHC_ACC_LP_ENABLED
float * accbias
LSM303DLHC accelerometer subsystem initial bias.
@ LSM303DLHC_ACC_ODR_50Hz
const I2CConfig * i2ccfg
I2C configuration associated to this LSM303DLHC.
LSM303DLHC 6-axis accelerometer/compass class.
lsm303dlhc_acc_odr_t accoutdatarate
LSM303DLHC accelerometer subsystem output data rate.
@ LSM303DLHC_ACC_HR_ENABLED
lsm303dlhc_comp_odr_t compoutputdatarate
LSM303DLHC compass subsystem output data rate.
lsm303dlhc_comp_fs_t compfullscale
LSM303DLHC compass subsystem initial full scale.
@ LSM303DLHC_COMP_ODR_0P75HZ
@ LSM303DLHC_COMP_ODR_3P0HZ
lsm303dlhc_acc_hr_t
LSM303DLHC accelerometer subsystem high resolution mode.
lsm303dlhc_acc_fs_t
LSM303DLHC accelerometer subsystem full scale.
lsm303dlhc_acc_hr_t acchighresmode
LSM303DLHC accelerometer subsystem high resolution mode.
@ LSM303DLHC_ACC_ODR_10Hz
Generic compass interface header.
@ LSM303DLHC_COMP_ODR_15HZ
@ LSM303DLHC_ACC_HR_DISABLED
lsm303dlhc_acc_bdu_t accblockdataupdate
LSM303DLHC accelerometer subsystem block data update.
lsm303dlhc_comp_md_t compmode
LSM303DLHC compass subsystem working mode.
const struct LSM303DLHCVMT * vmt
Virtual Methods Table.
LSM303DLHC virtual methods table.
@ LSM303DLHC_COMP_ODR_75HZ
BaseAccelerometer acc_if
Base accelerometer interface.
void lsm303dlhcStart(LSM303DLHCDriver *devp, const LSM303DLHCConfig *config)
Configures and activates LSM303DLHC Complex Driver peripheral.
float * accsensitivity
LSM303DLHC accelerometer subsystem initial sensitivity.
@ LSM303DLHC_ACC_ODR_400Hz
lsm303dlhc_acc_end_t
LSM303DLHC accelerometer endianness.
lsm303dlhc_acc_odr_t
LSM303DLHC accelerometer subsystem output data rate.
@ LSM303DLHC_ACC_AE_DISABLED
Type of I2C driver configuration structure.
@ LSM303DLHC_COMP_MD_CONT
void lsm303dlhcObjectInit(LSM303DLHCDriver *devp)
Initializes an instance.
@ LSM303DLHC_ACC_ODR_25Hz