Table of contents
Collapse the table of content
Expand the table of content

I2C transport

Last Updated: 1/24/2017

The I²C (Inter-IC) transport is a two-wire serial transport that was introduced by the Phillips Corporation for their consumer products. Sensors are one category of device that support this transport. Examples include:

  • ADXL345 accelerometer
  • HMC5883L compass
  • MS5611-01BA03 barometric pressure sensor
  • TMP100 temperature sensor

The two wires on the I2C bus correspond to a clock-line (SCL) and a serial data-line (SDA). For more information about the I2C transport, see to the I2C Bus Specification.

Sensors that support the I2C transport often support a set of registers. The master uses these registers to configure and control the slave device. For the ADXL345, the registers correspond to specific device properties, capabilities, or functionality. Some of the registers are read only; others are read/write. For example, register 0x2D (POWER_CTL) lets the master set an auto-sleep mode on the sensor—this mode sets the device to a low power state after a certain period of inactivity. (For more information about the ADXL345s registers and commands see to the manufacturer's datasheet.)

The sample driver has a method that writes values to a given register (CAcclelerometerDevice::WriteRegister) and one that reads values from a register (CAccelerometerDevicce::ReadRegister). They take arguments that identify the register being written to (or read from), a pointer to the data being written or read, and a buffer length for the data buffer.

For example, the following sequence of WriteRegister and ReadRegister calls takes place during driver and device initialization. The driver invokes WriteRegister to configure the sensor. If the operation succeeds, ReadRegister returns contents that reflect the previously written values.

Method Register Data Purpose CAccelerometerDevice::WriteRegister 0x2d '\0' (0x00) Reset the sensor’s power-control register and place the device in standby mode. CAccelerometerDevice::ReadRegister 0x2d '\0' (0x00) The device has been placed in standby mode. CAccelerometerDevice::WriteRegister 0x31 '\v' (0x0b) Set the device in full-resolution mode with a range along each axis of +/- 16G. CAccelerometerDevice::ReadRegister 0x31 '\v' (0x0b) Full-resolution has been set with maximum range (+/- 16G). . . . . . . . . .

The complete register map for the accelerometer is in Table 16 of the device's data sheet. The sample driver supports a subset of these registers. These supported values are found within the Adxl345.h header file:

// Register interface

#define ADXL345_DEVID                       0x00
#define ADXL345_THRESH_TAP                  0x1D
#define ADXL345_OFFSET_X                    0x1E
#define ADXL345_OFFSET_Y                    0x1F
#define ADXL345_OFFSET_Z                    0x20
#define ADXL345_DURATION_TAP                0x21
#define ADXL345_LATENT_TAP                  0x22
#define ADXL345_WINDOW_TAP                  0x23
#define ADXL345_THRESH_ACT                  0x24
#define ADXL345_THRESH_INACT                0x25
#define ADXL345_TIME_INACT                  0x26
#define ADXL345_ACT_INACT_CTL               0x27
#define ADXL345_THRESH_FF                   0x28
#define ADXL345_TIME_FF                     0x29
#define ADXL345_TAP_AXES                    0x2A
#define ADXL345_ACT_TAP_STATUS              0x2B
#define ADXL345_BW_RATE                     0x2C
#define ADXL345_POWER_CTL                   0x2D
#define ADXL345_INT_ENABLE                  0x2E
#define ADXL345_INT_MAP                     0x2F
#define ADXL345_INT_SOURCE                  0x30
#define ADXL345_DATA_FORMAT                 0x31
#define ADXL345_DATA_X0                     0x32
#define ADXL345_DATA_X1                     0x33
#define ADXL345_DATA_Y0                     0x34
#define ADXL345_DATA_Y1                     0x35
#define ADXL345_DATA_Z0                     0x36
#define ADXL345_DATA_Z1                     0x37
#define ADXL345_FIFO_CTL                    0x38
#define ADXL345_FIFO_STATUS                 0x39

Send comments about this topic to Microsoft

© 2017 Microsoft