Electronic – I2C hanging after 2 minutes

i2c

Background Information

I am designing a small PCB for 4* I2C devices, the baud rate of the I2C is not a major issue so 100kHz was the target. The I2C devices are a RTC, LM75, 24AA04 and a MSP23017 to drive an LCD, the board is made using a LPKF milling machine. Before fully populating the board I thought I would test one of the devices and the LM75 seemed like the easiest option.
Quick edit: VCC is 5V and the Pull-Ups are both 10K

Have included some images to give you an idea of the layout:

1st image shows the PCB top view (Address jumpers to the top right, all grounded for testing)
enter image description here

2nd image shows the I2C traces, the grid dimension shown is 1.27mm (J11 to the left is connected to the OS pin, but left floating at the moment)
enter image description here

The Issue

I am testing this with an Arduino Uno (5V VDD) with some very simple code that polls the LM75 every second. Establish a valid reading is intermittant but once established it works fine for about 2 minutes and then hangs, both I2C lines go high. To establish a link again I have found sending an alternative slave address a few times and reverting back to the correct address usually works, then the same thing will happen.

Again I have some more images as capture the handshaking on my oscilloscope:

3rd image shows the setup (not the best I know, ignore the resistors by the jumpers originally fitted 1k's here and the inserted shorting links as per the 1st image))
enter image description here

4th image shows the first oscilloscope trace with valid data and some visible cross talk (circled in red), is this level of cross talk worth worrying about?
Good post I was reading on this subject At what point does crosstalk on I2C become a problem?
enter image description here

5th image is just a smaller time base so the waveform can be seen in more detail
enter image description here

Would be really interested in any advice possible, I probably need to re-work the board but any suggestions on testing would be great. I have read a few post and was under the impression I2C on these lengths and low speeds should be ok, but quite sure I have made a rookie mistake!

Thanks in-advance,
Ant

—-UPDATE—-

I found the issue eventually a week or so ago but not had time to post an update until now. I was convinced it was my PCB but it turns out that I was only requesting 1 byte from the LM75A, when I needed to request 2.

All the pointers on the hardware where incredibly useful, these allowed me to improve the design and I eventually settled on 2k2 pull-ups, which improved the I2C waveform (image below).

enter image description here

I accepted the only answer and also some of the comments as all proved useful.

Best Answer

The small glitches you're seeing towards the ends of the last two bytes might be due to the master releasing the line so the slave can ACK. If that's the case, it's not crosstalk, it's just something that happens with I2C. It shouldn't be a problem.

I second the suggestion to try stiffer pull-ups and add a bypass capacitor to the LM75 if there's room for one. If this is a homemade circuit board, you should also measure the trace resistances to verify that the connection is good. You could also try reducing the bit rate. If that doesn't help, use your scope to look at the last transfer before the fail. A non-auto triggering mode will do this. Determine whether it was ACKed or NAKed or something else. Try to figure out how many transfers it takes to produce the fail. Is it the same number every time? Does polling more often than once per second make the system fail sooner?