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 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).

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

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


For example, you can see/search for this driver in the px4fmu-v4_default configuration.

I2C Driver Examples

To find I2C driver examples, search for i2c.h in /src/drivers/.

Just a few examples are:

Further Information

results matching ""

    No results matching ""