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)
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)
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))
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?
5th image is just a smaller time base so the waveform can be seen in more detail
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
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).
I accepted the only answer and also some of the comments as all proved useful.