What is happening when the SDA signal is held low by the MCU? Is there a way to detect and recover?
It is possible for the MCU to get into an erroneous state due to noise that appears as extra transitions on the I2C SCK. There is no hardware equivalent of SCL low timeout for the SDA signal. The failure can be detected in software by checking if the SDA pin is held low for an unreasonable amount of time. When this failure is detected, disabling and re-enabling the SMBus will fix the problem.