This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM2634-Q1: How Can i use SPI Channel as a Master and Slave

Part Number: AM2634-Q1
Other Parts Discussed in Thread: TMDSCNCD263, TMDSHSECDOCK, AM2634, SYSCONFIG

Tool/software:

Hi Team,

I am using this TMDSCNCD263 board and this is the IO Extender TMDSHSECDOCK.

I am having one requirement, have 2 controllers one is AM2634 and second one is STM32 Nucleo Board i need to configure AM2534 board as a Master and STM32 as a Slave Now i have to transfer data from Master to slave and receive data from salve to master

I write down one code but not working can anyone help me to figure out what's the issue

AM2634 (Master Code)

#include <kernel/dpl/DebugP.h>
#include "ti_drivers_config.h"
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"
#include <drivers/hw_include/tistdtypes.h>

#define APP_MCSPI_MSGSIZE (128U)
#define APP_MCSPI_TRANSFER_LOOPCOUNT (10U)

uint8_t gMcspiTxBuffer[APP_MCSPI_MSGSIZE];
uint8_t gMcspiRxBuffer[APP_MCSPI_MSGSIZE];

void *mcspi_transmit_receive(void *args)
{
// int32_t status = SystemP_SUCCESS;
uint32_t i, j;
int32_t transferOK;
MCSPI_Transaction spiTransaction;
uint32_t startTimeInUSec, elapsedTimeInUsecs;

Drivers_open();
Board_driversOpen();

DebugP_log("[MCSPI] Transmit and Receive example started ...\r\n");

/* Memfill buffers */
for(i = 0U; i < APP_MCSPI_MSGSIZE; i++)
{
gMcspiTxBuffer[i] = 0x01;
gMcspiRxBuffer[i] = 0U;
}

/* Print transmitted data */
DebugP_log("Transmitted data on SPI0:\r\n");
for(i = 0U; i < APP_MCSPI_MSGSIZE; i++)
{
DebugP_log("%d ", gMcspiTxBuffer[i]);
}
DebugP_log("\r\n");

/* Initiate transfer */
MCSPI_Transaction_init(&spiTransaction);
spiTransaction.channel = gConfigMcspi0ChCfg[0].chNum; // SPI0 as transmitter
spiTransaction.dataSize = 8;
spiTransaction.csDisable = TRUE;
spiTransaction.count = APP_MCSPI_MSGSIZE / (spiTransaction.dataSize/8);
spiTransaction.txBuf = (void *)gMcspiTxBuffer;
spiTransaction.rxBuf = NULL; // No need to receive on SPI0
spiTransaction.args = NULL;
startTimeInUSec = ClockP_getTimeUsec();
for(j = 0U; j < APP_MCSPI_TRANSFER_LOOPCOUNT; j++)
{
transferOK = MCSPI_transfer(gMcspiHandle[CONFIG_MCSPI0], &spiTransaction);
}
elapsedTimeInUsecs = ClockP_getTimeUsec() - startTimeInUSec;

DebugP_log("----------------------------------------------------------\r\n");
DebugP_log("McSPI Clock %d Hz\r\n", gConfigMcspi0ChCfg[0U].bitRate);
DebugP_log("----------------------------------------------------------\r\n");
DebugP_log("Data Width \tData Length \tTransfer Time (micro sec)\r\n");
DebugP_log("%u\t\t%u\t\t%5.2f\r\n", spiTransaction.dataSize, APP_MCSPI_MSGSIZE,
(Float32)(elapsedTimeInUsecs / (uint32_t)APP_MCSPI_TRANSFER_LOOPCOUNT));
DebugP_log("----------------------------------------------------------\r\n\n");

if(SystemP_SUCCESS != transferOK)
{
DebugP_assert(FALSE); /* MCSPI transfer failed!! */
}

// Now, receive data on SPI1
MCSPI_Transaction_init(&spiTransaction);
spiTransaction.channel = gConfigMcspi1ChCfg[0].chNum; // SPI1 as receiver
spiTransaction.dataSize = 8;
spiTransaction.csDisable = TRUE;
spiTransaction.count = APP_MCSPI_MSGSIZE / (spiTransaction.dataSize/8);
spiTransaction.txBuf = NULL; // No need to transmit on SPI1
spiTransaction.rxBuf = (void *)gMcspiRxBuffer;
spiTransaction.args = NULL;
transferOK = MCSPI_transfer(gMcspiHandle[CONFIG_MCSPI1], &spiTransaction);

if(SystemP_SUCCESS != transferOK)
{
DebugP_assert(FALSE); /* MCSPI transfer failed!! */
}
else
{
/* Print received data */
DebugP_log("Received data on SPI1:\r\n");
for(i = 0U; i < APP_MCSPI_MSGSIZE; i++)
{
DebugP_log("%d ", gMcspiRxBuffer[i]);
}
DebugP_log("\r\n");
}

Board_driversClose();
Drivers_close();

return NULL;
}

