| .. _module-pw_i2c: |
| |
| ------ |
| pw_i2c |
| ------ |
| |
| .. warning:: |
| This module is under construction, not ready for use, and the documentation |
| is incomplete. |
| |
| pw_i2c contains interfaces and utility functions for using I2C. |
| |
| Features |
| ======== |
| |
| pw::i2c::Initiator |
| ------------------ |
| .. inclusive-language: disable |
| |
| The common interface for initiating transactions with devices on an I2C bus. |
| Other documentation sources may call this style of interface an I2C "master", |
| "central" or "controller". |
| |
| .. inclusive-language: enable |
| |
| pw::i2c::Device |
| --------------- |
| The common interface for interfacing with generic I2C devices. This object |
| contains ``pw::i2c::Address`` and wraps the ``pw::i2c::Initiator`` API. |
| Common use case includes streaming arbitrary data (Read/Write). Only works |
| with devices with a single device address. |
| |
| pw::i2c::RegisterDevice |
| ----------------------- |
| The common interface for interfacing with register devices. Contains methods |
| to help read and write registers from and to the device. Users should have a |
| understanding of the capabilities of their device such as register address |
| sizes, register data sizes, byte addressability, bulk transactions, etc in |
| order to effectively use this interface. |
| |
| pw::i2c::MockInitiator |
| ---------------------- |
| A generic mocked backend for for pw::i2c::Initiator. This is specifically |
| intended for use when developing drivers for i2c devices. This is structured |
| around a set of 'transactions' where each transaction contains a write, read and |
| a timeout. A transaction list can then be passed to the MockInitiator, where |
| each consecutive call to read/write will iterate to the next transaction in the |
| list. An example of this is shown below: |
| |
| .. code-block:: cpp |
| |
| using pw::i2c::Address; |
| using pw::i2c::MakeExpectedTransactionlist; |
| using pw::i2c::MockInitiator; |
| using pw::i2c::WriteTransaction; |
| using std::literals::chrono_literals::ms; |
| |
| constexpr Address kAddress1 = Address::SevenBit<0x01>(); |
| constexpr auto kExpectWrite1 = pw::bytes::Array<1, 2, 3, 4, 5>(); |
| constexpr auto kExpectWrite2 = pw::bytes::Array<3, 4, 5>(); |
| auto expected_transactions = MakeExpectedTransactionArray( |
| {ProbeTransaction(pw::OkStatus, kAddress1, 2ms), |
| WriteTransaction(pw::OkStatus(), kAddress1, kExpectWrite1, 1ms), |
| WriteTransaction(pw::OkStatus(), kAddress2, kExpectWrite2, 1ms)}); |
| MockInitiator i2c_mock(expected_transactions); |
| |
| // Begin driver code |
| Status status = i2c_mock.ProbeDeviceFor(kAddress1, 2ms); |
| |
| ConstByteSpan write1 = kExpectWrite1; |
| // write1 is ok as i2c_mock expects {1, 2, 3, 4, 5} == {1, 2, 3, 4, 5} |
| Status status = i2c_mock.WriteFor(kAddress1, write1, 2ms); |
| |
| // Takes the first two bytes from the expected array to build a mismatching |
| // span to write. |
| ConstByteSpan write2 = pw::span(kExpectWrite2).first(2); |
| // write2 fails as i2c_mock expects {3, 4, 5} != {3, 4} |
| status = i2c_mock.WriteFor(kAddress2, write2, 2ms); |
| // End driver code |
| |
| // Optionally check if the mocked transaction list has been exhausted. |
| // Alternatively this is also called from MockInitiator::~MockInitiator(). |
| EXPECT_EQ(mocked_i2c.Finalize(), OkStatus()); |
| |
| pw::i2c::GmockInitiator |
| ----------------------- |
| gMock of Initiator used for testing and mocking out the Initiator. |