Other Parts Discussed in Thread: ADS1015, ISO1541
Tool/software:
I'm working with a design using an ADS1015BQDGSRQ1 at 5V with an ISO1541QDRQ1 to interface with a 3.3V bus with a TMS320F28386 as the I2C bus controller.
The ADS1015 is the only device on the bus and the TMS320 is the only controller. The clock rate is 100kHz
Intermittently, during I2C writes from the controller to the ADS1015, the ADS1015 appears to send an ACK early which interrupts the communication. I'm looking for troubleshooting help. Do you know what can cause this behavior?
Here is a schematic snip:
Since the TMS320 pulls SDA to 0V for a low signal while the ISO1541 V_OL is around 600mV, we can use that voltage difference to see when the ADS1015 is the device holding SDA low.
In the following examples, I show the intended communication as well as two failure cases I've observed. Due to the intermittent nature, I don't have proper screenshots, so I've recreated them manually.
Intended behavior when writing to the ADS1015 configuration register:
Failure case 1 - The ADS1015 sends an ACK 1 bit early:
When this happens, it looks like the ADS1015 pulls SDA low when the controller releases it to send a 1 as the final bit. The controller thinks it has lost arbitration of the bus and stops sending the clock.
Then, SDA is held low for about 27ms which is consistent with the ADS1015's bus-idle timeout period.
Failure case 2 - The ADS1015 sends an ACK half a cycle early:
In this case, the ADS1015 appears to send an ACK while SCL is high just after clocking in the last bit of the byte. To the controller, this looks like another controller sent a start condition.
Like the previous case, the controller thinks it has lost arbitration and ceases the clock output. The same bus-idle timeout applies.
When I did see these signals on an oscilloscope, noise levels were low. The supply voltages also appear stable.
Any insight into possible causes or prior experience with this kind of behavior would be helpful in troubleshooting.
I would also be interested in other explanations for this bus behavior.
Thanks