STM32 (Slave Code)

#ifndef HSEM_ID_0
#define HSEM_ID_0 (0U) /* HW semaphore 0*/
#endif

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define CS_PIN GPIO_PIN_4
#define CS_GPIO_PORT GPIOA

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
#pragma location=0x30000000
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
#pragma location=0x30000200
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */

#elif defined ( __CC_ARM ) /* MDK ARM Compiler */

__attribute__((at(0x30000000))) ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
__attribute__((at(0x30000200))) ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */

#elif defined ( __GNUC__ ) /* GNU Compiler */
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection"))); /* Ethernet Tx DMA Descriptors */

#endif

ETH_TxPacketConfig TxConfig;

ETH_HandleTypeDef heth;

SPI_HandleTypeDef hspi1;

UART_HandleTypeDef huart3;

PCD_HandleTypeDef hpcd_USB_OTG_FS;

/* USER CODE BEGIN PV */
// Buffer for received data
#define BUFFER_SIZE 100
uint8_t rxBuffer[BUFFER_SIZE];
uint8_t txBuffer[BUFFER_SIZE] = "Data received and sent back"; // Example response data

// Flag to indicate data reception
volatile uint8_t dataReceivedFlag = 0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_USB_OTG_FS_PCD_Init(void);
static void MX_SPI1_Init(void);
static void MX_ETH_Init(void);
/* USER CODE BEGIN PFP */
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
void StartSPICommunication(void);
void SetCSHigh(void);
void SetCSLow(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int __io_putchar(int ch) {
// Transmit one character to the UART bit by bit
// Transmit one character to the UART
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END 0 */

/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
/* USER CODE BEGIN Boot_Mode_Sequence_0 */
int32_t timeout;
/* USER CODE END Boot_Mode_Sequence_0 */

/* USER CODE BEGIN Boot_Mode_Sequence_1 */
/* Wait until CPU2 boots and enters in stop mode or timeout*/
timeout = 0xFFFF;
while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) != RESET) && (timeout-- > 0));
if ( timeout < 0 )
{
Error_Handler();
}
/* USER CODE END Boot_Mode_Sequence_1 */
/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN Boot_Mode_Sequence_2 */
/* When system initialization is finished, Cortex-M7 will release Cortex-M4 by means of
HSEM notification */
/*HW semaphore Clock enable*/
__HAL_RCC_HSEM_CLK_ENABLE();
/*Take HSEM */
HAL_HSEM_FastTake(HSEM_ID_0);
/*Release HSEM in order to notify the CPU2(CM4)*/
HAL_HSEM_Release(HSEM_ID_0,0);
/* wait until CPU2 wakes up from stop mode */
timeout = 0xFFFF;
while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) == RESET) && (timeout-- > 0));
if ( timeout < 0 )
{
Error_Handler();
}
/* USER CODE END Boot_Mode_Sequence_2 */

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART3_UART_Init();
MX_USB_OTG_FS_PCD_Init();
MX_SPI1_Init();
MX_ETH_Init();
/* USER CODE BEGIN 2 */
// Start SPI communication
// StartSPICommunication();
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
timeout = HAL_SPI_Receive(&hspi1, rxBuffer, 5, 100);

if(timeout == 0 )
{
printf("Received data");
}
if (dataReceivedFlag)
{
// Reset flag
dataReceivedFlag = 0;

// Set CS pin low to select the SPI device
SetCSLow();

// Echo back received data
if (HAL_SPI_Transmit_IT(&hspi1, rxBuffer, BUFFER_SIZE) != HAL_OK)
{
Error_Handler();
}

// Set CS pin high to deselect the SPI device
// SetCSHigh();
}
}
/* USER CODE END 3 */
}


