60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
#include "i2c.h"
|
|
#include "QMC5883L.h"
|
|
|
|
bool QMC5883L_init(void)
|
|
{
|
|
return i2c_write_reg(QMC5883L_I2C_ADDR, QMC5883L_SETRES_REG, 0x01);
|
|
}
|
|
|
|
float QMC5883L_get_temperature(void)
|
|
{
|
|
uint8_t data;
|
|
int16_t raw_temp;
|
|
|
|
i2c_read_reg(QMC5883L_I2C_ADDR, QMC5883L_TEMP_MSB_REG, &data);
|
|
|
|
raw_temp = data << 8;
|
|
|
|
i2c_read_reg(QMC5883L_I2C_ADDR, QMC5883L_TEMP_LSB_REG, &data);
|
|
|
|
raw_temp |= data;
|
|
|
|
return (float) raw_temp / 100.0;
|
|
}
|
|
|
|
bool QMC5883L_is_data_available(void)
|
|
{
|
|
uint8_t data;
|
|
|
|
i2c_read_reg(QMC5883L_I2C_ADDR, QMC5883L_STATUS_REG, &data);
|
|
|
|
return data & QMC5883L_DRDY_BIT ? true : false;
|
|
}
|
|
|
|
QMC5883L_MData_t QMC5883L_get_MFields(void)
|
|
{
|
|
uint8_t data[6];
|
|
QMC5883L_MData_t Mdata = {.MFieldX = -1, .MFieldY = -1, .MFieldZ = -1};
|
|
|
|
if(i2c_read(QMC5883L_I2C_ADDR, QMC5883L_DATA_X_LSB_REG, data, sizeof data))
|
|
{
|
|
Mdata.MFieldX = (data[1] << 8) | data[0];
|
|
Mdata.MFieldY = (data[3] << 8) | data[2];
|
|
Mdata.MFieldZ = (data[5] << 8) | data[4];
|
|
}
|
|
|
|
return Mdata;
|
|
}
|
|
|
|
bool QMC5883L_set_power_mode(QMC5883L_Mode_Control_e MC)
|
|
{
|
|
uint8_t data;
|
|
|
|
if(!i2c_read_reg(QMC5883L_I2C_ADDR, QMC5883L_CTRL1_REG, &data))return false;
|
|
|
|
data &= 0xFC;
|
|
data |= MC;
|
|
|
|
return i2c_write_reg(QMC5883L_I2C_ADDR, QMC5883L_CTRL1_REG, data);
|
|
}
|