Change Raspberry Pi I2C Bus Speed

1

Changing the default I2C bus speed on the Raspberry Pi can help improve the performance of some projects. This is particularly important when using the I2C interface to control a display module. In the newer versions of Raspbian this change must be made using a Device Tree parameter.

The bus speed is sometimes referred to as “baudrate” although the two aren’t actually the same thing.

Step 1 – Enable the I2C Interface

Before the interface baudrate can be changed the I2C interface must be enabled. This can be done using “raspi-config” on the command line or “Raspberry Pi Configuration” on the Raspbian desktop.

For step-by-step instructions on how to do this please take a look at the Enable I2C Interface on the Raspberry Pi post.

Step 2 – Edit Config.txt File to set I2C Bus Speed

Using the following command the config.txt file can be edited :

sudo nano /boot/config.txt

Find the line containing “dtparam=i2c_arm=on”.

Add “,i2c_arm_baudrate=400000” where 400000 is the new speed (400 Kbit/s). Note the comma.

This should give you a line looking like :

dtparam=i2c_arm=on,i2c_arm_baudrate=400000

This enables the bus and sets the baudrate at the same time with a comma separating both parameters.

Use CTRL-X, then Y, then RETURN to save the file and exit.

Step 3 – Reboot

Finally, reboot the Pi for the new setting to take effect :

sudo reboot

I2C Baudrate Values

The BCM2835 ARM Peripherals specification (page 28) says that the Pi has a “fast-mode” (400Kb/s) driver. For this reason I would recommend using 100000 or 400000 as baudrate values. The default is usually set to 100000.

I successfully used 400000 with an OLED display module to increase the rate at which images could be updated.


Finally, for a list of I2C related articles click here.

More information about the I2C protocol can be found on Wikipedia.

Share.

1 Comment

  1. Hi Matt, thanks for the nice tutorial.

    I found that sometimes we need to reduce the i2c speed instead. For example, when implementing an I2C slave with ATtiny84, who has no hardware support for I2C.

    When using software to support I2C on slave, the slave may behave slow and need “clock stretching”, which is not well supported by Raspberry Pi until now (https://www.raspberrypi.org/forums/viewtopic.php?t=13771).

    In my case, I reduced the I2C to 10kbps (dtparam=i2c1_baudrate=10000) to avoid clock stretching, and it worked well.

Leave A Reply