text: /*
   * Copyright 2017 NXP
   * All rights reserved.
   *
   * SPDX-License-Identifier: BSD-3-Clause
   */
  
  #include "fsl_device_registers.h"
  #include "fsl_debug_console.h"
  #include "fsl_lpspi.h"
  #include "pin_mux.h"
  #include "clock_config.h"
  #include "board.h"
  
  #include "fsl_irqsteer.h"
  /*******************************************************************************
   * Definitions
   ******************************************************************************/
  /*Master related*/
  #define EXAMPLE_LPSPI_MASTER_BASEADDR         DMA__LPSPI2
  #define EXAMPLE_LPSPI_MASTER_IRQN             DMA_SPI2_INT_IRQn /*DMA LPSPI 2 interrupt is connected to IRQSteer Master 3 */
  #define EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT     kLPSPI_Pcs0
  #define EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER kLPSPI_MasterPcs0
  #define LPSPI_MASTER_CLK_FREQ                 (CLOCK_GetIpFreq(kCLOCK_DMA_Lpspi2))
  
  #define EXAMPLE_LPSPI_DEALY_COUNT 0xfffff
  #define TRANSFER_SIZE     64U     /*! Transfer dataSize */
  #define TRANSFER_BAUDRATE 500000U /*! Transfer baudrate - 500k */
  
  /*******************************************************************************
   * Prototypes
   ******************************************************************************/
  /* LPSPI user callback */
  void LPSPI_MasterUserCallback(LPSPI_Type *base, lpspi_master_handle_t *handle, status_t status, void *userData);
  
  /*******************************************************************************
   * Variables
   ******************************************************************************/
  uint8_t masterRxData[TRANSFER_SIZE] = {0U};
  uint8_t masterTxData[TRANSFER_SIZE] = {0U};
  
  lpspi_master_handle_t g_m_handle;
  volatile bool isTransferCompleted  = false;
  volatile uint32_t g_systickCounter = 20U;
  
  /*******************************************************************************
   * Code
   ******************************************************************************/
  void SysTick_Handler(void)
  {
      if (g_systickCounter != 0U)
      {
          g_systickCounter--;
      }
  }
  
  void LPSPI_MasterUserCallback(LPSPI_Type *base, lpspi_master_handle_t *handle, status_t status, void *userData)
  {
      if (status == kStatus_Success)
      {
          __NOP();
      }
  
      isTransferCompleted = true;
  }
  
  /*!
   * @brief Main function
   */
  int main(void)
  {
      sc_ipc_t ipc;
      uint32_t freq;
  
      ipc = BOARD_InitRpc();
  
      BOARD_InitPins(ipc);
      BOARD_BootClockRUN();
      BOARD_InitMemory();
      BOARD_InitDebugConsole();
  
      /* Power on SPI. */
      if (sc_pm_set_resource_power_mode(ipc, SC_R_SPI_2, SC_PM_PW_MODE_ON) != SC_ERR_NONE)
      {
          PRINTF("Error: Failed to power on LPSPI2\r\n");
      }
  
      /* Setup LPSPI clock */
      freq = CLOCK_SetIpFreq(kCLOCK_DMA_Lpspi2, SC_66MHZ);
      if (freq == 0)
      {
          PRINTF("Error: Failed to set LPSPI2 clock frequency\r\n");
      }
  
      /* Enable LPSPI interrupt in IRQSTEER */
      if (sc_pm_set_resource_power_mode(ipc, SC_R_IRQSTR_M4_0, SC_PM_PW_MODE_ON) != SC_ERR_NONE)
      {
          PRINTF("Error: Failed to power on IRQSTEER!\r\n");
      }
      IRQSTEER_Init(IRQSTEER);
      IRQSTEER_EnableInterrupt(IRQSTEER, DMA_SPI2_INT_IRQn);
  
      PRINTF("LPSPI board to board interrupt example.\r\n");
      PRINTF("This example use one board as master and another as slave.\r\n");
      PRINTF("Master and slave uses interrupt way. Slave should start first. \r\n");
      PRINTF("Please make sure you make the correct line connection. Basically, the connection is: \r\n");
      PRINTF("LPSPI_master -- LPSPI_slave   \r\n");
      PRINTF("   CLK       --    CLK  \r\n");
      PRINTF("   PCS       --    PCS \r\n");
      PRINTF("   SOUT      --    SIN  \r\n");
      PRINTF("   SIN       --    SOUT \r\n");
      PRINTF("   GND       --    GND \r\n");
  
      uint32_t srcClock_Hz;
      uint32_t errorCount;
      uint32_t loopCount = 1;
      uint32_t i;
      lpspi_master_config_t masterConfig;
      lpspi_transfer_t masterXfer;
  
      /*Master config*/
      LPSPI_MasterGetDefaultConfig(&masterConfig);
      masterConfig.baudRate = TRANSFER_BAUDRATE;
      masterConfig.whichPcs = EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT;
  
      srcClock_Hz = LPSPI_MASTER_CLK_FREQ;
      LPSPI_MasterInit(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterConfig, srcClock_Hz);
  
      LPSPI_MasterTransferCreateHandle(EXAMPLE_LPSPI_MASTER_BASEADDR, &g_m_handle, LPSPI_MasterUserCallback, NULL);
  
      while (1)
      {
          /* Set up the transfer data */
          for (i = 0U; i < TRANSFER_SIZE; i++)
          {
              masterTxData[i] = (i + loopCount) % 256U;
              masterRxData[i] = 0U;
          }
  
          /* Print out transmit buffer */
          PRINTF("\r\n Master transmit:\r\n");
          for (i = 0U; i < TRANSFER_SIZE; i++)
          {
              /* Print 16 numbers in a line */
              if ((i & 0x0FU) == 0U)
              {
                  PRINTF("\r\n");
              }
              PRINTF(" %02X", masterTxData[i]);
          }
          PRINTF("\r\n");
  
          /* Start master transfer, send data to slave */
          isTransferCompleted = false;
          masterXfer.txData   = masterTxData;
          masterXfer.rxData   = NULL;
          masterXfer.dataSize = TRANSFER_SIZE;
          masterXfer.configFlags =
              EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER | kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap;
  
          LPSPI_MasterTransferNonBlocking(EXAMPLE_LPSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer);
  
          /* Wait transfer complete */
          while (!isTransferCompleted)
          {
          }
  
          /* Delay to wait slave is ready */
          if (SysTick_Config(SystemCoreClock / 1000U))
          {
              while (1)
              {
              }
          }
          /* Delay 20 ms */
          g_systickCounter = 20U;
          while (g_systickCounter != 0U)
          {
          }
  
          /* Start master transfer, receive data from slave */
          isTransferCompleted = false;
          masterXfer.txData   = NULL;
          masterXfer.rxData   = masterRxData;
          masterXfer.dataSize = TRANSFER_SIZE;
          masterXfer.configFlags =
              EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER | kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap;
  
          LPSPI_MasterTransferNonBlocking(EXAMPLE_LPSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer);
  
          while (!isTransferCompleted)
          {
          }
  
          errorCount = 0U;
          for (i = 0U; i < TRANSFER_SIZE; i++)
          {
              if (masterTxData[i] != masterRxData[i])
              {
                  errorCount++;
              }
          }
          if (errorCount == 0U)
          {
              PRINTF(" \r\nLPSPI transfer all data matched! \r\n");
              /* Print out receive buffer */
              PRINTF("\r\n Master received:\r\n");
              for (i = 0U; i < TRANSFER_SIZE; i++)
              {
                  /* Print 16 numbers in a line */
                  if ((i & 0x0FU) == 0U)
                  {
                      PRINTF("\r\n");
                  }
                  PRINTF(" %02X", masterRxData[i]);
              }
              PRINTF("\r\n");
          }
          else
          {
              PRINTF(" \r\nError occurred in LPSPI transfer ! \r\n");
          }
  
          /* Wait for press any key */
          PRINTF("\r\n Press any key to run again\r\n");
          GETCHAR();
  
          /* Increase loop count to change transmit buffer */
          loopCount++;
      }
  }
  