My I2C slave is not pulling down the bus all the way for the ACK.
I have tried replacing 1.5k pullup with 10k pullup, but the ACK voltage remains the same (1.6V).
System Voltage: 2.5V
Master: STM32L151
Slave: NXP NT3H211
I have confirmed that the NT3H2211 is recognizing its address, because when I send another address (0x56 instead of 0x55), I see no response. (See screenshot).
I have confirmed that the NT3H2211 has a good ground and power supply, stable during the I2C access.
I have also ruled out an I2C peripheral issue on the master by writing a bit-bang rutine with the same result.
In this situation, how to proceed?
Best Answer
@DoxyLover and the others are right: the master was pulling up, causing driver contention. My mistakes were:
Assuming that configuring the I2C peripheral (alternate function in STM jargon) would automatically set SDA as open drain.
In my bit-banging code, configuring the wrong port for open drain (leaving SDA still push-pull and leading me to believe that the master was not the issue).
Assuming that the functional state of the NT3H2211 does not change during testing. Once I corrected the open drain issue, I saw no ACK at all! It turned out the NT3H2211 failed somewhere along the way. Swapping the NT3H2211, and running the corrected code, fixed the problem.