# I2C Bus Overview

I2C is a packet-switched serial communication protocol that allows multiple master devices to connect to multiple slave devices using only 2 wires per connection. It is intended for attaching lower-speed peripheral ICs to processors and microcontrollers in short-distance, intra-board communication.

Pixhawk/PX4 support it for:

  • Connecting off board components that require greater data rates than provided by a strict serial UART: e.g. rangefinders.
  • Compatibility with peripheral devices that only support I2C.
  • Allowing multiple devices to attach to a single bus (useful for conserving ports). For example, LEDs, Compass, rangefinders etc.


IMUs (accelerometers/gyroscopes) should not be attached via I2C (typically the SPI (opens new window) bus is used). The bus is not fast enough even with a single device attached to allow vibration filtering (for instance), and the performance degrades further with every additional device on the bus.

# Integrating I2C Devices

Drivers should #include <drivers/device/i2c.h> and then provide an implementation of the abstract base class I2C defined in I2C.hpp for the target hardware (i.e. for NuttX here (opens new window)).

Drivers will also need to include headers for their type of device (drv_*.h) in /src/drivers/ (opens new window) - e.g. drv_baro.h (opens new window).

To include a driver in firmware you must add the driver to the board-specific cmake file that corresponds to the target you want to build for:



For example, you can see/search for this driver in the px4_fmu-v4_default (opens new window) configuration.

# I2C Driver Examples

To find I2C driver examples, search for i2c.h in /src/drivers/ (opens new window).

Just a few examples are:

# Further Information