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(®_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