Module embedded_hal::i2c[][src]

Expand description

Blocking I2C API

This API supports 7-bit and 10-bit addresses. Traits feature an AddressMode marker type parameter. Two implementation of the AddressMode exist: SevenBitAddress and TenBitAddress.

Through this marker types it is possible to implement each address mode for the traits independently in embedded-hal implementations and device drivers can depend only on the mode that they support.

Additionally, the I2C 10-bit address mode has been developed to be fully backwards compatible with the 7-bit address mode. This allows for a software-emulated 10-bit addressing implementation if the address mode is not supported by the hardware.

Since 7-bit addressing is the mode of the majority of I2C devices, SevenBitAddress has been set as default mode and thus can be omitted if desired.

In some cases it’s possible to implement these blocking traits on top of one of the core HAL traits. To save boilerplate when that’s the case a Default marker trait may be provided. Implementing that marker trait will opt in your type into a blanket implementation.

Examples

embedded-hal implementation for an MCU

Here is an example of an embedded-hal implementation of the Write trait for both modes:

/// I2C0 hardware peripheral which supports both 7-bit and 10-bit addressing.
pub struct I2c0;

impl Write<SevenBitAddress> for I2c0
{
    fn write(&mut self, addr: u8, output: &[u8]) -> Result<(), Self::Error> {
        // ...
    }
}

impl Write<TenBitAddress> for I2c0
{
    fn write(&mut self, addr: u16, output: &[u8]) -> Result<(), Self::Error> {
        // ...
    }
}

Device driver compatible only with 7-bit addresses

For demonstration purposes the address mode parameter has been omitted in this example.

const ADDR: u8  = 0x15;
pub struct TemperatureSensorDriver<I2C> {
    i2c: I2C,
}

impl<I2C, E: core::fmt::Debug> TemperatureSensorDriver<I2C>
where
    I2C: WriteRead<Error = E>,
{
    pub fn read_temperature(&mut self) -> Result<u8, E> {
        let mut temp = [0];
        self.i2c
            .write_read(ADDR, &[TEMP_REGISTER], &mut temp)
            .and(Ok(temp[0]))
    }
}

Device driver compatible only with 10-bit addresses

const ADDR: u16  = 0x158;
pub struct TemperatureSensorDriver<I2C> {
    i2c: I2C,
}

impl<I2C, E: core::fmt::Debug> TemperatureSensorDriver<I2C>
where
    I2C: WriteRead<TenBitAddress, Error = E>,
{
    pub fn read_temperature(&mut self) -> Result<u8, E> {
        let mut temp = [0];
        self.i2c
            .write_read(ADDR, &[TEMP_REGISTER], &mut temp)
            .and(Ok(temp[0]))
    }
}

Modules

Blocking I2C traits

Traits

Address mode (7-bit / 10-bit)

Type Definitions

7-bit address mode type

10-bit address mode type