19 if (!i2c.
beginI2C(address, i2cPort, i2cSpeed))
79 if (!spi.
beginSPI(csPin, spiPort, spiSpeed))
115 Serial.println(
"I2C interface enabled");
147 uint8_t v = (bank & 0x03) << 4;
259 x = (int16_t)((raw[0] << 8) | raw[1]) / mg_per_lsb;
260 y = (int16_t)((raw[2] << 8) | raw[3]) / mg_per_lsb;
261 z = (int16_t)((raw[4] << 8) | raw[5]) / mg_per_lsb;
279 x = (int16_t)((raw[0] << 8) | raw[1]) / degree_per_second;
280 y = (int16_t)((raw[2] << 8) | raw[3]) / degree_per_second;
281 z = (int16_t)((raw[4] << 8) | raw[5]) / degree_per_second;
297 for (
int i = 0; i < 5; i++)
305 int16_t temp = (int16_t)((raw[0] << 8) | raw[1]);
308 temperature += temp / 333.87f + 21.0f;
328 if (buf[8] & 0x08)
return false;
330 int16_t mx = (int16_t)(buf[1] | (buf[2] << 8));
331 int16_t my = (int16_t)(buf[3] | (buf[4] << 8));
332 int16_t mz = (int16_t)(buf[5] | (buf[6] << 8));
373 for (i = 0; i < 10; i++)
428bool DevLab_ICM20948::writeSlave4(uint8_t reg, uint8_t value) {
439 uint32_t start = millis();
441 while (millis() - start < 20) {
449bool DevLab_ICM20948::readSlave4(uint8_t reg, uint8_t &value) {
459 uint32_t start = millis();
461 while (millis() - start < 20) {
536 if ((sampleRate < 4.3f) || (sampleRate > 1100.0f))
540 uint8_t v = (uint8_t)((1100.0f / sampleRate) - 1.0f);
570 sampleRate = 1100.0f / (1.0f + v);
621 dlpf = (v >> 3) & 0x07;
642 degree_per_second = 32768.0f / (250.0f * (1 << ((uint8_t)fullScale)));
707 if (sampleRate >= 1125)
711 uint16_t div = (1125.0f / sampleRate) - 1;
717 uint8_t msb = (uint8_t)((div >> 8) & 0x0F);
718 uint8_t lsb = (uint8_t)(div & 0xFF);
748 uint8_t msb = (uint8_t)((divisor >> 8) & 0x0F);
749 uint8_t lsb = (uint8_t)(divisor & 0xFF);
800 uint16_t div = ((msb & 0x0F) << 8) | lsb;
803 sampleRate = 1125.0f / (1.0f + div);
855 mg_per_lsb = 16384.0f / (1 << (uint8_t)fullScale);
928 dlpf = (v >> 3) & 0x07;
1038 gyro_on = ((v & 0x07) == 0);
1041 accel_on = ((v & 0x38) == 0);
1067 (uint8_t)(offsetX >> 8),
1068 (uint8_t)(offsetX & 0xFF),
1069 (uint8_t)(offsetY >> 8),
1070 (uint8_t)(offsetY & 0xFF),
1071 (uint8_t)(offsetZ >> 8),
1072 (uint8_t)(offsetZ & 0xFF)};
1098 offsetX = (int16_t)((data[0] << 8) | data[1]);
1099 offsetY = (int16_t)((data[2] << 8) | data[3]);
1100 offsetZ = (int16_t)((data[4] << 8) | data[5]);
1119 (uint8_t)(offsetX >> 8),
1120 (uint8_t)(offsetX & 0xFF),
1121 (uint8_t)(offsetY >> 8),
1122 (uint8_t)(offsetY & 0xFF),
1123 (uint8_t)(offsetZ >> 8),
1124 (uint8_t)(offsetZ & 0xFF)};
1150 offsetX = (int16_t)((data[0] << 8) | data[1]);
1151 offsetY = (int16_t)((data[2] << 8) | data[3]);
1152 offsetZ = (int16_t)((data[4] << 8) | data[5]);
1185 if (!bus)
return false;
1189 uint8_t reg0 = (cfg.
wofEn << 7) |
1200 uint8_t ovfMask = 0;
1201 for (uint8_t i = 0; i < 5; i++)
1202 ovfMask |= (cfg.
fifoOvfEn[i] ? BIT(i) : 0);
1207 for (uint8_t i = 0; i < 5; i++)
1208 wmMask |= (cfg.
fifoWmEn[i] ? BIT(i) : 0);
1216 if (!bus)
return false;
1233 for (uint8_t i = 0; i < 5; i++)
1234 status.
fifoOvf[i] = (raw[2] & BIT(i)) ? 1 : 0;
1237 for (uint8_t i = 0; i < 5; i++)
1238 status.
fifoWm[i] = (raw[3] & BIT(i)) ? 1 : 0;
1284 uint8_t timeout = 50;
1288 if (--timeout == 0)
return false;
1312 uint8_t timeout = 50;
1316 if (--timeout == 0)
return false;
1346 uint8_t timeout = 50;
1350 if (--timeout == 0)
return false;
1392 uint8_t timeout = 50;
1396 if (--timeout == 0)
return false;
1413 raw = (uint16_t)(buf[0] | (buf[1] << 8)) & 0x0FFF;
#define I2C_MST_DELAY_CTRL
#define EXT_SLV_SENS_DATA_00
#define ACCEL_SMPLRT_DIV_2
#define I2C_MST_ODR_CONFIG
#define ACCEL_SMPLRT_DIV_1
#define STS_RAW_DATA_0_RDY_INT
#define USER_CTRL_I2C_MST_EN
bool readBit(uint8_t reg, uint8_t pos, uint8_t &value)
bool writeBits(uint8_t reg, uint8_t pos, uint8_t len, uint8_t value)
bool read(uint8_t reg, uint8_t &value)
bool write(uint8_t reg, uint8_t value)
bool writeBit(uint8_t reg, uint8_t pos, uint8_t value)
bool readBits(uint8_t reg, uint8_t pos, uint8_t len, 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)
bool beginI2C(uint8_t addr, TwoWire &wire, uint32_t speed, uint8_t sda=255, uint8_t scl=255)
bool beginSPI(uint8_t csPin, SPIClass &spiPort, uint32_t spiSpeed, uint8_t sck=255, uint8_t miso=255, uint8_t mosi=255) override
const ICM20948_Op_Mode opMode[]
Magnetometer operating modes tested by the sweep.