18 #define _AUTO_INC_REG 0x80
19 #define _REG_TEMP_OUT_L 0x05
20 #define _REG_TEMP_OUT_H 0x06
22 #define _REG_STATUS_M 0x07
24 #define _REG_OUT_X_L_M 0x08
25 #define _REG_OUT_X_H_M 0x09
26 #define _REG_OUT_Y_L_M 0x0A
27 #define _REG_OUT_Y_H_M 0x0B
28 #define _REG_OUT_Z_L_M 0x0C
29 #define _REG_OUT_Z_H_M 0x0D
31 #define _REG_WHO_AM_I 0xF
32 #define _REG_WHO_AM_I_LSM303D_ID 0x49
34 #define _REG_CTRL1 0x20
35 #define _REG_CTRL1_A_ODR_SHIFT 4
36 #define _REG_CTRL1_A_ORD_MASK 0xF0
37 #define _REG_CTRL1_BDU 0x40
39 #define _REG_CTRL2 0x21
40 #define _REG_CTRL2_ABW_SHIFT 6
41 #define _REG_CTRL2_ABW_MASK 0xC0
42 #define _REG_CTRL2_AFS_SHIFT 3
43 #define _REG_CTRL2_AFS_MASK 0x38
44 #define _REG_CTRL2_AST 0x02
47 #define _REG_CTRL5 0x24
48 #define _REG_CTRL5_TEMP_EN 0x80
49 #define _REG_CTRL5_M_RES_HIGH 0x60
50 #define _REG_CTRL5_M_RES_LOW 0x00
51 #define _REG_CTRL5_M_RES_MASK 0x60
52 #define _REG_CTRL5_M_ODR_SHIFT 2
53 #define _REG_CTRL5_M_ORD_MASK 0x1C
56 #define _REG_CTRL6 0x25
57 #define _REG_CTRL6_MFS_SHIFT 5
58 #define _REG_CTRL6_MFS_MASK 0x60
61 #define _REG_CTRL7 0x26
62 #define _REG_CTRL7_AHPM_MASK 0xC0
63 #define _REG_CTRL7_AHPM_SHIFT 6
64 #define _REG_CTRL7_AFDS 0x20
65 #define _REG_CTRL7_T_ONLY 0x10
66 #define _REG_CTRL7_MD_SHIFT 0
67 #define _REG_CTRL7_MLP 0x4
68 #define _REG_CTRL7_MD_MASK 0x3
72 #define _REG_OUT_X_L_A 0x28
73 #define _REG_OUT_X_H_A 0x29
74 #define _REG_OUT_Y_L_A 0x2A
75 #define _REG_OUT_Y_H_A 0x2B
76 #define _REG_OUT_Z_L_A 0x2C
77 #define _REG_OUT_Z_H_A 0x2D
81 bool lsm303DReadTemp(
I2C_Device * dev, uint8_t addr, uint16_t * temp)
84 if (!
i2cReadReg(dev, addr, _REG_TEMP_OUT_L | _AUTO_INC_REG , data,
sizeof(data)))
98 if (reg_val == _REG_WHO_AM_I_LSM303D_ID)
109 if (!
i2cReadReg(dev, addr, _REG_OUT_X_L_M | _AUTO_INC_REG, data,
sizeof(data)))
121 if (!
i2cReadReg(dev, addr, _REG_OUT_X_L_A | _AUTO_INC_REG, data,
sizeof(data)))
134 t = config.
hiRes ? _REG_CTRL5_M_RES_HIGH : _REG_CTRL5_M_RES_LOW;
135 t |= (config.
magRate << _REG_CTRL5_M_ODR_SHIFT) & _REG_CTRL5_M_ORD_MASK;
137 if (!
_lsm303RmwReg(dev, addr, _REG_CTRL5, t, _REG_CTRL5_M_RES_MASK | _REG_CTRL5_M_ORD_MASK))
140 t = (config.
magScale << _REG_CTRL6_MFS_SHIFT) & _REG_CTRL6_MFS_MASK;
145 t = (config.
magMode << _REG_CTRL7_MD_SHIFT) & _REG_CTRL7_MD_MASK;
146 t |= config.
lowPower ? _REG_CTRL7_MLP : 0;
148 if (!
_lsm303RmwReg(dev, addr, _REG_CTRL7, t, _REG_CTRL7_MD_MASK | _REG_CTRL7_MLP))
158 t = (config.
accRate << _REG_CTRL1_A_ODR_SHIFT) & _REG_CTRL1_A_ORD_MASK;
160 if (!
_lsm303RmwReg(dev, addr, _REG_CTRL1, t, _REG_CTRL1_A_ORD_MASK))
163 t = (config.
accAAF << _REG_CTRL2_ABW_SHIFT) & _REG_CTRL2_ABW_MASK;
164 t |= (config.
accScale << _REG_CTRL2_AFS_SHIFT) & _REG_CTRL2_AFS_MASK;
165 if (config.
selfTest) t |= _REG_CTRL2_AST;
170 t = (config.
accHPF << _REG_CTRL7_AHPM_SHIFT) & _REG_CTRL7_AHPM_MASK;
171 if (config.
filterAcc) t |= _REG_CTRL7_AFDS;
173 if (!
_lsm303RmwReg(dev, addr, _REG_CTRL7, t, _REG_CTRL7_AFDS | _REG_CTRL7_AHPM_MASK))
184 if (config.bdu) t = _REG_CTRL1_BDU;
else t = 0;
186 if (!
_lsm303RmwReg(dev, addr, _REG_CTRL1, t, _REG_CTRL1_BDU))
190 if (config.
temp) t = _REG_CTRL5_TEMP_EN;
else t = 0;
192 if (!
_lsm303RmwReg(dev, addr, _REG_CTRL5, t, _REG_CTRL5_TEMP_EN))
195 if (config.
tempOnly) t |= _REG_CTRL7_T_ONLY;
else t = 0;
197 if (!
_lsm303RmwReg(dev, addr, _REG_CTRL7, t, _REG_CTRL7_T_ONLY))
uint16_t accAAF
Anti-alias filter, one of LSM303D_ACCAAF_*.
Axis structure for 3D information.
uint8_t magMode
Magnetic sensor mode selection, LSM303D_MAGMODE_*.
uint16_t accScale
Accelerometer scale, one of LSM303D_ACCSCALE_*.
bool filterAcc
Filter acceleration data.
bool lsm303DMagnetCfg(I2C_Device *dev, uint8_t addr, Lsm303DMagCfg config)
Set the Magnet configuration.
bool _lsm303RmwReg(I2C_Device *dev, uint8_t addr, uint8_t reg, uint8_t val, uint8_t mask)
Internal function shared for both LSM303 drivers.
Generic LSM303D configuration.
bool hiRes
High resolution.
bool selfTest
Enabled self-test.
uint16_t accRate
Accelerometer rate , one of LSM303D_ACCRATE_*.
uint8_t magRate
Magnet rate, use one of LSM303D_MAGRATE_*.
static uint16_t _lsm303RawDataToI16(uint8_t *data)
Function shared for both LSM303 drivers.
void _lsm303RawDataToAxis(uint8_t *data, Lsm303Axis *axis)
Internal function shared for both LSM303 drivers.
Accelerator configuration structure.
bool lsm303DAccelRead(I2C_Device *dev, uint8_t addr, Lsm303Axis *result)
Read the accelerometer information.
bool tempOnly
!< Temperature sensor (coupled to magnet)
Structure defines OpenCores I2C Device.
bool lowPower
Magnet in low power mode.
bool temp
!< Block data update
bool i2cReadReg(I2C_Device *dev, i2cAddr addr, uint8_t regNo, uint8_t *rd, int rdLen)
Reads from the I2C device register.
bool i2cWriteReg(I2C_Device *dev, i2cAddr addr, uint8_t regNo, uint8_t *wr, int wrLen)
Writes to the I2C device register.
bool lsm303DValid(I2C_Device *dev, uint8_t addr, bool *isLSM303)
Checks whether or not the LSM303D is valid.
bool lsm303DMagnetRead(I2C_Device *dev, uint8_t addr, Lsm303Axis *result)
Read the magnet information.
uint16_t accHPF
High-pass filter, one of LSM303D_ACCHPF_*.
bool lsm303DAccelCfg(I2C_Device *dev, uint8_t addr, Lsm303DAccCfg config)
Set the accelerometer configuration.
static bool errRebase(const char *name)
Rebases the cause of the error message.
bool lsm303DCfg(I2C_Device *dev, uint8_t addr, Lsm303DCfg config)
Sets the generic device configuration parameters.
Driver for the ST LSM303Dx Compass sensor.
uint8_t magScale
Magnet scale, use one of LSM303D_MAGSCALEE_*.