Lpspi in slave mode in m4 core with imx8qxp

I need a example :lpspi in slave mode in m4 core with imx8qxp
I wrote a demo modeled after another driver in in interrupt mode
but it`s not working…
Unable to trigger interrupt
It appears that interrupts were not configured successfully

use spi2

pin_mux:

 err = sc_pad_set_all(ipc, BOARD_INITPINS_SOC_MCU_SPI_CS_PIN_FUNCTION_ID, 0U, SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF, 0x40 ,SC_PAD_WAKEUP_OFF);/* IOMUXD_SPI2_CS0 register modification value */
  if (SC_ERR_NONE != err)
  {
      assert(false);
  }
  err = sc_pad_set_all(ipc, BOARD_INITPINS_SOC_MCU_SPI_SCK_PIN_FUNCTION_ID, 0U, SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF, 0x40 ,SC_PAD_WAKEUP_OFF);/* IOMUXD_SPI2_SCK register modification value */
  if (SC_ERR_NONE != err)
  {
      assert(false);
  }
  err = sc_pad_set_all(ipc, BOARD_INITPINS_SOC_MCU_SPI_MISO_PIN_FUNCTION_ID, 0U, SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF, 0x40 ,SC_PAD_WAKEUP_OFF);/* IOMUXD_SPI2_SDI register modification value */
  if (SC_ERR_NONE != err)
  {
      assert(false);
  }
  err = sc_pad_set_all(ipc, BOARD_INITPINS_SOC_MCU_SPI_MOSI_PIN_FUNCTION_ID, 0U, SC_PAD_CONFIG_NORMAL, SC_PAD_ISO_OFF, 0x40 ,SC_PAD_WAKEUP_OFF);/* IOMUXD_SPI2_SDO register modification value */
  if (SC_ERR_NONE != err)
  {
      assert(false);
  }

demo_lpspi.c:

/*******************************************************************************
 * Definitions
 ******************************************************************************/
#define LPSPI_SLAVE_BASEADDR ADMA__LPSPI2
#define TRANSFER_SIZE 80U /*! Transfer dataSize */

/*******************************************************************************
 * Prototypes
 ******************************************************************************/
/* LPSPI user callback */
void LPSPI_SlaveUserCallback(LPSPI_Type *base, lpspi_slave_handle_t *handle, status_t status, void *userData);

/*******************************************************************************
 * Variables
 ******************************************************************************/
uint32_t slaveRxData[TRANSFER_SIZE] = {0U};
lpspi_slave_handle_t g_s_handle;

volatile bool isTransferCompleted = false;

/*******************************************************************************
 * Code
 ******************************************************************************/

void LPSPI_SlaveUserCallback(LPSPI_Type *base, lpspi_slave_handle_t *handle, status_t status, void *userData)
{
    if (status == kStatus_Success)
    {
        PRINTF("This is ECSPI slave transfer completed callback. \r\n");
        PRINTF("It's a successful transfer. \r\n\r\n");
        isTransferCompleted = true;
    }

    if (status == kStatus_LPSPI_OutOfRange)
    {
        PRINTF("Hardware overflow occurred in this transfer. \r\n");
    }
}



int main(void)
{
        uint32_t i = 0;
    status_t status;
    uint8_t vendorID = 0;

    sc_ipc_t ipc = BOARD_InitRpc();
    BOARD_InitPins(ipc);
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();
    BOARD_InitMemory();

    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 SPI2\r\n");
    }

//    sc_pm_clock_enable(ipc, SC_R_SPI_2, SC_PM_CLK_PER, true, 0);    

/*
    if (CLOCK_SetIpFreq(kCLOCK_DMA_Lpspi2, SC_60MHZ) == 0)
    {
            PRINTF("Error: Failed to set SPI2 frequency\r\n");
    }
*/
    PRINTF("\r\nspi start now !!!\r\n");

    lpspi_slave_config_t slaveConfig;
    lpspi_transfer_t slaveXfer;

    LPSPI_SlaveGetDefaultConfig(&slaveConfig);
    LPSPI_SlaveInit(LPSPI_SLAVE_BASEADDR, &slaveConfig);
    LPSPI_SlaveTransferCreateHandle(LPSPI_SLAVE_BASEADDR, &g_s_handle, LPSPI_SlaveUserCallback, NULL);

    while (1)
    {
        PRINTF("\r\n Slave example is running...\r\n\r\n");

        /* Reset the receive buffer */
        for (i = 0; i < TRANSFER_SIZE; i++)
        {
            slaveRxData[i] = 0U;
        }

        /* Set slave transfer ready to receive data */
        isTransferCompleted = false;
        slaveXfer.txData    = NULL;
        slaveXfer.rxData    = slaveRxData;
        slaveXfer.dataSize  = TRANSFER_SIZE;
        slaveXfer.configFlags = kLPSPI_SlavePcs0 | kLPSPI_SlaveByteSwap;
        /* Slave start receive */
        PRINTF("Slave starts to receive data!\r\n");
        status = LPSPI_SlaveTransferNonBlocking(LPSPI_SLAVE_BASEADDR, &g_s_handle, &slaveXfer);
        PRINTF("status=%d\r\n",status);
        if(kStatus_Success != status)
        {
               PRINTF("Failed to rec data on SPI2.\r\n");
        }

        while (!isTransferCompleted)
        {

                ;
        }

        {
            /* Print 16 numbers in a line */
            if ((i & 0x0FU) == 0U)
            {
                PRINTF("\r\n    ");
            }
            PRINTF(" %02X", slaveRxData[i]);
        }
        PRINTF("\r\n");
    }


pin_mux.h:

/***********************************************************************************************************************
 * Definitions
 **********************************************************************************************************************/

/* ADC_IN2 (coord V32), FTDI_M40_UART0_RX */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_PERIPHERAL                   M40__UART0   /*!< Device name: M40__UART0 */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_SIGNAL                          uart_rx   /*!< M40__UART0 signal: uart_rx */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_PIN_NAME                        ADC_IN2   /*!< Pin name */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_PIN_FUNCTION_ID            SC_P_ADC_IN2   /*!< Pin function id */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_LABEL               "FTDI_M40_UART0_RX"   /*!< Label */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_NAME                "FTDI_M40_UART0_RX"   /*!< Identifier name */

/* ADC_IN3 (coord V30), FTDI_M40_UART0_TX */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_PERIPHERAL                   M40__UART0   /*!< Device name: M40__UART0 */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_SIGNAL                          uart_tx   /*!< M40__UART0 signal: uart_tx */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_PIN_NAME                        ADC_IN3   /*!< Pin name */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_PIN_FUNCTION_ID            SC_P_ADC_IN3   /*!< Pin function id */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_LABEL               "FTDI_M40_UART0_TX"   /*!< Label */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_NAME                "FTDI_M40_UART0_TX"   /*!< Identifier name */

/* USB_SS3_TC1 (coord H14), I2C1_SCL(SS3_SCL) */
#define BOARD_INITPINS_I2C1_SCL_PERIPHERAL                            ADMA__I2C1   /*!< Device name: ADMA__I2C1 */
#define BOARD_INITPINS_I2C1_SCL_SIGNAL                                   i2c_scl   /*!< ADMA__I2C1 signal: i2c_scl */
#define BOARD_INITPINS_I2C1_SCL_PIN_NAME                             USB_SS3_TC1   /*!< Pin name */
#define BOARD_INITPINS_I2C1_SCL_PIN_FUNCTION_ID                 SC_P_USB_SS3_TC1   /*!< Pin function id */
#define BOARD_INITPINS_I2C1_SCL_LABEL                        "I2C1_SCL(SS3_SCL)"   /*!< Label */
#define BOARD_INITPINS_I2C1_SCL_NAME                                  "I2C1_SCL"   /*!< Identifier name */

/* USB_SS3_TC3 (coord C15), I2C1_SDA(SS3_SDA) */
#define BOARD_INITPINS_I2C1_SDA_PERIPHERAL                            ADMA__I2C1   /*!< Device name: ADMA__I2C1 */
#define BOARD_INITPINS_I2C1_SDA_SIGNAL                                   i2c_sda   /*!< ADMA__I2C1 signal: i2c_sda */
#define BOARD_INITPINS_I2C1_SDA_PIN_NAME                             USB_SS3_TC3   /*!< Pin name */
#define BOARD_INITPINS_I2C1_SDA_PIN_FUNCTION_ID                 SC_P_USB_SS3_TC3   /*!< Pin function id */
#define BOARD_INITPINS_I2C1_SDA_LABEL                        "I2C1_SDA(SS3_SDA)"   /*!< Label */
#define BOARD_INITPINS_I2C1_SDA_NAME                                  "I2C1_SDA"   /*!< Identifier name */


#define BOARD_INITPINS_SOC_MCU_SPI_CS_PIN_FUNCTION_ID              SC_P_SPI2_CS0   /*!< Pin function id */

/* SPI2_SCK (coord R29), SOC_MCU */
/* Routed pin properties */
#define BOARD_INITPINS_SOC_MCU_SPI_SCK_PIN_FUNCTION_ID             SC_P_SPI2_SCK   /*!< Pin function id */

/* SPI2_SDI (coord N31), SOC_MCU */
/* Routed pin properties */
#define BOARD_INITPINS_SOC_MCU_SPI_MISO_PIN_FUNCTION_ID            SC_P_SPI2_SDI   /*!< Pin function id */

/* SPI2_SDO (coord P32), SOC_MCU */
/* Routed pin properties */
#define BOARD_INITPINS_SOC_MCU_SPI_MOSI_PIN_FUNCTION_ID            SC_P_SPI2_SDO   /*!< Pin function id */

Hi @yangbanxian , please also post pin_mux.h in this thread. Does Colibri iMX8X stay in U-Boot after M4 firmware is loaded? LPSPI2 needs disabled in device tree if Linux kernel is going to be loaded later.

thank for so quick reply:

yes,I stay in U-Boot after M4 firmware is loaded

pin_mux.h :

/***********************************************************************************************************************
 * Definitions
 **********************************************************************************************************************/

/* ADC_IN2 (coord V32), FTDI_M40_UART0_RX */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_PERIPHERAL                   M40__UART0   /*!< Device name: M40__UART0 */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_SIGNAL                          uart_rx   /*!< M40__UART0 signal: uart_rx */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_PIN_NAME                        ADC_IN2   /*!< Pin name */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_PIN_FUNCTION_ID            SC_P_ADC_IN2   /*!< Pin function id */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_LABEL               "FTDI_M40_UART0_RX"   /*!< Label */
#define BOARD_INITPINS_FTDI_M40_UART0_RX_NAME                "FTDI_M40_UART0_RX"   /*!< Identifier name */

/* ADC_IN3 (coord V30), FTDI_M40_UART0_TX */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_PERIPHERAL                   M40__UART0   /*!< Device name: M40__UART0 */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_SIGNAL                          uart_tx   /*!< M40__UART0 signal: uart_tx */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_PIN_NAME                        ADC_IN3   /*!< Pin name */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_PIN_FUNCTION_ID            SC_P_ADC_IN3   /*!< Pin function id */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_LABEL               "FTDI_M40_UART0_TX"   /*!< Label */
#define BOARD_INITPINS_FTDI_M40_UART0_TX_NAME                "FTDI_M40_UART0_TX"   /*!< Identifier name */

/* USB_SS3_TC1 (coord H14), I2C1_SCL(SS3_SCL) */
#define BOARD_INITPINS_I2C1_SCL_PERIPHERAL                            ADMA__I2C1   /*!< Device name: ADMA__I2C1 */
#define BOARD_INITPINS_I2C1_SCL_SIGNAL                                   i2c_scl   /*!< ADMA__I2C1 signal: i2c_scl */
#define BOARD_INITPINS_I2C1_SCL_PIN_NAME                             USB_SS3_TC1   /*!< Pin name */
#define BOARD_INITPINS_I2C1_SCL_PIN_FUNCTION_ID                 SC_P_USB_SS3_TC1   /*!< Pin function id */
#define BOARD_INITPINS_I2C1_SCL_LABEL                        "I2C1_SCL(SS3_SCL)"   /*!< Label */
#define BOARD_INITPINS_I2C1_SCL_NAME                                  "I2C1_SCL"   /*!< Identifier name */

/* USB_SS3_TC3 (coord C15), I2C1_SDA(SS3_SDA) */
#define BOARD_INITPINS_I2C1_SDA_PERIPHERAL                            ADMA__I2C1   /*!< Device name: ADMA__I2C1 */
#define BOARD_INITPINS_I2C1_SDA_SIGNAL                                   i2c_sda   /*!< ADMA__I2C1 signal: i2c_sda */
#define BOARD_INITPINS_I2C1_SDA_PIN_NAME                             USB_SS3_TC3   /*!< Pin name */
#define BOARD_INITPINS_I2C1_SDA_PIN_FUNCTION_ID                 SC_P_USB_SS3_TC3   /*!< Pin function id */
#define BOARD_INITPINS_I2C1_SDA_LABEL                        "I2C1_SDA(SS3_SDA)"   /*!< Label */
#define BOARD_INITPINS_I2C1_SDA_NAME                                  "I2C1_SDA"   /*!< Identifier name */


#define BOARD_INITPINS_SOC_MCU_SPI_CS_PIN_FUNCTION_ID              SC_P_SPI2_CS0   /*!< Pin function id */

/* SPI2_SCK (coord R29), SOC_MCU */
/* Routed pin properties */
#define BOARD_INITPINS_SOC_MCU_SPI_SCK_PIN_FUNCTION_ID             SC_P_SPI2_SCK   /*!< Pin function id */

/* SPI2_SDI (coord N31), SOC_MCU */
/* Routed pin properties */
#define BOARD_INITPINS_SOC_MCU_SPI_MISO_PIN_FUNCTION_ID            SC_P_SPI2_SDI   /*!< Pin function id */

/* SPI2_SDO (coord P32), SOC_MCU */
/* Routed pin properties */
#define BOARD_INITPINS_SOC_MCU_SPI_MOSI_PIN_FUNCTION_ID            SC_P_SPI2_SDO   /*!< Pin function id */

Try to enable interrupt for SPI2 in main()

    LPSPI_EnableInterrupts(ADMA__LPSPI2, kLPSPI_AllInterruptEnable);
    EnableIRQ(ADMA_SPI2_INT_IRQn);

add
LPSPI_EnableInterrupts(ADMA__LPSPI2, kLPSPI_AllInterruptEnable);
EnableIRQ(ADMA_SPI2_INT_IRQn);
still not work.

and it worked by followed:

IRQSTEER_Init(IRQSTEER);
IRQSTEER_EnableInterrupt(IRQSTEER, ADMA_SPI2_INT_IRQn);

tks !!!
love u!

Good to lean it. Thanks for sharing.