Adafruit ICM-20649 Library für 20648 anpassen

ds-000192-icm-20649-v1.0.pdf (1,3 MB)
DS-000179-ICM-20648-v11-TYP.pdf (2,9 MB)
Adafruit_ICM20648.cpp (21,7 KB)
Adafruit_ICM20648.h (6,9 KB)
adafruit_icm20648_test.ino (3,7 KB)

Hallo zusammen,

ich versuche einen ICM-20648 mit einem ESP32 auszulesen. Dafür habe ich die Library von Adafruit für den ICM-20649 kopiert und die I2C-Standard-Adresse sowie die Chip-IP auf den 20648 geändert. Zudem habe ich die Register-Maps beider Chips verglichen und konnte sonst keine Unterschiede entdecken. Außerdem konnte ich den Chip via i2c-Scanner auf der Adresse 0x69 finden.

#include <Adafruit_ICM20648.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_ICM20648 icm;
uint16_t measurement_delay_us = 65535; // Delay between measurements for testing

void setup(void) {
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit ICM20648 test!");
 delay(1000);
  // Try to initialize!
  while (!icm.begin_I2C()) {
    Serial.println("Failed to find ICM20648 chip");
    
      delay(100);
    
  }

Leider klappt schon icm.begin_I2C() nicht.
In der Library ist die Methode in der Cpp-Datei so aufgebaut:

bool Adafruit_ICM20648::begin_I2C(uint8_t i2c_address, TwoWire *wire,
                                  int32_t sensor_id) {

  if (i2c_dev) {
    delete i2c_dev; // remove old interface
  }

  i2c_dev = new Adafruit_I2CDevice(i2c_address, wire);

  if (!i2c_dev->begin()) {
    Serial.println("I2C begin Failed");
    return false;
  }

  return _init(sensor_id);
}

Nach weiterem Suchen habe ich festgestellt, dass er die falsche ID in der init Methode erhält:

bool Adafruit_ICM20648::_init(int32_t sensor_id) {

  Adafruit_BusIO_Register chip_id = Adafruit_BusIO_Register(
      i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, ICM20648_WHOAMI);

  Adafruit_BusIO_Register reg_bank_sel = Adafruit_BusIO_Register(
      i2c_dev, spi_dev, ADDRBIT8_HIGH_TOREAD, ICM20648_REG_BANK_SEL);

  Adafruit_BusIO_RegisterBits bank =
      Adafruit_BusIO_RegisterBits(&reg_bank_sel, 2, 4);
  _setBank(0);

  // make sure we're talking to the right chip
  if (chip_id.read() != ICM20648_CHIP_ID) {
    return false;
  }
(...)

  return true;
}

chip_id.read() gibt 0 zurück. Wenn ich das Datenblatt richtig verstanden habe, müsste da eigentlich 0xE0 zurückkommen.
Wäre jemand so gütig und könnte mal draufschauen und mir helfen, mein Problem zu lösen`

Viele Grüße
weoiss

Bitte lies dies hier, damit du deine Frage hier richtig reinstellst.

Ich habe nochmal weiter gesucht und meine Ausführungen erweitert. Ich hoffe, jetzt ist verständlicher, was mein Problem ist.