如何将 STM32f4 编程为 SPI 从设备

Posted

技术标签:

【中文标题】如何将 STM32f4 编程为 SPI 从设备【英文标题】:How to program STM32f4 as SPI Slave 【发布时间】:2021-12-09 18:00:41 【问题描述】:

我在 SPI 从模式下编码 STM32F407 时遇到问题, 在我的例子中,Master是ADE7880 IC,Slave是STM32F407, .

我是初学者,我已经连接了 ADE7880 数据表中提到的相同引脚和使用 STM32cubeMX 生成的代码,

    static void MX_SPI1_Init(void)


  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = 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.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 */


然后在main中

hal_status=HAL_SPI_Receive(&hspi1, (uint8_t *)spi_buf, 1, 100);
// hal_status = HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 2, 1000);

它返回超时错误, 我的编程方面还好吗????

【问题讨论】:

代码中的主要问题可能是 NSS 设置。设置它“硬件NSS输入信号”。否则,您必须通过寄存器告诉 SPI 外设 NSS 何时为高,何时为低。 您可能遇到的下一个问题是您会丢失数据,因为 MCU 并不总是准备好接收 SPI 数据。您可能需要在 DMA 模式下使用 SPI 来解决它。 【参考方案1】:

hspi1.Init.NSS = SPI_NSS_SOFT;

此行正在配置要由软件管理的从选择行。

你想要

hspi1.Init.NSS = SPI_NSS_HARD_INPUT;

您将要触发 RXNE 的中断。您需要像这样在配置中指定回调函数

hspi2.RxISR = callback_func;

像这样启用中断

__HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_RXNE);

最后,CLK极性和相位设置

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

ADE7880 错误。对于该 IC,这些值分别为高和尾随。您可以通过阅读ADE7880 datasheet 中的 SPI 时序图来判断这一点。您应该将它们更改为:

  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;

【讨论】:

以上是关于如何将 STM32f4 编程为 SPI 从设备的主要内容,如果未能解决你的问题,请参考以下文章

如何在stm32f2xx or stm32f4xx中使用spi dma来完成全双攻通信

STM32F4 SPI1 工作,SPI5 不工作?

STM32F4 SPI接收中断不起作用

STM32F4 HAL SPI_Receive dma 只接收一次

请教STM32F103与DSP采用SPI通信的问题!

STM32主/从SPI通信使用HAL_SPI_TransmitReceive()