Skip to content

Commit 0dcd8a4

Browse files
committed
Complete LIS3MDL implementation.
1 parent 92e8c33 commit 0dcd8a4

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

lis3mdl.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include "lis3mdl.h"
2+
#include <stdexcept>
3+
4+
void lis3mdl::handle::open(const comm_config & config)
5+
{
6+
if (!config.use_sensor)
7+
{
8+
throw std::runtime_error("LIS3MDL configuration is null.");
9+
}
10+
11+
this->config = config;
12+
i2c.open(config.i2c_bus_name);
13+
}
14+
15+
void lis3mdl::handle::write_reg(reg_addr addr, uint8_t value)
16+
{
17+
i2c.write_two_bytes(config.i2c_address, addr, value);
18+
}
19+
20+
void lis3mdl::handle::enable()
21+
{
22+
if (config.device == LIS3MDL)
23+
{
24+
// OM = 11 (ultra-high-performance mode for X and Y); DO = 100 (10 Hz ODR)
25+
write_reg(CTRL_REG1, 0b01110000);
26+
27+
// FS = 00 (+/- 4 gauss full scale)
28+
write_reg(CTRL_REG2, 0b00000000);
29+
30+
// MD = 00 (continuous-conversion mode)
31+
write_reg(CTRL_REG3, 0b00000000);
32+
33+
// OMZ = 11 (ultra-high-performance mode for Z)
34+
write_reg(CTRL_REG4, 0b00001100);
35+
}
36+
}
37+
38+
void lis3mdl::handle::read()
39+
{
40+
uint8_t block[6];
41+
i2c.write_byte_and_read(config.i2c_address,
42+
0x80 | OUT_X_L, block, sizeof(block));
43+
m[0] = (int16_t)(block[0] | block[1] << 8);
44+
m[1] = (int16_t)(block[2] | block[3] << 8);
45+
m[2] = (int16_t)(block[4] | block[5] << 8);
46+
}

lis3mdl.h

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,27 @@ namespace lis3mdl
1818

1919
enum reg_addr
2020
{
21-
WHO_AM_I = 0x0F,
21+
WHO_AM_I = 0x0F,
22+
23+
CTRL_REG1 = 0x20,
24+
CTRL_REG2 = 0x21,
25+
CTRL_REG3 = 0x22,
26+
CTRL_REG4 = 0x23,
27+
CTRL_REG5 = 0x24,
28+
29+
STATUS_REG = 0x27,
30+
OUT_X_L = 0x28,
31+
OUT_X_H = 0x29,
32+
OUT_Y_L = 0x2A,
33+
OUT_Y_H = 0x2B,
34+
OUT_Z_L = 0x2C,
35+
OUT_Z_H = 0x2D,
36+
TEMP_OUT_L = 0x2E,
37+
TEMP_OUT_H = 0x2F,
38+
INT_CFG = 0x30,
39+
INT_SRC = 0x31,
40+
INT_THS_L = 0x32,
41+
INT_THS_H = 0x33,
2242
};
2343

2444
struct comm_config {
@@ -33,9 +53,16 @@ namespace lis3mdl
3353
public:
3454
void open(const comm_config &);
3555

56+
void enable();
57+
58+
void write_reg(reg_addr addr, uint8_t value);
59+
60+
void read();
61+
62+
int32_t m[3];
63+
3664
protected:
3765
i2c_bus i2c;
38-
i2c_addr address;
39-
device_type device;
66+
comm_config config;
4067
};
4168
};

0 commit comments

Comments
 (0)