Guidance on pull-up resistors - Lots of sensors, a mux, and differential extenders

Hi. I’m no EE and feel like a noob asking about this, but I need guidance on what pull-up resistors to disconnect and which to keep on my system. The docs all contain a boilerplate suggestion, which, to me, is not very helpful.

Remember, each individual non-differential I2C bus needs at least one set of pull-up resistors enabled. Make sure you keep track of which devices have their I2C pull-ups enabled and which do not.

Here’s my system. As you can see it’s fairly complex (at least to me) and should all work. However, I have weird issues that are not deterministic and I strongly suspect I have my pull-up resistors incorrect.

[attachment=0]5slMPzS[1].png[/attachment]

Please help me understand where I should cut the PU resistors vs. leave them as-is?

This is kind of tricky, but luckily you can reverse any changes you make by re-soldering a blob onto the i2c pads if needed to re-connect them.

From the looks of it, I think you need to cut all the sensors’/relays’ pullups…and see how that goes? When you have a series that is this complicated, it might be best to make small changes and test as you go…see if you can put a pattern to it

I appreciate but don’t understand your reply. It seems like a pull-up resistor is either needed or it is not, depending on how the i2c controller on the device is set up.

It is the extenders and the mux that are the least clear to me. I think someone at SparkFun would have a definitive answer to this. I’ve spent a bunch of money on sparkfun products and would appreciate if someone could be more authoritative.

I’m pretty sure some of the flakey behavior is caused by mis-configured resistors. but with ~21 devices in the mix, the combinatorics of trying to “make small changes and test as I go” is simply not realistic!

Thanks.

Each i2c bus needs a pullup resistor (actually one on SDA and one on SCL; that’s why there is a pair of resistors on each board). Where it gets a bit tricky is figuring out what’s on an individual i2c bus. Looking at the schematics of the boards can help here (it’s under the Documents tab). In your design, there are three groups of i2c busses:

  • thing to mux

  • mux to expander

  • each expander to its devices is a separate i2c bus

It looks like the ESP32 Thing Plus does not have pullups. The mux has pullups on its inputs, so the i2c bus between the thing and the mux is OK.

The outputs of the mux has pullups. The i2c expanders also have pullups on their inputs (don’t worry about the differential i2c on the RJ45 cables between them - that’s different). I would disable the pullups on the expanders connected to the mux.

On the receiving end of the extenders, it looks like everything has pullups. I would keep the pullups on the receiving extenders and disable them on all of the devices connected to them.

In general, you can (depending on the values of the pullup resistors) have two sets of pullups on the i2c bus, but the more you have, the harder it gets for the i2c devices to pull the bus low. Note that with the exception of the mux, I believe that all boards with multiple QWIIC connectors just have them in parallel so they are part of the same bus,

/mike