19 if (!i2c.beginI2C(address, i2cPort, i2cSpeed))
46 if (!bus->writeBit(
USER_CTRL, 4, (uint8_t)0x00))
73 if (!spi.beginSPI(csPin, spiPort, spiSpeed))
104 if (!bus->writeBit(
USER_CTRL, 4, (uint8_t)0x01))
138 uint8_t v = (bank & 0x03) << 4;
199 if (!bus->write(
LP_CONFIG, (uint8_t)0x00))
250 x = (int16_t)((raw[0] << 8) | raw[1]) / mg_per_lsb;
251 y = (int16_t)((raw[2] << 8) | raw[3]) / mg_per_lsb;
252 z = (int16_t)((raw[4] << 8) | raw[5]) / mg_per_lsb;
270 x = (int16_t)((raw[0] << 8) | raw[1]) / degree_per_second;
271 y = (int16_t)((raw[2] << 8) | raw[3]) / degree_per_second;
272 z = (int16_t)((raw[4] << 8) | raw[5]) / degree_per_second;
288 for (
int i = 0; i < 5; i++)
296 int16_t temp = (int16_t)((raw[0] << 8) | raw[1]);
299 temperature += temp / 333.87f + 21.0f;
321 int16_t mx = (int16_t)(buf[1] | (buf[2] << 8));
322 int16_t my = (int16_t)(buf[3] | (buf[4] << 8));
323 int16_t mz = (int16_t)(buf[5] | (buf[6] << 8));
363 for (i = 0; i < 10; i++)
413 writeSlave4(
AK_CNTL2, (uint8_t)opMode);
418bool DevLab_ICM20948::writeSlave4(uint8_t reg, uint8_t value)
442 uint32_t start = millis();
445 while (millis() - start < 10)
448 if (!(status & 0x80))
456bool DevLab_ICM20948::readSlave4(uint8_t reg, uint8_t &value)
474 uint32_t start = millis();
476 while (millis() - start < 10)
479 if (!(status & 0x80))
495 if (!bus->writeBit(
PWR_MGMT_1, 5, (uint8_t)enable))
553 if ((sampleRate < 4.3f) || (sampleRate > 1100.0f))
557 uint8_t v = (uint8_t)((1100.0f / sampleRate) - 1.0f);
587 sampleRate = 1100.0f / (1.0f + v);
638 dlpf = (v >> 3) & 0x07;
655 if (!bus->writeBits(
GYRO_CONFIG_1, 1, 2, (uint8_t)fullScale))
659 degree_per_second = 32768.0f / (250.0f * (1 << ((uint8_t)fullScale)));
724 if (sampleRate >= 1125)
728 uint16_t div = (1125.0f / sampleRate) - 1;
734 uint8_t msb = (uint8_t)((div >> 8) & 0x0F);
735 uint8_t lsb = (uint8_t)(div & 0xFF);
765 uint8_t msb = (uint8_t)((divisor >> 8) & 0x0F);
766 uint8_t lsb = (uint8_t)(divisor & 0xFF);
817 uint16_t div = ((msb & 0x0F) << 8) | lsb;
820 sampleRate = 1125.0f / (1.0f + div);
868 if (!bus->writeBits(
ACCEL_CONFIG, 1, 2, (uint8_t)fullScale))
872 mg_per_lsb = 16384.0f / (1 << (uint8_t)fullScale);
945 dlpf = (v >> 3) & 0x07;
1032 if (!bus->writeBit(
PWR_MGMT_1, 3, (uint8_t)!temp_on))
1055 gyro_on = ((v & 0x07) == 0);
1058 accel_on = ((v & 0x38) == 0);
1084 (uint8_t)(offsetX >> 8),
1085 (uint8_t)(offsetX & 0xFF),
1086 (uint8_t)(offsetY >> 8),
1087 (uint8_t)(offsetY & 0xFF),
1088 (uint8_t)(offsetZ >> 8),
1089 (uint8_t)(offsetZ & 0xFF)};
1115 offsetX = (int16_t)((data[0] << 8) | data[1]);
1116 offsetY = (int16_t)((data[2] << 8) | data[3]);
1117 offsetZ = (int16_t)((data[4] << 8) | data[5]);
1136 (uint8_t)(offsetX >> 8),
1137 (uint8_t)(offsetX & 0xFF),
1138 (uint8_t)(offsetY >> 8),
1139 (uint8_t)(offsetY & 0xFF),
1140 (uint8_t)(offsetZ >> 8),
1141 (uint8_t)(offsetZ & 0xFF)};
1167 offsetX = (int16_t)((data[0] << 8) | data[1]);
1168 offsetY = (int16_t)((data[2] << 8) | data[3]);
1169 offsetZ = (int16_t)((data[4] << 8) | data[5]);
1202 if (!bus)
return false;
1206 uint8_t reg0 = (cfg.
wofEn << 7) |
1211 if (!bus->write(
INT_ENABLE, reg0))
return false;
1217 uint8_t ovfMask = 0;
1218 for (uint8_t i = 0; i < 5; i++)
1219 ovfMask |= (cfg.
fifoOvfEn[i] ? BIT(i) : 0);
1224 for (uint8_t i = 0; i < 5; i++)
1225 wmMask |= (cfg.
fifoWmEn[i] ? BIT(i) : 0);
1233 if (!bus)
return false;
1238 if (!bus->read(
INT_STATUS, raw, 4))
return false;
1250 for (uint8_t i = 0; i < 5; i++)
1251 status.
fifoOvf[i] = (raw[2] & BIT(i)) ? 1 : 0;
1254 for (uint8_t i = 0; i < 5; i++)
1255 status.
fifoWm[i] = (raw[3] & BIT(i)) ? 1 : 0;
1266 if (!bus->writeBit(
INT_PIN_CFG, 1, (uint8_t)0))
return false;
1269 if (!bus->writeBit(
USER_CTRL, 5, (uint8_t)1))
return false;
1275 if (!bus->writeBits(
I2C_MST_CTRL, 0, 4, clkFreq))
return false;
1286 if (!bus->write(
I2C_SLV4_ADDR, (uint8_t)(slaveAddr & 0x7F)))
return false;
1301 uint8_t timeout = 50;
1305 if (--timeout == 0)
return false;
1329 uint8_t timeout = 50;
1333 if (--timeout == 0)
return false;
1351 if (!bus->write(
I2C_SLV4_ADDR, (uint8_t)(slaveAddr & 0x7F)))
return false;
1363 uint8_t timeout = 50;
1367 if (--timeout == 0)
return false;
1409 uint8_t timeout = 50;
1413 if (--timeout == 0)
return false;
1430 raw = (uint16_t)(buf[0] | (buf[1] << 8)) & 0x0FFF;
#define EXT_SLV_SENS_DATA_00
#define ACCEL_SMPLRT_DIV_2
#define ACCEL_SMPLRT_DIV_1
#define STS_RAW_DATA_0_RDY_INT
#define USER_CTRL_I2C_MST_EN
bool read(uint8_t reg, uint8_t &value)
bool write(uint8_t reg, uint8_t value)
bool readGyro(float &x, float &y, float &z)
bool setMagOpMode(ICM20948_Op_Mode opMode)
bool setDLPF(ICM20948_Gyro_DLPF dlpf, bool bypass)
bool auxWriteByte(uint8_t slaveAddr, uint8_t reg, uint8_t data)
bool setGyroDivRate(uint8_t divisor)
bool setClock(ICM20948_Clock_Source clock)
bool setAccelScale(ICM20948_Accel_FullScale fullScale)
bool auxReadByte(uint8_t slaveAddr, uint8_t reg, uint8_t &data)
bool applyBasicDefaults()
bool auxRead12bit(uint16_t &raw)
bool readAccel(float &x, float &y, float &z)
bool intEnableConfig(const ICM20948_IntEnableConfig &cfg)
bool getGyroOffset(int16_t &offsetX, int16_t &offsetY, int16_t &offsetZ)
bool beginSPI(uint8_t csPin, SPIClass &spiPort=SPI, uint32_t spiSpeed=1000000)
bool auxReadResponse(uint8_t slaveAddr, uint8_t &data)
bool getGyroScale(uint8_t &fullScale)
bool setAccelAveraging(ICM20948_Accel_Average avg)
bool checkIntStatus(ICM20948_IntStatus &status)
bool setGyroOffset(uint16_t offsetX, uint16_t offsetY, uint16_t offsetZ)
bool setGyroScale(ICM20948_Gyro_FullScale fullScale)
bool setLowPower(bool enable)
bool setGyroSampleRate(float sampleRate)
bool getGyroSampleRate(float &sampleRate)
bool setGyroAveraging(ICM20948_Gyro_Average avg)
bool setAccelOffset(int16_t offsetX, int16_t offsetY, int16_t offsetZ)
bool getSensors(bool &accel_on, bool &gyro_on, bool &temp_on)
bool readWhoAmI(uint8_t &whoAmI)
bool auxReadSensorData(uint8_t *buf, uint8_t len)
bool beginI2C(uint8_t address=0x69, TwoWire &i2cPort=Wire, uint32_t i2cSpeed=400000)
bool getAccelDLPF(uint8_t &dlpf, bool &bypass)
bool getLowPower(bool &enable)
bool selfTestGyro(bool x, bool y, bool z)
bool getAccelSampleRate(float &sampleRate)
bool readMag(float &x, float &y, float &z)
bool readTemperature(float &temperature)
bool selectBank(uint8_t bank)
bool auxMasterEnable(uint8_t clkFreq)
bool intInit(const ICM20948_IntPinConfig &cfg)
bool getDLPF(uint8_t &dlpf, bool &bypass)
bool auxConfigSlave(uint8_t slaveAddr, uint8_t reg, uint8_t numBytes)
bool auxWriteCommand(uint8_t slaveAddr, uint8_t cmd)
bool getClock(uint8_t &clock)
bool setAccelDLPF(uint8_t dlpf, bool bypass)
bool setAccelDivRate(uint16_t divisor)
bool getAccelScale(uint8_t &fullScale)
bool selfTestAccel(bool x, bool y, bool z)
bool getAccelAveraging(uint8_t &avg)
bool getAccelOffset(int16_t &offsetX, int16_t &offsetY, int16_t &offsetZ)
bool setSensors(bool accel_on, bool gyro_on, bool temp_on)
bool setAccelSampleRate(uint16_t sampleRate)