Magnetometer
3-Axis Digital Compass IC HMC5883L

- Datasheet
- SLAVE ADDRESS:
0x1E - Supported Speeds: 100kbps and 400kbp
Setup
i2c_peripheral_disable(I2C1);
i2c_reset(I2C1);
i2c_set_standard_mode(I2C1); // 100 khz
i2c_set_clock_frequency(I2C1, I2C_CR2_FREQ_36MHZ);
i2c_set_trise(I2C1, 36);
i2c_set_dutycycle(I2C1, I2C_CCR_DUTY_DIV2);
i2c_set_ccr(I2C1, 180);
i2c_peripheral_enable(I2C1);
Read Device ID
uint8_t cmd{10};
char data[3]{};
i2c_transfer7(I2C1, 0x1E, &cmd, 1, (uint8_t*)data, 3);
// data = 'H43'
Continous Read Mode
// Setup
{
uint8_t write[2] {0x00, 0x70}; // 8-average, 15 Hz default, normal measurement
i2c_transfer7(I2C1, 0x1E, write, 2, nullptr, 0);
}
{
uint8_t write[2] {0x01, 0xA0}; // Gain=5
i2c_transfer7(I2C1, 0x1E, write, 2, nullptr, 0);
}
{
uint8_t write[2] {0x02, 0x00}; // Continuous-measurement mode
i2c_transfer7(I2C1, 0x1E, write, 2, nullptr, 0);
}
// Read inside a loop
typedef struct {
int16_t x;
int16_t z;
int16_t y;
} Measurement;
uint8_t write[1] {0x03};
Measurement measurement{};
i2c_transfer7(I2C1, 0x1E, write, 1, (uint8_t*)&measurement, sizeof(Measurement));