Skip to main content
Visitor II
April 11, 2023
Question

only interrupt once for HAL_SPI_RxCpltCallback

  • April 11, 2023
  • 2 replies
  • 2342 views

Configured Master/Slave SPI.

(1). trigger Interrupt SPI receive.

(2). Interrupt and receive a data

(3). Trigger interrupt SPI receive again

(4). Never trigger SPI Interrupt receive.

...

HAL_SPI_Receive_IT(&hspi1, SPI_Receive_Buffer, SPI_RECEIVE_DATA_LENGTH);

 while (1)

 {

if(SPI_Frame_Reveived)

{

SPI_Frame_Reveived = 0;

HAL_SPI_Receive_IT(&hspi1, SPI_Receive_Buffer, SPI_RECEIVE_DATA_LENGTH);

}

 }

...

Interrupt:

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

{

SPI_Frame_Reveived = 1;

}

Why SPI receive IT only once?

Jiannong

    This topic has been closed for replies.

    2 replies

    Super User
    April 11, 2023

    Did you step through your code in main() and see what happens (or doesn't happen) to SPI_Frame_Received?

    How and where do you declare SPI_Frame_Received? I'm guessing something like "int SPI_Frame_Received". It needs to be declared as "volatile", otherwise the code in main() will never see the change made in the callback.

    Visitor II
    April 11, 2023

    Hi Bob S,

    thanks for your suggestion.

    For SPI_Frame_Reveived, I declared in main()

    uint8_t SPI_Frame_Reveived

    I will try to declare as "volatile".

    And I tried to add the code below in main() loop. it seems that it can be interrrupted.

    HAL_SPI_Receive_IT(&hspi1, SPI_Receive_Buffer, SPI_RECEIVE_DATA_LENGTH);

    /* Receive command from Master */

    while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY) {}

    I do not know why we keep running "HAL_SPI_Receive_IT".

    Jiannong