Other Parts Discussed in Thread: TMS320DM8168
Tool/software: Linux
Hello,
Background:
On our board we use TPS40400 buck controller as 1.1V source for the TMS320DM8168.
The TMS320DM8168 processor controls TPS40400 via I2C bus (PMBus interface).
Using a dedicated script, I have scheduled a device reset during the time TMS320DM8168 configures the TPS40400.
Means, the device reset comes during an I2C transaction between TMS320DM8168 (master) to TPS40400 (slave).
Occasionally (not always) after this reset, the TMS320DM8168 reports on the following error message describing communication error with TPS40400:
"SCSI subsystem initialized
omap_i2c omap_i2c.1: bus 1 rev4.0 at 100 kHz
omap_i2c omap_i2c.1: timeout waiting for bus ready
set_machine_constraints: failed to enable pmbus_vr
pmbus 1-0012: failed to register pmbus
pmbus: probe of 1-0012 failed with error -110"
Further investigation shows it happens since I2C SDA between TMS320DM8168 to TPS40400 stuck on low because of the reset mentioned above.
Means, at the times the reset comes when SDA='0', the SDA was stuck on this state, the TMS320DM8168 identify the I2C bus as "not ready" and reports the error message.
The TPS40400 I2C transmitter state must return to the idle state, waiting for a new master (TMS320DM8168) command.
(The I2C SCL is high after the reset as expected).
In other words, it was observed that if the board gets reset while I2C transaction between TMS320DM8168 and TPS40400 the SDA line remains stuck low until power cycle.
Unlike TMS320DM8168, the TPS40400 does not have reset input.
How can we to cause TPS40400 to release SDA line to high without power cycle?
I have made also a simple experiment in LAB:
a. I've reproduced the failure.
b. I shorted (momentarily) the SCL to GND (in order to generate a dummy I2C clock, hopefully it will release SDA signal).
c. Thankfully, as an immediate respone, the SDA changed polarity to logic high (the I2C channel is back on "start condition" state - SCL,SDA = high logic).
d. I have scheduled again my device reset.
e. No failure anymore
My questions are:
1. How to recover from I2C SDA stuck low on TMS320DM8168/TPS40400 (PMBus interface between TMS320DM8168 to TPS40400) as a robust and formal solution, without power cycle?
2. Is there a way to reset the I2C bus between TMS320DM8168 to TPS40400 (PMBus interface)? means, to bring it to "start condition" state - SCL,SDA = high logic.
3. In our reset case mentioned above, is there a way to return the TPS40400 I2C transmitter state to the idle state, waiting for a new master command?
Regards,
Daniel Daniel