Wie empfängt man Bytes von SPI mit Interrupts mit HAL auf STM32?

Hintergrund

Ich versuche, eine SPI-Verbindung zwischen zwei STM32F103C8T6 herzustellen.

Messungen

Laut meinem Logikanalysator bekomme ich ein Signal, das in Ordnung aussieht (sendet 10 Bytes mit den Werten 0x55):

Geben Sie hier die Bildbeschreibung ein

Ergebnisse

Die Rückruffunktion meines Empfängers für RX Complete stoppt auch am Haltepunkt (letzte Zeile im Code unten):

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

Problem

Ich habe 10 Bytes gesendet, aber RxXferCount hat den Wert 0. Stattdessen hat RxXferSize den Wert 10, aber pRxBuffPtr ist leer.

Frage

Wie kann ich die richtigen Bytes empfangen?

Werte aus Register SPI1 und Variable hspi1

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Relevanter Code

Initialisierung (unter Verwendung eines GPIO zur Definition von Master und Slave):

/* 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__);
  }
}

Hauptfunktion:

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);
      }
   }
}

Antworten (1)

Fühle mich dumm, habe aber die Antwort gefunden. Ich möchte es nur für andere erwähnen:

Das Ergebnis befindet sich NICHT im Argument hsp (.pRxBuffPtr) des Interrupt-Handlers

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

aber in der Variable _spi_data, die vom Empfangsbefehl bereitgestellt wird:

HAL_SPI_Receive_IT(&hspi1, _spi_data, 10);