cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F4 SPI Receive Problem

Scarlet
Associate III

Sorry, I have another question to ask everyone. 

I am currently using the STM32F429ZIT6 to receive data from the AD7366 via SPI.

 

My Code:

 

int main(){
    /* 
    Initialize all configured...
    */

    while(1){
        /* CNVST Enable */
        GPIOA->ODR &= 0x0FF7F;

        /* Waiting BUSY */
        while(!(GPIOA->IDR & 0x8000));
        GPIOA->ODR |= 0x0080;
        while(GPIOA->IDR & 0x8000);

        /* CS Enable */
        GPIOA->ODR &= ~(1<<4);

        HAL_SPI_Receive(&hspi1, data_ptr, 1, 1);

        /* CS Disable */
        GPIOA->ODR |= 0x0010;
    }
}

 

 

 

When I use a slower SPI frequency, both the timing and the data are correct.

If SPI Config hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128:

 

static void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
  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();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

 

 

RXNE Reset & DR Data is Correct

Scarlet_1-1714478164096.png

 

Blue is CS, Yellow is SCK

Scarlet_3-1714478221643.png

 

However, when I set the SPI frequency to be faster, errors occur.

If SPI Config hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64:

 

static void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  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();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

 

 

RXNE no Reset

Scarlet_0-1714478057463.png

 

Blue is CS, Yellow is SCK

Scarlet_2-1714478213652.png

 

I have checked the STM32F429 Errata sheet[1] write:
master receive-only mode (simplex receive or half-duplex bidirectional receive phase) and an SCK strobing
edge has not occurred since the transition of the RXNE flag from low to high.

 

I'm not sure if this is the cause. If RXNE is causing the issue, how can this be resolved on STM32F4 in general?

 

Thank you all.

 

[1] STM32F427/437 and STM32F429/439 device errata - Errata sheet

0 REPLIES 0