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.
#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).
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.
To find I2C driver examples, search for i2c.h in /src/drivers/.
Just a few examples are:
- drivers/sf1xx - I2C Driver for Lightware SF1XX LIDAR.
- drivers/ms5611 - I2C Driver for the MS5611 and MS6507 barometric pressure sensor connected via I2C (or SPI).