Changing the baud rate of additional I2C busses
Ask QuestionAsked todayActive todayViewed 19 times3
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 /boot/config.txt
:
# 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
i2c_arm_baudrate=10000
to /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.
Thank you very much!i2cshareedit follow closeflag asked 11 hours agoKilroy2122 bronze badges New contributor
- 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
1 Answer
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
and everything works as expected.shareedit follow flag
Categories: Uncategorized