HAL SPI en STM32F746 se bloquea [cerrado]

3

Estoy intentando comunicar el módulo RFID RC522 con la placa STM32F746g, utilizando las bibliotecas HAL SPI. System Workbench compila el proyecto sin ningún problema, pero después de invocar cualquier función, incluida la transmisión spi, la placa se atasca. No entra en una dura falla. Parece que hay algún tipo de condición "if if" o si está funcionando, nunca se detiene ... No sé qué hacer, ni siquiera sé cuál puede ser un posible problema.

Estoy usando SPI2, con el software CS en el pin D9, NSS no está conectado.

Aquí está mi código:

Definiciones:

#define SPIx                             SPI2
#define SPIx_CLK_ENABLE()                __HAL_RCC_SPI2_CLK_ENABLE()
#define SPIx_SCK_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOA_CLK_ENABLE()
#define SPIx_NSS_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOA_CLK_ENABLE()
#define SPIx_MISO_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define SPIx_MOSI_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define SPIx_CS_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOH_CLK_ENABLE()

#define SPIx_FORCE_RESET()               __HAL_RCC_SPI2_FORCE_RESET()
#define SPIx_RELEASE_RESET()             __HAL_RCC_SPI2_RELEASE_RESET()

#define SPIx_SCK_PIN                     GPIO_PIN_12 // D13
#define SPIx_SCK_GPIO_PORT               GPIOA
#define SPIx_SCK_AF                      GPIO_AF5_SPI2
#define SPIx_MISO_PIN                    GPIO_PIN_14 // D12
#define SPIx_MISO_GPIO_PORT              GPIOB
#define SPIx_MISO_AF                     GPIO_AF5_SPI2
#define SPIx_MOSI_PIN                    GPIO_PIN_15 // D11
#define SPIx_MOSI_GPIO_PORT              GPIOB
#define SPIx_MOSI_AF                     GPIO_AF5_SPI2
#define SPIx_NSS_PIN                     GPIO_PIN_11 // D10
#define SPIx_NSS_GPIO_PORT               GPIOA
#define SPIx_NSS_AF                      GPIO_AF5_SPI2
#define SPIx_CS_PIN                      GPIO_PIN_6 // D9
#define SPIx_CS_GPIO_PORT                GPIOH

#define SPIx_IRQn                        SPI2_IRQn
#define SPIx_IRQHandler                  SPI2_IRQHandler

Inicia GPIO:

GPIO_InitTypeDef  GPIO_InitStruct;
  GPIO_InitTypeDef  GPIO_InitStruct1;

  SPIx_SCK_GPIO_CLK_ENABLE();
  SPIx_MISO_GPIO_CLK_ENABLE();
  SPIx_MOSI_GPIO_CLK_ENABLE();
  SPIx_CS_GPIO_CLK_ENABLE();

  GPIO_InitStruct.Pin       = SPIx_SCK_PIN;
  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull      = GPIO_PULLDOWN;
  GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;
  GPIO_InitStruct.Alternate = SPIx_SCK_AF;
  HAL_GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStruct);

  GPIO_InitStruct.Pull      = GPIO_NOPULL;
  GPIO_InitStruct.Pin = SPIx_MISO_PIN;
  GPIO_InitStruct.Alternate = SPIx_MISO_AF;
  HAL_GPIO_Init(SPIx_MISO_GPIO_PORT, &GPIO_InitStruct);

  GPIO_InitStruct.Pull      = GPIO_PULLUP;
  GPIO_InitStruct.Pin = SPIx_MOSI_PIN;
  GPIO_InitStruct.Alternate = SPIx_MOSI_AF;
  HAL_GPIO_Init(SPIx_MOSI_GPIO_PORT, &GPIO_InitStruct);

  GPIO_InitStruct1.Pin = SPIx_CS_PIN;
  GPIO_InitStruct1.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct1.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStruct1.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(SPIx_CS_GPIO_PORT, &GPIO_InitStruct1);

Iniciativa SPI:

SPIx_FORCE_RESET();
    SPIx_RELEASE_RESET();
    SPIx_CLK_ENABLE();

  SpiHandle.Instance               = SPIx;
  SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
  SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
  SpiHandle.Init.CLKPolarity       = SPI_POLARITY_LOW;
  SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
  SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
  SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
  SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
  SpiHandle.Init.NSS               = SPI_NSS_SOFT;
  SpiHandle.Init.Mode                  = SPI_MODE_MASTER;
  HAL_Delay(5);

  if(HAL_SPI_Init(&SpiHandle) != HAL_OK)
  {
    Error_Handler();
  }

Todas las funciones de transmisión provienen de la biblioteca HAL estándar, sin ninguna modificación. Todos los registros de transmisión son correctos.

    
pregunta kacrzep

1 respuesta

1

El manual de referencia para ese chip en el capítulo 32.5.10 menciona esto:

  

Rx buffer not empty (RXNE)

     

El indicador RXNE se establece según el valor del bit FRXTH en el registro SPIx_CR2:

     
  • Si se configura FRXTH, RXNE sube y se mantiene alto hasta que el nivel de RXFIFO sea mayor o igual a 1/4 (8 bits).
  •   
  • Si FRXTH se borra, RXNE sube y se mantiene alto hasta que el nivel de RXFIFO sea mayor o igual a 1/2 (16 bits).
  •   

Se puede generar una interrupción si se establece el bit RXNEIE en el registro SPIx_CR2.   La RXNE es autorizada automáticamente por el hardware cuando ya no se cumplen las condiciones anteriores.   cierto.

También esto:

  

Si se usa el modo de embalaje y se debe recibir un número impar de cuadros de datos con un formato menor o igual a 8 bits (que se ajusta en un byte), FRXTH se debe configurar cuando FRLVL [1: 0] = 01, para generar el evento RXNE para leer el último marco de datos impar y mantener una buena alineación del puntero FIFO.

El modo de embalaje se activa automáticamente cuando está utilizando el modo de 8 bits, que ha configurado.

    
respondido por el Tryphon

Lea otras preguntas en las etiquetas