text: /*
   * Copyright 2017 NXP
   * All rights reserved.
   *
   * SPDX-License-Identifier: BSD-3-Clause
   */
  
  /*  Standard C Included Files */
  #include <stdio.h>
  #include <string.h>
  #include "pin_mux.h"
  #include "board.h"
  #include "fsl_debug_console.h"
  #include "fsl_i2c.h"
  
  #include "fsl_power.h"
  /*******************************************************************************
   * Definitions
   ******************************************************************************/
  #define EXAMPLE_I2C_SLAVE_BASE    (I2C4_BASE)
  #define I2C_SLAVE_CLOCK_FREQUENCY (12000000)
  #define EXAMPLE_I2C_SLAVE ((I2C_Type *)EXAMPLE_I2C_SLAVE_BASE)
  
  #define I2C_MASTER_SLAVE_ADDR_7BIT (0x7EU)
  #define I2C_DATA_LENGTH            (34) /* MAX is 256 */
  
  /*******************************************************************************
   * Prototypes
   ******************************************************************************/
  
  /*******************************************************************************
   * Variables
   ******************************************************************************/
  
  uint8_t g_slave_buff[I2C_DATA_LENGTH];
  i2c_slave_handle_t g_s_handle;
  volatile bool g_SlaveCompletionFlag = false;
  
  /*******************************************************************************
   * Code
   ******************************************************************************/
  
  static void i2c_slave_callback(I2C_Type *base, volatile i2c_slave_transfer_t *xfer, void *userData)
  {
      switch (xfer->event)
      {
          /*  Address match event */
          case kI2C_SlaveAddressMatchEvent:
              xfer->rxData = NULL;
              xfer->rxSize = 0;
              break;
          /*  Transmit request */
          case kI2C_SlaveTransmitEvent:
              /*  Update information for transmit process */
              xfer->txData = &g_slave_buff[2];
              xfer->txSize = g_slave_buff[1];
              break;
  
          /* Setup the slave receive buffer */
          case kI2C_SlaveReceiveEvent:
              /*  Update information for received process */
              xfer->rxData = g_slave_buff;
              xfer->rxSize = I2C_DATA_LENGTH;
              break;
  
          /* The master has sent a stop transition on the bus */
          case kI2C_SlaveCompletionEvent:
              g_SlaveCompletionFlag = true;
              break;
  
          default:
              g_SlaveCompletionFlag = false;
              break;
      }
  }
  
  /*!
   * @brief Main function
   */
  int main(void)
  {
      i2c_slave_config_t slaveConfig;
      status_t reVal = kStatus_Fail;
  
      /* set BOD VBAT level to 1.65V */
      POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);
      /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
      CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
  
      /* attach 12 MHz clock to FLEXCOMM8 (I2C master) */
      CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4);
  
      /* reset FLEXCOMM for I2C */
      RESET_PeripheralReset(kFC4_RST_SHIFT_RSTn);
  
      BOARD_InitPins();
      BOARD_BootClockPLL150M();
      BOARD_InitDebugConsole();
  
      PRINTF("\r\nI2C board2board interrupt example -- Slave transfer.\r\n\r\n");
  
      /* Set up i2c slave */
      I2C_SlaveGetDefaultConfig(&slaveConfig);
  
      /* Change the slave address */
      slaveConfig.address0.address = I2C_MASTER_SLAVE_ADDR_7BIT;
  
      /* Initialize the I2C slave peripheral */
      I2C_SlaveInit(EXAMPLE_I2C_SLAVE, &slaveConfig, I2C_SLAVE_CLOCK_FREQUENCY);
  
      memset(g_slave_buff, 0, sizeof(g_slave_buff));
  
      /* Create the I2C handle for the non-blocking transfer */
      I2C_SlaveTransferCreateHandle(EXAMPLE_I2C_SLAVE, &g_s_handle, i2c_slave_callback, NULL);
  
      /* Start accepting I2C transfers on the I2C slave peripheral */
      reVal = I2C_SlaveTransferNonBlocking(EXAMPLE_I2C_SLAVE, &g_s_handle,
                                           kI2C_SlaveAddressMatchEvent | kI2C_SlaveCompletionEvent);
      if (reVal != kStatus_Success)
      {
          return -1;
      }
  
      /*  Wait for transfer completed. */
      while (!g_SlaveCompletionFlag)
      {
      }
      g_SlaveCompletionFlag = false;
  
      PRINTF("Slave received data :");
      for (uint32_t i = 0U; i < g_slave_buff[1]; i++)
      {
          if (i % 8 == 0)
          {
              PRINTF("\r\n");
          }
          PRINTF("0x%2x  ", g_slave_buff[2 + i]);
      }
      PRINTF("\r\n\r\n");
  
      /* Wait for master receive completed.*/
      while (!g_SlaveCompletionFlag)
      {
      }
      g_SlaveCompletionFlag = false;
  
      PRINTF("\r\nEnd of I2C example .\r\n");
      while (1)
      {
      }
  }
  