1 votos

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

Antecedentes

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

Mediciones

Según mi analizador lógico, recibo una señal que parece estar bien (enviando 10 bytes con valores 0x55):

enter image description here

Resultados

La función de callback de recepción de mi receptor también se detiene en el breakpoint (última línea en el código a continuación):

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
  /* Evitar advertencia de compilación de argumento(s) no utilizado(s) */
  if (hspi1.RxXferCount == 10)

Problema

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

Pregunta

¿Cómo puedo recibir los bytes correctos?

Valores del registro SPI1 y de la variable hspi1

enter image description here

enter image description here

Código relevante

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

/* Función de inicialización de SPI1 */
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);
      }
   }
}

1voto

Spike Puntos 304

Sintiéndome estúpido, pero encontré la respuesta. Solo quería mencionarlo para otros:

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

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

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

HAL_SPI_Receive_IT(&hspi1, _spi_data, 10);

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X