Full Duplex SPI: Slave does not trigger callback function
- July 20, 2023
- 6 replies
- 2793 views
I have a SPI Master to slave setup and for some reason whenever the slave receive the full buffer from Master, it does not go inside the callback function.
This is my code from Master:
const uint8_t TX_Buffer1[] = "Hi Slave, wake up!";
uint8_t RX_Buffer[50];
uint8_t RX_Buffer_cpy[50];
volatile int counter = 0;
volatile int TX_complete;
volatile int RX_complete;
while (1)
{
/* USER CODE END WHILE */
MX_TouchGFX_Process();
/* USER CODE BEGIN 3 */
while(HAL_SPI_GetState(&hspi2)!= HAL_SPI_STATE_READY){}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
TX_complete = 0;
HAL_SPI_Transmit_DMA(&hspi2, TX_Buffer1, sizeof(TX_Buffer1));
while(TX_complete==0){}
RX_complete = 0;
HAL_SPI_Receive_DMA(&hspi2, RX_Buffer, sizeof(RX_Buffer));
while(RX_complete==0){}
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
counter++;
}
/* USER CODE END 3 */
}And then code from slave:
const uint8_t TX_Buffer1[] = "Hi Master, I am finally awake!";
uint8_t RX_Buffer[50];
uint8_t RX_Buffer_cpy[50];
volatile int counter = 0;
volatile int TX_complete;
volatile int RX_complete;
while (1)
{
MX_TouchGFX_Process();
RX_complete = 0;
HAL_SPI_Receive_DMA(&hspi2, RX_Buffer, sizeof(RX_Buffer));
while(RX_complete==0){}
TX_complete = 0;
HAL_SPI_Transmit_DMA(&hspi2, TX_Buffer1, sizeof(TX_Buffer1));
while(TX_complete==0){}
counter++;
} (Pretty much the same as Master except that the Receive function is first and transmit is 2nd.)
When debugging for the slave, after executing HAL_SPI_Receive_DMA, the the callback never gets triggered and hence RX_complete remains at 0 and get stuck there. But when left running, it seems that the callback gets triggered because the green LED gets toggled constantly. Anyway that causes a problem that the Master cannot receive from the slave properly.
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
RX_complete = 1;
HAL_GPIO_TogglePin(GPIOJ, GPIO_PIN_2);
strncpy((char*)RX_Buffer_cpy, (char*)RX_Buffer, sizeof(RX_Buffer));
}Settings for both master and slave are identical and NSS at slave is enabled. For master I manually enabled the GPIO at NSS pin. CPOL, CPHA and 8-bit data format are identical for both STM32H745XIH6 boards.
Master has corrupted received buffer...
Can someone please help??!!
