26#include <interfaces/endianness.h>
33 unsigned short samplingRate,
GyroFSR gyroFsr,
35 : spiSlave(bus, cs, config), samplingRate(samplingRate), gyroFsr(gyroFsr),
53 LOG_ERR(logger,
"Already initialized");
62 miosix::Thread::sleep(100);
70 LOG_ERR(logger,
"Invalid WHO AM I");
78 enableMpuI2CMasterInterface();
88 setAccelFsr(accelFsr);
91 setSampleRate(samplingRate);
93 LOG_DEBUG(logger,
"Magnetometer sensitivity adjustment: {}, {}, {}",
94 magSensAdjCoeff[0], magSensAdjCoeff[1], magSensAdjCoeff[2]);
120 normalizeAcceleration(swapBytes16(rawData.bits.accelX));
122 normalizeAcceleration(swapBytes16(rawData.bits.accelY));
124 normalizeAcceleration(swapBytes16(rawData.bits.accelZ));
125 data.
temperature = normalizeTemperature(swapBytes16(rawData.bits.temp));
126 data.
angularSpeedX = normalizeGyroscope(swapBytes16(rawData.bits.gyroX));
127 data.
angularSpeedY = normalizeGyroscope(swapBytes16(rawData.bits.gyroY));
128 data.
angularSpeedZ = normalizeGyroscope(swapBytes16(rawData.bits.gyroZ));
130 normalizeMagnetometer(rawData.bits.magX, magSensAdjCoeff[0]);
132 normalizeMagnetometer(rawData.bits.magY, magSensAdjCoeff[1]);
134 normalizeMagnetometer(rawData.bits.magZ, magSensAdjCoeff[2]);
139void MPU9250::resetDevice()
146void MPU9250::selectAutoClock()
148 SPITransaction transaction(spiSlave);
154void MPU9250::setGyroFsr(GyroFSR fs)
156 SPITransaction transaction(spiSlave);
161void MPU9250::setAccelFsr(AccelFSR fs)
163 SPITransaction transaction(spiSlave);
168void MPU9250::setSampleRate(
unsigned short rate)
172 else if (rate > 1000)
175 uint8_t data = 1000 / rate - 1;
177 SPITransaction transaction(spiSlave);
188void MPU9250::enableMpuI2CMasterInterface()
190 SPITransaction transaction(spiSlave);
195void MPU9250::setMpuI2CMasterInterfaceClock(I2CMasterInterfaceClock clk)
197 SPITransaction transaction(spiSlave);
202void MPU9250::setI2CMasterSlaveRead(uint8_t addr, uint8_t reg, uint8_t nBytes,
205 uint8_t regSlvAddr, regSlvReg, regSlvCtrl;
232 "invalid slave parameter in function "
233 "setI2CMasterSlaveRead");
237 SPITransaction transaction(spiSlave);
239 writeSPIWithDelay(transaction, regSlvAddr, addr | 0x80);
240 writeSPIWithDelay(transaction, regSlvReg, reg);
246void MPU9250::setI2CMasterSlaveWrite(uint8_t addr, uint8_t reg, uint8_t data,
249 uint8_t regSlvAddr, regSlvReg, regSlvCtrl, regSlvDo;
280 "invalid slave parameter in function "
281 "setI2CMasterSlaveRead");
285 SPITransaction transaction(spiSlave);
287 writeSPIWithDelay(transaction, regSlvAddr, addr);
288 writeSPIWithDelay(transaction, regSlvReg, reg);
289 writeSPIWithDelay(transaction, regSlvDo, data);
295void MPU9250::disableI2CMasterSlave(uint8_t slave)
321 "invalid slave parameter in function "
322 "setI2CMasterSlaveRead");
326 SPITransaction transaction(spiSlave);
329 writeSPIWithDelay(transaction, regSlvCtrl, 0);
332uint8_t MPU9250::readFromAk(uint8_t reg)
338 miosix::Thread::sleep(1);
340 SPITransaction transaction(spiSlave);
345void MPU9250::writeToAk(uint8_t reg, uint8_t data)
349 miosix::Thread::sleep(1);
352bool MPU9250::initAk()
363 miosix::Thread::sleep(1);
369 if (!checkAkWhoAmI())
371 LOG_ERR(logger,
"Invalid AK8963 WHO AM I");
403bool MPU9250::checkWhoAmI()
405 SPITransaction transaction(spiSlave);
407 uint8_t whoAmIValue = transaction.readRegister(
REG_WHO_AM_I);
412bool MPU9250::checkAkWhoAmI()
419void MPU9250::writeSPIWithDelay(SPITransaction& transaction, uint8_t reg,
422 transaction.writeRegister(reg, data);
428float MPU9250::normalizeAcceleration(int16_t rawValue)
430 return static_cast<float>(rawValue) / 32768.0f *
435float MPU9250::normalizeTemperature(int16_t rawValue)
437 return static_cast<float>(rawValue) / 512.0f + 21.0f;
440float MPU9250::normalizeGyroscope(int16_t rawValue)
442 return static_cast<float>(rawValue) / 32768.0f *
446float MPU9250::normalizeMagnetometer(int16_t rawValue,
float adjustmentCoeff)
449 return static_cast<float>(rawValue) * adjustmentCoeff;
#define LOG_ERR(logger,...)
#define LOG_DEBUG(logger,...)
const float GYROSCOPE_FS_MAP[4]
static constexpr uint8_t REG_WHO_AM_I_VAL
static constexpr uint8_t REG_I2C_SLV_CTRL_EN
static constexpr uint8_t AK8963_REG_CNTL1_FUSE_ROM_ACCESS_MODE
static constexpr uint8_t AK8963_REG_WHO_AM_I_VAL
MPU9250(SPIBusInterface &bus, miosix::GpioPin cs, SPIBusConfig config=getDefaultSPIConfig(), unsigned short samplingRate=100, GyroFSR gyroFsr=GYRO_FSR_250DPS, AccelFSR accelFsr=ACCEL_FSR_2G)
Instantiates the driver.
static constexpr uint8_t REG_USER_CTRL_I2C_MST_EN
static constexpr uint8_t REG_PWR_MGMT_1_BIT_H_RESET
static constexpr uint8_t REG_CONFIG_DLPF_CFG_1
static constexpr uint8_t AK8963_REG_CNTL1_CONT_MES_MODE_2
bool init() override
Initialize the device.
static constexpr uint8_t AK8963_REG_CNTL1_POWER_DOWN_MODE
static constexpr uint8_t REG_PWR_MGMT_1_CLKSEL_AUTO
const float ACCELERATION_FS_MAP[4]
static constexpr uint8_t AK8963_ADDR
MPU9250Data sampleImpl() override
Read a data sample from the sensor. In case of errors, the method should return the last available co...
static SPIBusConfig getDefaultSPIConfig()
Constructs the default config for SPI Bus.
static constexpr uint8_t AK8963_REG_CNTL2_BIT_SRST
Interface for low level access of a SPI bus as a master.
Provides high-level access to the SPI Bus for a single transaction.
void readRegisters(uint8_t reg, uint8_t *data, size_t size)
Reads multiple bytes starting from the specified register.
uint64_t getTimestamp()
Returns the current timer value in microseconds.
This file includes all the types the logdecoder script will decode.
uint64_t accelerationTimestamp
uint64_t angularSpeedTimestamp
uint64_t magneticFieldTimestamp
SPI Bus configuration for a specific slave.
SPI::ClockDivider clockDivider
< Peripheral clock division
uint64_t temperatureTimestamp