0
\$\begingroup\$

I am trying to connect many (~80) ToF distance sensors VL53L0X onto a single i2c bus. They have the default i2c address 0x52, which is programmable, but not persistent. Thus I have a choice between selective turn on/off of sensors (via GPIO expansion on i2c etc) and reprogram each individual address at startup, or have the addresses translated on-the-fly in hardware. This is about the second option.

There would be the translator T (something like LTC4316, but preferably one without voltage dividers) always between the sensor S and the bus, like this, each translator set for a different address, of course:

master ---+---+---+---+
          T   T   T   T
          S   S   S   S

Now I would like to be able to connect another identical modules like this one after another, but to prevent address clashes, each module would have a translator N at the beginning:

(--  module 1 --)     (--  module 2 --)      (--  module 3 --)

M---+---+---+---+ === M---+---+---+---+  === M---+---+---+---+
    T   T   T   T         T   T   T   T         T   T   T   T
    S   S   S   S         S   S   S   S         S   S   S   S

Module 1 would be translated by M, module 2 by MM, module 3 by MMM and so on, for example like this (with sensor address 0 for simplicity, T adding 1, M adding 4)

global address        4  5  6  7     8  9 10 11   12 13 14 15
module-level address  0  1  2  3     0  1  2  3    0  1  2  3
sensor address        0  0  0  0     0  0  0  0    0  0  0  0

I would like to have a comment whether this is a good way forward logically, whether it makes sense electrically and perhaps even a suggestion for IC similar to the LTC4316, with translation address selectable by pulling pins high/low.

\$\endgroup\$
  • \$\begingroup\$ What is the planned communication speed for the I2C? Are you planning to use the 400 kHz? What is the minimum communication speed you'll consider? \$\endgroup\$ – Harry Svensson Feb 15 '18 at 0:43
  • \$\begingroup\$ It should transfer low volumes of data, max perhaps 10Hz on each sensor, so max cca 1kHz readings on the entire bus, translating to maybe 10kbps of data rate. \$\endgroup\$ – eudoxos Feb 15 '18 at 9:23
2
\$\begingroup\$

It sounds expensive and resource intensive to have one address translator for each sensor. Perhaps you could use an I2C controlled analog switch instead, and just switch the SCL to each of the sensors so that they don't see any commands when disconnected.

For example, the Linear Tech LTC1380 is an 8:1 I2C controlled analog mux that can also be disabled to have no analog connection.

You could just parallel two of the LTC1380s to split SCL into 16 different paths and then put another LTC1380 on each of the 16 paths to talk to 8 different sensors on each of the 16 clock paths.

Another possibility is to keep 7 mux channels on each board and pass one to the next board. The next through boards would also have 7 on board and one pass through. The ~100 ohm resistance of the analog switch would eventually cause problems, but you could probably get away with at 4 levels deep with 4.7K pullup resistors. After 4 levels you run out of addresses for the muxes anyway.

If you combined the two methods, you could have an 8:1 at the top level talking to 8 3 deep chains with 7 senors each, giving you 8 * 21 = 168 sensors.

To help with maintaining signal quality, you could perhaps combine the analog muxes with the LTC-4302, which is basically a programmable connection between two I2C busses that can have 32 different pin programmed addresses. It also has rise time acceleration, which could help with long busses.

No matter what you do, make sure that you do not exceed the I2C capacitive loading specs (~400pf). Splitting up the busses can help with that.

\$\endgroup\$
  • \$\begingroup\$ Thanks for the answer. The price of translators is not much of an issue, for me it is a way how to make the operation easy, the sensors simply appear with different addresses. What would be the resource intensity? Power consumption? \$\endgroup\$ – eudoxos Feb 15 '18 at 9:24
  • \$\begingroup\$ If you don't mind using one translator for each sensor, then what you propose should work. One "feature" is that you'll need to individually configure each LTC4316 to translate a different address to 0x52. That means a different resistance setting for every sensor. Power consumption is probably not an issue because the LTC4316 only uses 2ma. I personally would find it easier to split the I2C bus up with MUXes and/or the LTC3402 and not have to deal with figuring out 80 resistor combinations for the address translators and adding all of the required different resistors to the BOM. \$\endgroup\$ – crj11 Feb 15 '18 at 13:12
  • \$\begingroup\$ You could avoid the resistor problem by using an R-2R ladder ( en.wikipedia.org/wiki/Resistor_ladder ) driven by a jumper header to generate the configuration voltage. That way you could set the address of each sensor post manufacturing. That would add a header and resistors for each sensor and you would have correctly jumper each header. You could also put a trimmer resistor at each translator and set the correct voltage. I think it is less of a hassle to split the I2C bus so that the path to each sensor can be individually enabled at run time. \$\endgroup\$ – crj11 Feb 15 '18 at 13:26
  • \$\begingroup\$ Thanks, very useful suggestions. The idea (once we check prototype working etc) is to have modest volume (tens) of PCBs manufactured, that's why I find the idea of each module being completely identical, yet with different addresses when chained, so fascinating. So we do the resistor combinations just once :) Glad for people like you sharing their experience and knowledge here. Cheers! \$\endgroup\$ – eudoxos Feb 15 '18 at 15:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.