45#define EX_LIS3MDL_VERSION "1.1.3"
50#define EX_LIS3MDL_MAJOR 1
55#define EX_LIS3MDL_MINOR 1
60#define EX_LIS3MDL_PATCH 3
70#define LIS3MDL_COMP_NUMBER_OF_AXES 3U
72#define LIS3MDL_COMP_4GA 4.0f
73#define LIS3MDL_COMP_8GA 8.0f
74#define LIS3MDL_COMP_12GA 12.0f
75#define LIS3MDL_COMP_16GA 16.0f
77#define LIS3MDL_COMP_SENS_4GA 0.00014615f
78#define LIS3MDL_COMP_SENS_8GA 0.00029231f
79#define LIS3MDL_COMP_SENS_12GA 0.0004384f
80#define LIS3MDL_COMP_SENS_16GA 0.00058445f
82#define LIS3MDL_COMP_BIAS 0.0f
89#define LIS3MDL_DI_MASK 0xFF
90#define LIS3MDL_DI(n) (1 << n)
91#define LIS3MDL_AD_MASK 0x3F
92#define LIS3MDL_AD(n) (1 << n)
93#define LIS3MDL_MS (1 << 6)
94#define LIS3MDL_RW (1 << 7)
96#define LIS3MDL_SUB_MS (1 << 7)
103#define LIS3MDL_AD_WHO_AM_I 0x0F
104#define LIS3MDL_AD_CTRL_REG1 0x20
105#define LIS3MDL_AD_CTRL_REG2 0x21
106#define LIS3MDL_AD_CTRL_REG3 0x22
107#define LIS3MDL_AD_CTRL_REG4 0x23
108#define LIS3MDL_AD_CTRL_REG5 0x24
109#define LIS3MDL_AD_STATUS_REG 0x27
110#define LIS3MDL_AD_OUT_X_L 0x28
111#define LIS3MDL_AD_OUT_X_H 0x29
112#define LIS3MDL_AD_OUT_Y_L 0x2A
113#define LIS3MDL_AD_OUT_Y_H 0x2B
114#define LIS3MDL_AD_OUT_Z_L 0x2C
115#define LIS3MDL_AD_OUT_Z_H 0x2D
116#define LIS3MDL_AD_TEMP_OUT_L 0x2E
117#define LIS3MDL_AD_TEMP_OUT_H 0x2F
118#define LIS3MDL_AD_INT_CFG 0x30
119#define LIS3MDL_AD_INT_SOURCE 0x31
120#define LIS3MDL_AD_INT_THS_L 0x32
121#define LIS3MDL_AD_INT_THS_H 0x33
128#define LIS3MDL_CTRL_REG1_MASK 0xFF
129#define LIS3MDL_CTRL_REG1_ST (1 << 0)
130#define LIS3MDL_CTRL_REG1_FAST_ODR (1 << 1)
131#define LIS3MDL_CTRL_REG1_DO0 (1 << 2)
132#define LIS3MDL_CTRL_REG1_DO1 (1 << 3)
133#define LIS3MDL_CTRL_REG1_DO2 (1 << 4)
134#define LIS3MDL_CTRL_REG1_OM0 (1 << 5)
135#define LIS3MDL_CTRL_REG1_OM1 (1 << 6)
136#define LIS3MDL_CTRL_REG1_TEMP_EN (1 << 7)
143#define LIS3MDL_CTRL_REG2_MASK 0x6C
144#define LIS3MDL_CTRL_REG2_SOFT_RST (1 << 2)
145#define LIS3MDL_CTRL_REG2_REBOOT (1 << 3)
146#define LIS3MDL_CTRL_REG2_FS_MASK 0x60
147#define LIS3MDL_CTRL_REG2_FS0 (1 << 5)
148#define LIS3MDL_CTRL_REG2_FS1 (1 << 6)
155#define LIS3MDL_CTRL_REG3_MASK 0x27
156#define LIS3MDL_CTRL_REG3_MD0 (1 << 0)
157#define LIS3MDL_CTRL_REG3_MD1 (1 << 1)
158#define LIS3MDL_CTRL_REG3_SIM (1 << 2)
159#define LIS3MDL_CTRL_REG3_LP (1 << 5)
166#define LIS3MDL_CTRL_REG4_MASK 0x0E
167#define LIS3MDL_CTRL_REG4_BLE (1 << 1)
168#define LIS3MDL_CTRL_REG4_OMZ0 (1 << 2)
169#define LIS3MDL_CTRL_REG4_OMZ1 (1 << 3)
176#define LIS3MDL_CTRL_REG5_MASK 0xC0
177#define LIS3MDL_CTRL_REG5_BDU (1 << 6)
178#define LIS3MDL_CTRL_REG5_FAST_READ (1 << 7)
194#if !defined(LIS3MDL_USE_SPI) || defined(__DOXYGEN__)
195#define LIS3MDL_USE_SPI FALSE
204#if !defined(LIS3MDL_SHARED_SPI) || defined(__DOXYGEN__)
205#define LIS3MDL_SHARED_SPI FALSE
213#if !defined(LIS3MDL_USE_I2C) || defined(__DOXYGEN__)
214#define LIS3MDL_USE_I2C TRUE
223#if !defined(LIS3MDL_SHARED_I2C) || defined(__DOXYGEN__)
224#define LIS3MDL_SHARED_I2C FALSE
232#if !defined(LIS3MDL_USE_ADVANCED) || defined(__DOXYGEN__)
233#define LIS3MDL_USE_ADVANCED FALSE
241#if !(LIS3MDL_USE_SPI ^ LIS3MDL_USE_I2C)
242#error "LIS3MDL_USE_SPI and LIS3MDL_USE_I2C cannot be both true or both false"
245#if LIS3MDL_USE_SPI && !HAL_USE_SPI
246#error "LIS3MDL_USE_SPI requires HAL_USE_SPI"
249#if LIS3MDL_SHARED_SPI && !SPI_USE_MUTUAL_EXCLUSION
250#error "LIS3MDL_SHARED_SPI requires SPI_USE_MUTUAL_EXCLUSION"
253#if LIS3MDL_USE_I2C && !HAL_USE_I2C
254#error "LIS3MDL_USE_I2C requires HAL_USE_I2C"
257#if LIS3MDL_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION
258#error "LIS3MDL_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION"
265#error "LIS3MDL over SPI still not supported"
391#if (LIS3MDL_USE_SPI) || defined(__DOXYGEN__)
401#if (LIS3MDL_USE_I2C) || defined(__DOXYGEN__)
431#if LIS3MDL_USE_ADVANCED || defined(__DOXYGEN__)
462#define _lis3msl_methods_alone \
464 msg_t (*comp_set_full_scale)(LIS3MDLDriver *devp, lis3mdl_comp_fs_t fs);
469#define _lis3mdl_methods \
470 _base_object_methods \
471 _lis3msl_methods_alone
485#define _lis3mdl_data \
488 lis3mdl_state_t state; \
490 const LIS3MDLConfig *config; \
494 float compsensitivity[LIS3MDL_COMP_NUMBER_OF_AXES]; \
496 float compbias[LIS3MDL_COMP_NUMBER_OF_AXES]; \
525#define lis3mdlCompassGetAxesNumber(devp) \
526 compassGetAxesNumber(&((devp)->comp_if))
546#define lis3mdlCompassReadRaw(devp, axes) \
547 compassReadRaw(&((devp)->comp_if), axes)
568#define lis3mdlCompassReadCooked(devp, axes) \
569 compassReadCooked(&((devp)->comp_if), axes)
585#define lis3mdlCompassSetBias(devp, bp) \
586 compassSetBias(&((devp)->comp_if), bp)
600#define lis3mdlCompassResetBias(devp) \
601 compassResetBias(&((devp)->comp_if))
617#define lis3mdlCompassSetSensitivity(devp, sp) \
618 compassSetSensitivity(&((devp)->comp_if), sp)
632#define lis3mdlCompassResetSensitivity(devp) \
633 compassResetSensitivity(&((devp)->comp_if))
650#define lis3mdlCompassSetFullScale(devp, fs) \
651 (devp)->vmt->comp_set_full_scale(devp, fs)
Generic compass interface header.
struct hal_i2c_config I2CConfig
Type of a structure representing an I2C configuration.
struct hal_i2c_driver I2CDriver
Type of a structure representing an I2C driver.
void lis3mdlStart(LIS3MDLDriver *devp, const LIS3MDLConfig *config)
Configures and activates LIS3MDL Complex Driver peripheral.
lis3mdl_comp_lp_t
LIS3MDL low power mode configuration.
lis3mdl_comp_md_t
LIS3MDL conversion mode.
lis3mdl_end_t
LIS3MDL endianness.
lis3mdl_comp_omz_t
LIS3MDL operation mode for Z axis.
lis3mdl_temp_t
LIS3MDL temperature sensor enabling.
lis3mdl_bdu_t
LIS3MDL block data update.
void lis3mdlObjectInit(LIS3MDLDriver *devp)
Initializes an instance.
void lis3mdlStop(LIS3MDLDriver *devp)
Deactivates the LIS3MDL Complex Driver peripheral.
lis3mdl_comp_odr_t
LIS3MDL output data rate.
lis3mdl_comp_fs_t
LIS3MDL full scale.
#define _lis3mdl_methods
LIS3MDL specific methods with inherited ones.
lis3mdl_sad_t
LIS3MDL slave address.
lis3mdl_state_t
Driver state machine possible states.
#define _lis3mdl_data
LIS3MDLDriver specific data.
lis3mdl_comp_omxy_t
LIS3MDL operation mode for X and Y axes.
@ LIS3MDL_COMP_LP_ENABLED
@ LIS3MDL_COMP_LP_DISABLED
@ LIS3MDL_COMP_MD_POWER_DOWN
@ LIS3MDL_COMP_MD_CONTINUOUS
@ LIS3MDL_COMP_OMZ_MEDIUM
@ LIS3MDL_COMP_ODR_0_625HZ
@ LIS3MDL_COMP_ODR_1_25HZ
@ LIS3MDL_COMP_OMXY_MEDIUM
@ LIS3MDL_COMP_OMXY_ULTRA
struct hal_spi_config SPIConfig
Type of a SPI driver configuration structure.
struct hal_spi_driver SPIDriver
Type of a structure representing an SPI driver.
LIS3MDL configuration structure.
SPIDriver * spip
SPI driver associated to this LIS3MDL.
lis3mdl_comp_lp_t complpwrmode
LIS3MDL compass subsystem low power mode configuration.
lis3mdl_comp_fs_t compfullscale
LIS3MDL compass subsystem full scale.
lis3mdl_comp_md_t compconvmode
LIS3MDL compass subsystem conversion mode.
lis3mdl_sad_t slaveaddress
LIS3MDL slave address.
const SPIConfig * spicfg
SPI configuration associated to this LIS3MDL.
lis3mdl_end_t endianness
LIS3MDL endianness.
lis3mdl_comp_omz_t compopmodez
LIS3MDL compass subsystem operation mode for Z axis.
const I2CConfig * i2ccfg
I2C configuration associated to this LIS3MDL.
lis3mdl_comp_omxy_t compopmodexy
LIS3MDL compass subsystem operation mode for X and Y axes.
float * compbias
LIS3MDL compass subsystem initial bias.
float * compsensitivity
LIS3MDL compass subsystem initial sensitivity.
lis3mdl_comp_odr_t compodr
LIS3MDL compass subsystem output data rate.
I2CDriver * i2cp
I2C driver associated to this LIS3MDL.
lis3mdl_bdu_t bdu
LIS3MDL block data update.
LIS3MDL 3-axis compass class.
const struct LIS3MDLVMT * vmt
Virtual Methods Table.
BaseCompass comp_if
Base compass interface.
LIS3MDL virtual methods table.