.. _module-pw_i2c_mcuxpresso:

=================
pw_i2c_mcuxpresso
=================
.. pigweed-module::
   :name: pw_i2c_mcuxpresso

``pw_i2c_mcuxpresso`` implements the ``pw_i2c`` interface using the
NXP MCUXpresso SDK.

The implementation is based on the i2c driver in SDK. I2C transfers use
non-blocking driver API.

``I3cMcuxpressoInitiator`` implements the ``pw_i2c`` initiator interface using
the MCUXpresso I3C driver. It exposes a few I3C specific API's for setting up
the bus, allowing normal I2C API's to work after setup.

-----
Setup
-----
This module requires following setup:

1. Use ``pw_build_mcuxpresso`` to create a ``pw_source_set`` for an
   MCUXpresso SDK.
2. Include the i2c driver component in this SDK definition.
3. Specify the ``pw_third_party_mcuxpresso_SDK`` GN global variable to specify
   the name of this source set.
4. Use ``pw::i2c::McuxpressoInitiator`` implementation of
   ``pw::i2c::Initiator`` while creating ``pw::i2c::Device`` or
   ``pw::i2c::RegisterDevice`` interface to access the I2C devices connected to
   target.

-----
Usage
-----
.. code-block:: cpp

   constexpr uint32_t kI2CBaudRate = 100000;
   constexpr McuxpressoInitiator::Config kConfig = {
       .flexcomm_address = I2C11_BASE,
       .clock_name = kCLOCK_Flexcomm11Clk,
       .baud_rate_bps = kI2CBaudRate,
   };
   McuxpressoInitiator initiator{kConfig};
   initiator.Enable();

``I3cMcuxpressoInitiator`` example usage.

.. code-block:: cpp

   constexpr I3cMcuxpressoInitiator::Config kI3c0Config = {
    .base_address = I3C0_BASE,
    .i2c_baud_rate = kI3cI2cBaudRate,
    .i3c_open_drain_baud_rate = kI3cOpenDrainBaudRate,
    .i3c_push_pull_baud_rate = kI3cPushPullBaudRate,
    .enable_open_drain_stop = false,  // NXP default
    .enable_open_drain_high = true,   // necessary to allow bus to operate in
                                      // mixed mode
   };

   I3cMcuxpressoInitiator i3c_0_initiator{kI3c0Config};

   const std::array dynamic_address_list = {kDynamicAddress};
   PW_TRY(i3c_initiator.SetDynamicAddressList(dynamic_address_list));
   PW_TRY(i3c_initiator.Initialize());
