I have Tiva firmware that is periodically (every ~200ms) reading a few different devices on a single I2C Bus. We often see the SCL and SDA lines on the bus remain high despite the fact that the Tiva firmware continues executing the code that does the I2C reads. A scope screenshot is shown below of when the SCL and SDA transition from working fine to staying high indefinitely.
What's odd about this is that the I2C peripheral is configured as open drain, we're using pullup resistors on the SCL and SDA lines yet we never see either of the lines go low despite, as mentioned, that the firmware continues doing the periodic I2C reads calling TivaWare functions like I2CMasterSlaveAddrSet, I2CMasterDataPut, I2CMasterSlaveAddrSet, I2CMasterControl and I2CMasterDataGet.
After we see the SCL and SDA remain high indefinitely, I've examined the I2C channel's I2CMCS register (see second image below) and see some very conflicting states. For example, the bus is both busy and idle at the same time.
Additionally, we've added the ability to trigger some "reset logic" on demand. This reset logic will disable the I2C peripheral, change the SDA and SCL pins to GPIO and attempt to reset the I2C bus according to Analog Devices AN-686 application note (basically a bit bang reset to free the bus) and then switch back to I2C. This works, but usually just a second or two later it will return to the previous state where both SCL and SDA lines remain high indefinitely.
Any thoughts anyone might have on this issue would be appreciated.