STM32 spi无hal接收程序

STM32 spi receive procedure without hal

下午好,

我是stm32编程新手。只是在做一个项目,时间安排是一个严重的问题。尝试在 PMSM 电机上实现 FOC,我需要在 50us 循环中进行计算,这可以通过 SPI 和 HAL 快速与角度传感器通信。我来说明一下情况。

我尝试使用 HAL,但正如我到处阅读和自己探索的那样:如果你需要速度,请把它放开。所以我的计划是使用CubeMX配置所有需要的寄存器,直接从寄存器DR中读取数据。一件小事,传感器与 16 位帧通信。

我生成的代码:

__HAL_SPI_ENABLE(&hspi3);

     HAL_GPIO_WritePin_Fast(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //switch off the pin 
     hspi3.Instance->DR = 0;
     while ((hspi3.Instance->SR & SPI_FLAG_RXNE) == 0){}       //Wait for Data Ready to Read
     RxData = hspi3.Instance->DR;                      //Read Data Register Directly

     HAL_GPIO_WritePin_Fast(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); // switch on the pin

__HAL_SPI_DISABLE(&hspi3);

spi外设配置:

/**
  * @brief SPI3 Initialization Function
  * @param None
  * @retval None
  */
static void MX_SPI3_Init(void)
{

  /* USER CODE BEGIN SPI3_Init 0 */

  /* USER CODE END SPI3_Init 0 */

  /* USER CODE BEGIN SPI3_Init 1 */

  /* USER CODE END SPI3_Init 1 */
  /* SPI3 parameter configuration*/
  hspi3.Instance = SPI3;
  hspi3.Init.Mode = SPI_MODE_MASTER;
  hspi3.Init.Direction = SPI_DIRECTION_2LINES;
  hspi3.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi3.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi3.Init.NSS = SPI_NSS_SOFT;
  hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi3.Init.CRCPolynomial = 7;
  hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI3_Init 2 */

  /* USER CODE END SPI3_Init 2 */

}

在这种情况下,它不起作用,有人知道如何解决这个问题吗?谢谢

你有两个错误:

首先,您正在等待循环中读取数据寄存器。您应该有一个空循环,在 RXNE 变为 1 之前不重复执行任何操作,然后读取数据。

其次,您不做任何触发时钟的事情。在主控模式下,时钟在您写入传输数据时启动。将芯片-select拉低后,向DR写入内容:

 HAL_GPIO_WritePin_Fast(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //switch off the pin 

hspi3.Instance->DR = 0; // output something on MOSI while reading MISO

 while ((hspi3.Instance->SR & SPI_FLAG_RXNE) == 0){}         //Wait for Data Ready to Read
  RxByte[0] = hspi3.Instance->DR;                      //Read Data Register Directly

 HAL_GPIO_WritePin_Fast(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); // switch on the pin