10

After some reading/testing I managed to make stable communication between 2 devices using I2C with FTP CAT5 copper twisted pair cable.

  • Green wire - SCL
  • White/green wire - GND
  • Blue wire - SDA
  • White/blue wire - GND

GND is connected only at one cable end, I2C bus clock is at 10Khz and I have used 10Kom pullup resistors to VCC

It works well and stable. When I decided to use other 2 pairs of the cable for power (+12V), it stopped working. I tested +12V on one pair GND on the other pair, also +12V/GND on same pair: same result, it stopped working. Whole I2C bus stopped working, other devices attached to it too.

Wonder if I can use same cable or go to safest choice - another cable for power.

Huisman
  • 10,594
  • 2
  • 19
  • 40
user3503519
  • 99
  • 1
  • 5
  • 3
    Did you check that the power on the receiving side is fine enough? No glitches, no droops... CAT5 cables are quite thin, that is why PoE uses >40 V for power. – Vladimir Cravero Mar 25 '19 at 11:29
  • 4
    This is where you need an oscilloscope. Everything else will be (educated) guesswork. – pipe Mar 25 '19 at 12:47
  • 1
    I wouldn't twist SDA or SCL with GND because you don't want any capacitance between them. I would twist +12V with GND as you do want capacitance between them. What (return) current does the +12V have? (you might have ground bounce) – Huisman Mar 25 '19 at 12:51
  • 5
    GND is connected only at one cable end? Unless I am misunderstanding, that does not sound right. – user57037 Mar 25 '19 at 16:01
  • remotely related: [Memoirs of an overgrown I2C bus](http://reconvolution.blogspot.com/2014/11/memoirs-of-overgrown-i2c-bus.html) – Nick Alexeev Mar 25 '19 at 16:10
  • 1
    Did you mean [UTP](https://en.wikipedia.org/wiki/Twisted_pair#Unshielded_twisted_pair) cable? I'm sure it can be used for more protocols than just FTP ;) – Andrew Morton Mar 25 '19 at 19:03
  • Looks more like a ground shift than capacitance... – Ale..chenski Mar 25 '19 at 19:48
  • As far as I'm aware I2C is highly prone to interference and is in fact an application standard for use in PCB tracks for the least coupling possible. The fact 10 meters worked with any cable is already very impressive to me – lucasgcb Mar 26 '19 at 07:58
  • 1
    @AndrewMorton I'm assuming that OP meant Foiled Twisted Pair (with shielding). If your comment was a joke, it went over my head :) – Mr47 Mar 26 '19 at 09:45
  • @Mr47 Thanks, I didn't find that definition yesterday. I found UTP and STP, but not FTP in that context. – Andrew Morton Mar 26 '19 at 10:21

6 Answers6

16

Maybe overkill if it was working before, but an option is to use an I2C to Differential converter such as PCA9615, LTC4331, etc. If making the resistors smaller don't work or you need to extend the cable, consider not using I2C directly.

Not only the range will be extended but you will also have better noise immunity.

enter image description here enter image description here

Wesley Lee
  • 7,844
  • 6
  • 35
  • 53
  • 1
    Great answer, this is exactly what should be done, but of course it may be a radical change for the OP. – Jack Creasey Mar 25 '19 at 20:27
  • I mean, they are super easy to implement (if compared to moving to RS-485, CAN, etc), but yes compared to changing some resistors it is a radical change. – Wesley Lee Mar 25 '19 at 22:42
  • 1
    @JackCreasey OP's problem is not just cable capacitance, they seem to suffer from noise on 12V line they have added. Lowering pull-up resistors provides some extra noise immunity, but they can't keep lowering that resistance indefinitely. – Dmitry Grigoryev Mar 26 '19 at 07:38
  • @DmitryGrigoryev Since the OP gave no details I'm not sure how you could suggest that noise was being injected. I agree you can't just keep lowering the termination/pullup ….but the OP is too large by 10:1. – Jack Creasey Mar 26 '19 at 14:59
9

As I noted in a comment, it's hard to debug without an oscilloscope trace, but the first thing that stands out from your question is the 10 kOhm pull-up resistor. This is unusually high for I2C, although it could easily work in many cases.

I would try to lower them to 1 kOhm first, to see if it will affect anything. If it helps, you can gradually make them higher, although doing so will impact your rise-time.

pipe
  • 13,748
  • 5
  • 42
  • 72
  • 10 k\$\Omega\$ isn't that big for an I2C bus on 10 kHz, though? (Or should it be 100 kHz OP?) – Huisman Mar 25 '19 at 13:33
  • @Huisman Two good points. 10 kOhm wouldn't worry me at 10 kHz on a normal PCB but maybe it's not enough over the cable. And 10 kHz is unusual but not crazy unusual I guess. – pipe Mar 25 '19 at 13:53
  • 7
    10k Ohm is huge for I2C over any distance. That is the primary problem the OP has. – Jack Creasey Mar 25 '19 at 15:06
  • 1
    I guess it is better to split the resistors and use one on each end. 2 pullup-resistors @4.7kΩ, one on each end, should be a better choice than a single 2.2kΩ pullup-resistors. – 12431234123412341234123 Mar 25 '19 at 19:34
  • I will try lower the resistors, that is all that make sence for me after all that comments. – user3503519 Mar 26 '19 at 16:19
5

You absolutely need to drop your pullup resistors at long distances, and 10m is a long way and 10k Ohm is very high.

The value of the pullup resistor is related to three things:

  1. Cable capacitance
  2. Aiming voltage and Rx level sense.
  3. Speed

Try using any of the available calculators and start your reading here with the TI appnote on pullup values or here with the NXP I2C standard (7.1).

In terms of the problem you are having, it should be obvious that grounding additional pairs (12V,Gnd) in the cable will change the capacitance to the I2C signal wires.

Jack Creasey
  • 21,428
  • 2
  • 15
  • 29
  • 2
    I agree, CAT5 cable can be assumed to have about 50pF per meter so 10 meters exceed the 400pF capacitance limit of I2C specification. And reaching 400kHz I2C clock can't be achieved with 400pF capacitance by using the specified 3mA pull-up current from resistors. Fortunately, slowing speed down will help - unless the devices have a minimum clock speed limitation. We don't know what devices these are and what is the I2C bus voltages but indeed pullups should be adjusted to provide at least 3mA and if devices allow and agree on the bus low level voltage then even more. – Justme Mar 25 '19 at 19:19
  • Yes I gonna test with that, but my question is why it work if there is not power over that cable? – user3503519 Mar 26 '19 at 16:20
  • A floating cable pair does not have the same capacitance to your signal pair that it has when the cable is grounded. For your configuration both the +12 and the Gnd are essentially the same ….they have capacitance to the signal cable that impacts your risetime. . – Jack Creasey Mar 26 '19 at 16:25
2

A few notes:

Getting the right pull up values is vital, particularly for SDA. Different devices can sink different amounts of current. I have seen setups that generate extra 1s in the data because of a too small pull-up resistor, after switching to a smaller sensor chip. The smaller geometries meant it could not pull the bus down to a clean zero.

Speed kills. A long cable run is effectively a low pass LRC filter. For many I2C applications you can slow the clock way down without loosing anything. A slower clock can compensate for a weak pull-up and large capacitance (but not a too strong pull-up).

Long cable runs are an invitation to EMI. I have seen an I2C implementation that needed a ferrite clamp to pass immunity testing. End termination, shielded cable, or filters can help.

Beware parallel resistance. If you have a 1k pull-up at the master, and then a 1k at each of four client devices on the bus, well then you have a net 200 Ohm pull up. Not going to work.

1

The Sparkfun I2C breakout board is a nice solution that features:

PCA9615 buffer
I2C Supply voltage range 2.3-5.5V
Differential Supply voltage range 3-5.5V
draws 16µA of current
Extends I2C bus up to 100 feet
Data rate up to 400kHz
2x Qwiic Connectors

enter image description here

gatorback
  • 209
  • 2
  • 9
-1

First: I want to thank community for posting an answers.
Second: I have found a solution based on those answers, here is what I have done:

Tested lowering pullup resistors to 4.7K and 2K. On 2K i start to receive reponses from time to time, so I lower to 1K, then I start to receive responses, but part of data was missing from every single one of them. After that switched pullup resistor on SDA pin with 10K and everything start working stable.
So the solution in my case is 1K pullup on SCL and 10K on SDA.

Thank you for your time.

user3503519
  • 99
  • 1
  • 5
  • 1
    That's crazy though. What kind of hardware do you use here? Maybe something is misconfigured. – pipe Mar 27 '19 at 11:58
  • 1
    On one side it is ESP32 with micropython, on other side is atmega8 programmed with arduino IDE. I finally do not consider that as safe communication, so gonna switch to serial (RS232) , as I tested it works fine on those ranges – user3503519 Mar 27 '19 at 13:40
  • 1
    If I were you I would also take a look at RS-485 which would be even more robust and even simpler. Drawback is that it requires more signal wires but you already have a lot of those in your CAT5. – pipe Mar 27 '19 at 13:42
  • 1
    Well, i do not see how gonna directly implement RS-485 on atmega processor or ESP 32 without additional convertors&hardware so RS-232 is best choice here. Only one TTL level shifter gonna be used. – user3503519 Mar 28 '19 at 06:49