【问题标题】:STM32 spi receive procedure without halSTM32 spi接收程序不带hal
【发布时间】:2021-05-07 00:38:40
【问题描述】:

下午好,

我是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 */

}

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

【问题讨论】:

    标签: stm32 spi


    【解决方案1】:

    你有两个错误:

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

    其次,您不做任何事情来触发时钟。在主模式下,时钟在您写入数据以进行传输时启动。把片选拉低后,往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
    

    【讨论】:

    • 非常感谢 Tom V.... 已编辑并开始做某事。主要问题是我不知道我需要写一些东西到 DR 寄存器。
    猜你喜欢
    • 2021-08-27
    • 2018-01-09
    • 2018-02-01
    • 2022-01-20
    • 2018-02-22
    • 2019-08-19
    • 2021-03-31
    • 2019-09-20
    • 2017-04-14
    相关资源
    最近更新 更多