I2C Bus Lockup / Reset

I discovered a situation where the I2C bus locks up on my Argon OS v4.0.0. I am taking steps to eliminate the cause of the bus lockup, but once it occurs a power cycle is the only way to recover. Trying to be considerate of the edge case where this could happen again, I want a way to recover from this state without a power cycle (these are devices are installed in remote locations)

In refrence to : I2C can lock up Boron

One solution is to place all my devices on a switched power bus. Unfortunately, adding that bus to the current board design would be very difficult.

Is there another strategy to resolve a locked-up I2C bus through software? I was hoping a Wire.reset() would break whatever loop the library was stuck in, but it does not.

Any sugestions appreciated.

The more I look at this, if the issue is due to a device that uses clock stretching I am not sure it’s possible for the master to recover. That device could lock up the bus by holding the clock low. Only a power reset (or pin reset if it has one) of the errant device would do it…I think.

I am using an SHT30 temperature sensor and I can create a situation where the slave device gets stuck holding the clock low and only a power reset can resolve it.

It looks like Wire.reset() should be able to be called in that circumstance, and it does a lot to try to free the bus:

If that’s not working, then the only alternative is probably to pull the power to the sensor.

Agreed, if the master can fix it Wire.reset() should work. However, I am now finding that I can get the SHT30 in a state where it keeps the SCL low with no way to recover from the master.

-AP