2024-12-12 11:44 PM - last edited on 2024-12-13 12:29 AM by Andrew Neil
I am working on SPI communication fullduplex using DMA between two Nucleo boards:
Master: Nucleo-U083RC
Slave: Nucleo-U575ZI
Implementation:
Slave Side:
The slave continuously transmits integer data values like 100000, 100001, 100002, and so on, using the normal method: HAL_SPI_Transmit().
Master Side:
The master receives this data using SPI DMA: HAL_SPI_Receive_DMA().
Command Handling:
After the master receives every 200 data values, it sends a command to the slave using HAL_SPI_Transmit_DMA().
On the slave side, this command is expected to be received with high priority using the interrupt method: HAL_SPI_Receive_IT().
Once the slave receives the command, it changes the data it is transmitting to new values, starting from 200000, 200001, 200002, and so on.
Master Response:
The master receives this updated data using HAL_SPI_Receive_DMA().
Issue:
The problem I’m facing is that when the master sends the command using HAL_SPI_Transmit_DMA(), the slave does not receive the command via HAL_SPI_Receive_IT().
I have verified on the master side that the command is transmitted successfully because the state is not busy, and the function returns HAL_OK.
Master Initialization Code:
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_MASTER;
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.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
Slave Initialization Code:
static void MX_SPI1_Init(void)
{
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END SPI1_Init 0 */
SPI_AutonomousModeConfTypeDef HAL_SPI_AutonomousMode_Cfg_Struct = {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 = 0x7;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
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;
hspi1.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY;
hspi1.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
HAL_SPI_AutonomousMode_Cfg_Struct.TriggerState = SPI_AUTO_MODE_DISABLE;
HAL_SPI_AutonomousMode_Cfg_Struct.TriggerSelection = SPI_GRP1_GPDMA_CH0_TCF_TRG;
HAL_SPI_AutonomousMode_Cfg_Struct.TriggerPolarity = SPI_TRIG_POLARITY_RISING;
if (HAL_SPIEx_SetConfigAutonomousMode(&hspi1, &HAL_SPI_AutonomousMode_Cfg_Struct) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
Attached Code:
I have attached the master and slave programs. Can someone help me identify the issue or suggest a solution?
2024-12-13 12:38 AM - edited 2024-12-13 06:58 AM
Welcome to the forum.
Please see How to insert source code for how to properly post source code.
See also How to write your question to maximize your chances to find a solution
@Praveen_S268 wrote:I am working on SPI communication fullduplex using DMA between two Nucleo boards:
I'd suggest that you get it working first without DMA.
@Praveen_S268 wrote:The slave continuously transmits integer data values like 100000, 100001, 100002, and so on, using the normal method: HAL_SPI_Transmit().
That's not how SPI works.
The Master is the one which generates the clock - so the slave cannot just transmit on its own.
@Praveen_S268 wrote:I have verified on the master side that the command is transmitted successfully because the state is not busy, and the function returns HAL_OK.
That's necessary - but not sufficient.
There could be hardware and/or configuration issues meaning that the software "works" internally, but the external communication doesn't happen (correctly).
That's why it's important to post your schematic - showing the connections between the boards.
And to use an oscilloscope or logic analyser to check what's actually happening on the wires...