for some project I need 5 sensors. Their I2C address is fixed and can be changed to another fixed value by soldering. So without an I2C multiplexer (which I don’t have), I need at least 3 I2C busses.
Hence, I added two additional I2C busses to my Raspberry Pi 3B by adding the following lines to
# open another i2c bus on GPIO 20 (SDA4) and GPIO 21 (SCL4) dtoverlay=i2c-gpio,bus=4,i2c_gpio_delay_us=1,i2c_gpio_sda=20,i2c_gpio_scl=21 # open another i2c bus on GPIO 20 (SDA3) and GPIO 21 (SCL3) dtoverlay=i2c-gpio,bus=3,i2c_gpio_delay_us=1,i2c_gpio_sda=19,i2c_gpio_scl=26
On the breadboard, this works just fine and I receive the data reliably (using an adapted version of these instructions). Now I want to distribute the sensors at quite some distance from the Raspberry Pi using some 50m of data cable. I know that I2C isn’t made for this and, in fact, it doesn’t work out of the box. Using the built-in I2C bus (bus 1), I immediately get an IOError if I try to read the sensor over the data cable. However, if I alter the baud rate from the standard 100 kHz to 10 kHz by adding
/boot/config.txt, everything works fine.
My question is: How can I alter the baud rate of the additional I2C busses? Is this possible at all? I tried
i2c_gpio_baudrate without success and couldn’t find any reference on how to do that.
- 1have you tried adding i2c_arm_baudrate to the list of parameters when you setup the aditional buses. “dtoverlay=i2c-gpio,bus=4,i2c_gpio_delay_us=1,i2c_gpio_sda=20,i2c_gpio_scl=21,i2c_arm_baudrate=10000” – Chad G 6 hours ago
- 1I tried that but it didn’t change anything. I solved the problem, however, see below. Nevertheless, thank you for your help! – Kilroy 5 hours ago
I think I can actually answer the question myself now.
You can change the baud rate of additional I2C busses on the GPIOs by changing the
i2c_gpio_delay_us paramter, which defines some time constant in microseconds (check out
/boot/overlays/README). The default seems to be
2, which supposedly corresponds to approx. 100 kHz. Changing that to
20 got me a working I2C bus over the 50m of data cable (at approx. 10 kHz I guess).
In short, the lines in
/boot/config.txt now read
# open another i2c bus on GPIO 20 (SDA4) and GPIO 21 (SCL4) dtoverlay=i2c-gpio,bus=4,i2c_gpio_delay_us=20,i2c_gpio_sda=20,i2c_gpio_scl=21 # open another i2c bus on GPIO 20 (SDA3) and GPIO 21 (SCL3) dtoverlay=i2c-gpio,bus=3,i2c_gpio_delay_us=20,i2c_gpio_sda=19,i2c_gpio_scl=26