/**
* @brief SPI1 Initialization Function
* @param None
* @retval None
*/
static void MX_SPI1_Init(void)
{

/* USER CODE BEGIN SPI1_Init 0 */

/* USER CODE END SPI1_Init 0 */

/* USER CODE BEGIN SPI1_Init 1 */

/* USER CODE END SPI1_Init 1 */
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 0x0;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_16DATA;
hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */

/* USER CODE END SPI1_Init 2 */

}

/* USER CODE BEGIN 4 */
void SetCSHigh(void)
{
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_SET);
}

void SetCSLow(void)
{
HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_RESET);
}

void StartSPICommunication(void)
{
// Start SPI reception in interrupt mode
if (HAL_SPI_Receive_IT(&hspi1, rxBuffer, BUFFER_SIZE) != HAL_OK)
{
Error_Handler();
}
}


void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance == SPI1)
{
dataReceivedFlag = 1;
// Transmit received data over UART3
printf("Received data");
HAL_UART_Transmit(&huart3, rxBuffer, BUFFER_SIZE, HAL_MAX_DELAY);

// Restart SPI reception
if (HAL_SPI_Receive_IT(&hspi1, rxBuffer, BUFFER_SIZE) != HAL_OK)
{
Error_Handler();
}
}
}

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance == SPI1)
{
// Transmission complete callback
// You can add any additional code here if needed
}
}
/* USER CODE END 4 */

  • Hi Swati,

    The McSPI has two data pins: D0 and D1. Either of them can be used as output. If you want to output data to D0 pin, you need to configure D0 as output and D1 as input.  

    To receive data from SPI slave, the SPI master has to provide clock for slave to send data out, so the SPI master needs to transmit dummy data to slave. You need to provide both TXBUF and RXBUF when calling McSPI_transfer(..).

    Did you see the clock and data signals on McSPI lines?

  • Hi QJ Wang,

    I got your Point and i am agree with.

    But can you guide me how can i configure AM2634 in Slave Mode

  • Hi Swati,

    In SysConfig GUI, please select "Peripheral" for Mode of Operation:

  • Hi QJ Wang

    I did the same configuration for slave
    AIM: My aim is SPI0(Master) of AM2634 send data to STM32 SPI1(Slave), once STM32 SPI1 receives data it revert response to AM2634 through another SPI channel (Now SPI2 of STM32 is Master and SPI1 of AM2634 is slave)

    I am successfully Receive data on STM32 SPI Slave from AM2634 SPI Master now i am not able to receive from STM32 SPI Master on AM2634 SPI Slave

    And this is my  AM2634 Code 

    #define APP_MCSPI_MSGSIZE (10U)
    #define APP_MCSPI_TRANSFER_LOOPCOUNT (10U)

    uint8_t gMcspiTxBuffer[APP_MCSPI_MSGSIZE];
    uint8_t gMcspiRxBuffer[APP_MCSPI_MSGSIZE];

    void *mcspi_transmit_receive(void *args)
    {
    uint32_t i, j;
    int32_t transferOK;
    MCSPI_Transaction spiTransaction;
    uint32_t startTimeInUSecs, elapsedTimeInUsecs;

    Drivers_open();
    Board_driversOpen();

    DebugP_log("[MCSPI] Transmit and Receive example started ...\r\n");

    /* Memfill buffers */
    for(i = 0U; i < APP_MCSPI_MSGSIZE; i++)
    {
    gMcspiTxBuffer[i] = 'A';
    }

    /* Print transmitted data */
    DebugP_log("Transmitted data on SPI0:\r\n");
    for(i = 0U; i < APP_MCSPI_MSGSIZE; i++)
    {
    DebugP_log("%c ", gMcspiTxBuffer[i]);
    }
    DebugP_log("\r\n");

    /* Initiate transfer on SPI0 (Transmit and Receive) */
    MCSPI_Transaction_init(&spiTransaction);
    spiTransaction.channel = gConfigMcspi0ChCfg[0].chNum; // Ensure correct channel number
    spiTransaction.dataSize = 8;
    spiTransaction.csDisable = TRUE;
    spiTransaction.count = APP_MCSPI_MSGSIZE;
    spiTransaction.txBuf = (void *)gMcspiTxBuffer;
    spiTransaction.rxBuf = NULL;
    spiTransaction.args = NULL;
    startTimeInUSecs = ClockP_getTimeUsec();
    for(j = 0U; j < APP_MCSPI_TRANSFER_LOOPCOUNT; j++)
    {
    transferOK = MCSPI_transfer(gMcspiHandle[CONFIG_MCSPI0], &spiTransaction);
    }
    elapsedTimeInUsecs = ClockP_getTimeUsec() - startTimeInUSecs;

    DebugP_log("----------------------------------------------------------\r\n");
    DebugP_log("McSPI Clock %d Hz\r\n", gConfigMcspi0ChCfg[0U].bitRate); // Verify bitRate is set correctly
    DebugP_log("----------------------------------------------------------\r\n");
    DebugP_log("Data Width \tData Length \tTransfer Time (micro sec)\r\n");
    DebugP_log("%u\t\t%u\t\t%5.2f\r\n", spiTransaction.dataSize, APP_MCSPI_MSGSIZE,
    (Float32)(elapsedTimeInUsecs / (uint32_t)APP_MCSPI_TRANSFER_LOOPCOUNT));
    DebugP_log("----------------------------------------------------------\r\n\n");

    if(SystemP_SUCCESS != transferOK)
    {
    DebugP_assert(FALSE); /* MCSPI transfer failed!! */
    }

    /* Print received data */
    /* Initiate Receive on SPI1 (Transmit and Receive) */
    MCSPI_Transaction_init(&spiTransaction);
    spiTransaction.channel = gConfigMcspi1ChCfg[0].chNum;
    spiTransaction.dataSize = 8; // Adjust data size as per your requirements
    spiTransaction.csDisable = FALSE;
    spiTransaction.count = APP_MCSPI_MSGSIZE;
    spiTransaction.txBuf = NULL; // Set txBuf to NULL for receiving
    spiTransaction.rxBuf = (void *)gMcspiRxBuffer; // Specify the receive buffer
    spiTransaction.args = NULL;
    transferOK = MCSPI_transfer(gMcspiHandle[CONFIG_MCSPI1], &spiTransaction);
    // Initiate receive operation on MCSPI1
    if (transferOK != SystemP_SUCCESS) {
    DebugP_log("SPI1 transfer failed\r\n");

    } else {
    DebugP_log("Received data on SPI1:\r\n");
    DebugP_log("%c ", gMcspiRxBuffer);
    for(j = 0U; j < APP_MCSPI_TRANSFER_LOOPCOUNT; j++)
    {
    DebugP_log("%c ", gMcspiRxBuffer[j]);
    }
    }

    Board_driversClose();
    Drivers_close();

    return NULL;
    }

    this is my STM32 Code

    /* USER CODE BEGIN Header */

    /**

    ******************************************************************************

    * @file : main.c

    * @brief : Main program body

    ******************************************************************************

    * @attention

    *

    * Copyright (c) 2024 STMicroelectronics.

    * All rights reserved.

    *

    * This software is licensed under terms that can be found in the LICENSE file

    * in the root directory of this software component.

    * If no LICENSE file comes with this software, it is provided AS-IS.

    *

    ******************************************************************************

    */

    /* USER CODE END Header */

    /* Includes ------------------------------------------------------------------*/

    #include "main.h"

    /* Private includes ----------------------------------------------------------*/

    /* USER CODE BEGIN Includes */

    #include "stdio.h"

    #include "string.h"

    /* USER CODE END Includes */

    /* Private typedef -----------------------------------------------------------*/

    /* USER CODE BEGIN PTD */

    /* USER CODE END PTD */

    /* Private define ------------------------------------------------------------*/

    /* USER CODE BEGIN PD */

    #ifndef HSEM_ID_0

    #define HSEM_ID_0 (0U) /* HW semaphore 0*/

    #endif

    /* USER CODE END PD */

    /* Private macro -------------------------------------------------------------*/

    /* USER CODE BEGIN PM */

    #define CS_PIN GPIO_PIN_4

    #define CS_GPIO_PORT GPIOA

    #define SPI2_CS_PIN GPIO_PIN_4

    #define SPI2_CS_GPIO_PORT GPIOE

    /* USER CODE END PM */

    /* Private variables ---------------------------------------------------------*/

    SPI_HandleTypeDef hspi1;

    SPI_HandleTypeDef hspi2;

    UART_HandleTypeDef huart3;

    /* USER CODE BEGIN PV */

    // Buffer for received data

    #define BUFFER_SIZE 10

    uint8_t rxBuffer[BUFFER_SIZE];

    uint8_t txBuffer[BUFFER_SIZE] = {'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'}; // Example response data

    // Flag to indicate data reception

    volatile uint8_t dataReceivedFlag = 0;

    /* USER CODE END PV */

    /* Private function prototypes -----------------------------------------------*/

    void SystemClock_Config(void);

    static void MX_GPIO_Init(void);

    static void MX_USART3_UART_Init(void);

    static void MX_SPI1_Init(void);

    static void MX_SPI2_Init(void);

    /* USER CODE BEGIN PFP */

    void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);

    void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);

    void StartSPICommunication(void);

    void SetCSHigh(void);

    void SetCSLow(void);

    /* USER CODE END PFP */

    /* Private user code ---------------------------------------------------------*/

    /* USER CODE BEGIN 0 */

    int __io_putchar(int ch) {

    // Transmit one character to the UART bit by bit

    // Transmit one character to the UART

    HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, HAL_MAX_DELAY);

    return ch;

    }

    /* USER CODE END 0 */

    /**

    * @brief The application entry point.

    * @retval int

    */

    int main(void)

    {

    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* USER CODE BEGIN Boot_Mode_Sequence_0 */

    int32_t timeout;

    int32_t transmit_timeout;

    /* USER CODE END Boot_Mode_Sequence_0 */

    /* USER CODE BEGIN Boot_Mode_Sequence_1 */

    /* Wait until CPU2 boots and enters in stop mode or timeout*/

    timeout = 0xFFFF;

    while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) != RESET) && (timeout-- > 0));

    if ( timeout < 0 )

    {

    Error_Handler();

    }

    /* USER CODE END Boot_Mode_Sequence_1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */

    SystemClock_Config();

    /* USER CODE BEGIN Boot_Mode_Sequence_2 */

    /* When system initialization is finished, Cortex-M7 will release Cortex-M4 by means of

    HSEM notification */

    /*HW semaphore Clock enable*/

    __HAL_RCC_HSEM_CLK_ENABLE();

    /*Take HSEM */

    HAL_HSEM_FastTake(HSEM_ID_0);

    /*Release HSEM in order to notify the CPU2(CM4)*/

    HAL_HSEM_Release(HSEM_ID_0,0);

    /* wait until CPU2 wakes up from stop mode */

    timeout = 0xFFFF;

    while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) == RESET) && (timeout-- > 0));

    if ( timeout < 0 )

    {

    Error_Handler();

    }

    /* USER CODE END Boot_Mode_Sequence_2 */

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */

    MX_GPIO_Init();

    MX_USART3_UART_Init();

    MX_SPI1_Init();

    MX_SPI2_Init();

    /* USER CODE BEGIN 2 */

    // Start SPI communication

    // StartSPICommunication();

    /* USER CODE END 2 */

    /* Infinite loop */

    /* USER CODE BEGIN WHILE */

    while (1)

    {

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    timeout = HAL_SPI_Receive(&hspi1, rxBuffer, BUFFER_SIZE, 100);

    if(timeout == 0 )

    {

    printf("Received data: %s\n", rxBuffer);

    SetCSHigh();

    HAL_Delay(100);

    SetCSLow();

    transmit_timeout = HAL_SPI_Transmit(&hspi2, txBuffer, BUFFER_SIZE, 100);

    SetCSHigh();

    if(transmit_timeout == 0 )

    {

    printf("Transmit data: %s\n", txBuffer);

    }

    }

    }

    /* USER CODE END 3 */

    }

    /**

    * @brief System Clock Configuration

    * @retval None

    */

    void SystemClock_Config(void)

    {

    RCC_OscInitTypeDef RCC_OscInitStruct = {0};

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /** Supply configuration update enable

    */

    HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);

    /** Configure the main internal regulator output voltage

    */

    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

    while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

    /** Initializes the RCC Oscillators according to the specified parameters

    * in the RCC_OscInitTypeDef structure.

    */

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;

    RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;

    RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;

    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

    RCC_OscInitStruct.PLL.PLLM = 1;

    RCC_OscInitStruct.PLL.PLLN = 24;

    RCC_OscInitStruct.PLL.PLLP = 2;

    RCC_OscInitStruct.PLL.PLLQ = 4;

    RCC_OscInitStruct.PLL.PLLR = 2;

    RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;

    RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;

    RCC_OscInitStruct.PLL.PLLFRACN = 0;

    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

    {

    Error_Handler();

    }

    /** Initializes the CPU, AHB and APB buses clocks

    */

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

    |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2

    |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;

    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

    RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;

    RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;

    RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;

    RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;

    RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;

    RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

    {

    Error_Handler();

    }

    }

    /**

    * @brief SPI1 Initialization Function

    * @param None

    * @retval None

    */

    static void MX_SPI1_Init(void)

    {

    /* USER CODE BEGIN SPI1_Init 0 */

    /* USER CODE END SPI1_Init 0 */

    /* USER CODE BEGIN SPI1_Init 1 */

    /* USER CODE END SPI1_Init 1 */

    /* SPI1 parameter configuration*/

    hspi1.Instance = SPI1;

    hspi1.Init.Mode = SPI_MODE_SLAVE;

    hspi1.Init.Direction = SPI_DIRECTION_2LINES;

    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

    hspi1.Init.NSS = SPI_NSS_SOFT;

    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;

    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;

    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

    hspi1.Init.CRCPolynomial = 0x0;

    hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;

    hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;

    hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;

    hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;

    hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;

    hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;

    hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;

    hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;

    hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;

    hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;

    if (HAL_SPI_Init(&hspi1) != HAL_OK)

    {

    Error_Handler();

    }

    /* USER CODE BEGIN SPI1_Init 2 */

    /* USER CODE END SPI1_Init 2 */

    }

    /**

    * @brief SPI2 Initialization Function

    * @param None

    * @retval None

    */

    static void MX_SPI2_Init(void)

    {

    /* USER CODE BEGIN SPI2_Init 0 */

    /* USER CODE END SPI2_Init 0 */

    /* USER CODE BEGIN SPI2_Init 1 */

    /* USER CODE END SPI2_Init 1 */

    /* SPI2 parameter configuration*/

    hspi2.Instance = SPI2;

    hspi2.Init.Mode = SPI_MODE_MASTER;

    hspi2.Init.Direction = SPI_DIRECTION_2LINES;

    hspi2.Init.DataSize = SPI_DATASIZE_4BIT;

    hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;

    hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;

    hspi2.Init.NSS = SPI_NSS_SOFT;

    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;

    hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;

    hspi2.Init.TIMode = SPI_TIMODE_DISABLE;

    hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

    hspi2.Init.CRCPolynomial = 0x0;

    hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;

    hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;

    hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;

    hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;

    hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;

    hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;

    hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;

    hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;

    hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;

    hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE;

    if (HAL_SPI_Init(&hspi2) != HAL_OK)

    {

    Error_Handler();

    }

    /* USER CODE BEGIN SPI2_Init 2 */

    /* USER CODE END SPI2_Init 2 */

    }

    /**

    * @brief USART3 Initialization Function

    * @param None

    * @retval None

    */

    static void MX_USART3_UART_Init(void)

    {

    /* USER CODE BEGIN USART3_Init 0 */

    /* USER CODE END USART3_Init 0 */

    /* USER CODE BEGIN USART3_Init 1 */

    /* USER CODE END USART3_Init 1 */

    huart3.Instance = USART3;

    huart3.Init.BaudRate = 115200;

    huart3.Init.WordLength = UART_WORDLENGTH_8B;

    huart3.Init.StopBits = UART_STOPBITS_1;

    huart3.Init.Parity = UART_PARITY_NONE;

    huart3.Init.Mode = UART_MODE_TX_RX;

    huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;

    huart3.Init.OverSampling = UART_OVERSAMPLING_16;

    huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

    huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;

    huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

    if (HAL_UART_Init(&huart3) != HAL_OK)

    {

    Error_Handler();

    }

    if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)

    {

    Error_Handler();

    }

    if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)

    {

    Error_Handler();

    }

    if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)

    {

    Error_Handler();

    }

    /* USER CODE BEGIN USART3_Init 2 */

    /* USER CODE END USART3_Init 2 */

    }

    /**

    * @brief GPIO Initialization Function

    * @param None

    * @retval None

    */

    static void MX_GPIO_Init(void)

    {

    /* USER CODE BEGIN MX_GPIO_Init_1 */

    /* USER CODE END MX_GPIO_Init_1 */

    /* GPIO Ports Clock Enable */

    __HAL_RCC_GPIOC_CLK_ENABLE();

    __HAL_RCC_GPIOH_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();

    __HAL_RCC_GPIOD_CLK_ENABLE();

    /* USER CODE BEGIN MX_GPIO_Init_2 */

    /* USER CODE END MX_GPIO_Init_2 */

    }

    /* USER CODE BEGIN 4 */

    void SetCSHigh(void)

    {

    HAL_GPIO_WritePin(SPI2_CS_GPIO_PORT, SPI2_CS_PIN, GPIO_PIN_SET);

    }

    void SetCSLow(void)

    {

    HAL_GPIO_WritePin(SPI2_CS_GPIO_PORT, SPI2_CS_PIN, GPIO_PIN_RESET);

    }

    void StartSPICommunication(void)

    {

    // Start SPI reception in interrupt mode

    if (HAL_SPI_Receive_IT(&hspi1, rxBuffer, BUFFER_SIZE) != HAL_OK)

    {

    Error_Handler();

    }

    }

    void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

    {

    if (hspi->Instance == SPI1)

    {

    dataReceivedFlag = 1;

    // Transmit received data over UART3

    printf("Received data");

    HAL_UART_Transmit(&huart3, rxBuffer, BUFFER_SIZE, HAL_MAX_DELAY);

    // Restart SPI reception

    if (HAL_SPI_Receive_IT(&hspi1, rxBuffer, BUFFER_SIZE) != HAL_OK)

    {

    Error_Handler();

    }

    }

    }

    void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)

    {

    if (hspi->Instance == SPI1)

    {

    // Transmission complete callback

    // You can add any additional code here if needed

    }

    }

    /* USER CODE END 4 */

    /**

    * @brief This function is executed in case of error occurrence.

    * @retval None

    */

    void Error_Handler(void)

    {

    /* USER CODE BEGIN Error_Handler_Debug */

    /* User can add his own implementation to report the HAL error return state */

    __disable_irq();

    while (1)

    {

    }

    /* USER CODE END Error_Handler_Debug */

    }

    #ifdef USE_FULL_ASSERT

    /**

    * @brief Reports the name of the source file and the source line number

    * where the assert_param error has occurred.

    * @param file: pointer to the source file name

    * @param line: assert_param error line source number

    * @retval None

    */

    void assert_failed(uint8_t *file, uint32_t line)

    {

    /* USER CODE BEGIN 6 */

    /* User can add his own implementation to report the file name and line number,

    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

    /* USER CODE END 6 */

    }

    #endif /* USE_FULL_ASSERT */

  • The McSPI1 looks ok to me. Did you see the McSPI clock signal and data on clock and data buses?

  • Thanks QJ Wang for your support and time,
    My issue has been resolved but this was not the exact issue, issue is with the CS pin on STM32 when i configure the CS pin on STM32 my cubemx not initializing my pin in GPIO this was the function generated by my CubeMX

    static void MX_GPIO_Init(void)

    {

    /* USER CODE BEGIN MX_GPIO_Init_1 */

    /* USER CODE END MX_GPIO_Init_1 */

    /* GPIO Ports Clock Enable */

    __HAL_RCC_GPIOC_CLK_ENABLE();

    __HAL_RCC_GPIOH_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();

    __HAL_RCC_GPIOD_CLK_ENABLE();

    /* USER CODE BEGIN MX_GPIO_Init_2 */

    /* USER CODE END MX_GPIO_Init_2 */

    }
    which is the main culprit then i write the pin initialization code manually then it works fine now.