i2cdevlib icon indicating copy to clipboard operation
i2cdevlib copied to clipboard

Hang in i2cdevlib when using ESP32 Board Manager v 2.0.2

Open mahboud opened this issue 3 years ago • 3 comments

I'm not sure if this is a bug in the i2clib or in the board manager code.

I only installed the minimum set of libraries I needed in my Arduino folder:

hardware: espressif

libraries: ArduinoJson I2Cdev MPU6050

And in the board manager, I picked the ESP32 by Espressif board but at version 1.0.6.

I build my project and it works. This is what the console looks like when things work:

Hello!!! prep MPU in prep: in prep: b4 Begin prepareMPU getIntEnabled: 64 getIntMotionStatus: 0 getIntMotionStatus should be reset by previous read: 0 Testing device connections...MPU6050 connection successful Writing mode: 0 end of prep MPUBoot number: 1 Wakeup was not caused by deep sleep: 0 Setup ESP32 to sleep for every 20 Seconds About to sleep Going to sleep now

Now, I go and change the ESP32 by Espressif board support to version 2.0.2.

I build and run, and this is what I get in the console:

Hello!!! prep MPU in prep: in prep: b4

Ok, so where is it stuck? This is what the code looks like:


#include <MPU6050.h>
#include <Wire.h>

MPU6050 accelgyro;
int ledPin = 27;

void prepareMPU() {

  Wire.begin();
  Serial.print("in prep: ");

  pinMode(ledPin, OUTPUT);
  Serial.println("in prep: b4 ");
  accelgyro.initialize();
  Serial.println("Begin prepareMPU");

  bool mode = accelgyro.getInterruptMode();
  if (mode) {
    Serial.println("interrupt mode set");
  }

MPU6050 is the library from Jeff Rowberg. Same with I2Cdev library. Could this be a bug in either of those libraries? Or is this a bug in the 2.0.2 board support?

The hang is at

accelgyro.initialize();

this is the code from initialize():

void MPU6050_Base::initialize() {
    setClockSource(MPU6050_CLOCK_PLL_XGYRO);
    setFullScaleGyroRange(MPU6050_GYRO_FS_250);
    setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
    setSleepEnabled(false); // thanks to Jack Elston for pointing this one out!
}

Tracing it, I go through setCLockSource() and thenwritebits() and then readByte() and then readBytes():

i1I2C (0x68) reading 1 bytes from 0x6B...

It gets stuck in this loop:

for (int k = 0; k < length; k += min((int)length, I2CDEVLIB_WIRE_BUFFER_LENGTH)) {
                useWire->beginTransmission(devAddr);
                useWire->send(regAddr);
                useWire->endTransmission();
                useWire->beginTransmission(devAddr);
                useWire->requestFrom((uint8_t)devAddr, (uint8_t)min((int)length - k, I2CDEVLIB_WIRE_BUFFER_LENGTH));

                for (; useWire->available() && (timeout == 0 || millis() - t1 < timeout); count++) {
                    data[count] = useWire->receive();
                    #ifdef I2CDEV_SERIAL_DEBUG
                        Serial.print(data[count], HEX);
                        if (count + 1 < length) Serial.print(" ");
                    #endif
                }

                useWire->endTransmission();
            }

Specifically it gets stuck in
useWire->requestFrom((uint8_t)devAddr, (uint8_t)min((int)length - k, I2CDEVLIB_WIRE_BUFFER_LENGTH));

I believe the code for requestFrom() is in the Espressif hardware folder. I don't know if I should go tracing in there, or whether the problem isn't that deep.

If I switch back to board support 1.0.6, it starts to work again. I'd love to know where I should start poking around to figure out what is happening. I'd prefer to use the latest board support if at all possible.

mahboud avatar Mar 05 '22 08:03 mahboud

same as #670, looks like the issue is in the wire library. will do some more debugging later.

mp-se avatar May 06 '22 15:05 mp-se

As posted here: https://github.com/espressif/arduino-esp32/issues/6674

Run pio upgrade --dev to the latest developer version and then change platform.ini platform = [email protected]

If you are in fact using an esp32 board.

i164j9 avatar May 09 '22 03:05 i164j9

I use an ESP32-C3 this is not supported in 3.5.0 https://github.com/platformio/platform-espressif32/releases

for normal ESP32 platform = [email protected] also works fine

Armageddit avatar May 15 '22 12:05 Armageddit