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 */