¿Cómo recibir bytes de SPI con interrupciones usando HAL en STM32?

Fondo

Estoy tratando de hacer una conexión SPI entre dos STM32F103C8T6.

Mediciones

De acuerdo con mi analizador lógico, obtengo una señal que se ve bien (enviando 10 bytes con valores 0x55):

ingrese la descripción de la imagen aquí

Resultados

La función de devolución de llamada de mi receptor para RX Complete también se detiene en el punto de interrupción (última línea en el código a continuación):

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
  /* Prevent unused argument(s) compilation warning */
  if (hspi1.RxXferCount == 10)

Problema

Envié 10 bytes, sin embargo, RxXferCount tiene el valor 0. En cambio, RxXferSize tiene el valor 10, pero pRxBuffPtr está vacío.

Pregunta

¿Cómo puedo recibir los bytes correctos?

Valores del registro SPI1 y variable hspi1

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Código relevante

Inicialización (usando un GPIO para definir Maestro y Esclavo):

/* SPI1 init function */
static void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET ? 
    SPI_MODE_MASTER : 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.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

Función principal:

int main(void)
{
   ...
   MX_SPI1_Init();
   ...

   _transmitter = (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET ? 
                  SPI_MODE_MASTER : SPI_MODE_SLAVE);

   while (1)
   {
      if (_transmitter)
      {
      uint8_t data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 
                         0x55, 0x55, 0x55, 0x55, 0x55 };
          HAL_SPI_Transmit_IT(&hspi1, data, 10);
      }
      else
      {
         HAL_SPI_Receive_IT(&hspi1, _spi_data, 10);
      }
   }
}

Respuestas (1)

Sentirse estúpido, pero encontró la respuesta. Solo quiero mencionarlo para otros:

El resultado NO está dentro del argumento hsp (.pRxBuffPtr) del controlador de interrupciones

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

pero en la variable _spi_data proporcionada por el comando de recepción:

HAL_SPI_Receive_IT(&hspi1, _spi_data, 10);