STM32F411RE中的回送SPI

问题描述

我正在尝试使用STM32 HAL库在STM32F411RE中的SPI中进行环回。我已经连接了微控制器的MOSI,MISO引脚,串行端子中的输出失真了(只是盒子)。有人可以帮我指出问题所在。谢谢:)。

void SPI_call()
{
    int i = 0,size = 3;
    uint8_t tx_buffer[3] = {0x10,0x20,0x30};
    uint8_t rx_buffer[3] = {0x00,0x00,0x00};

    for (i = 0; i < size; i++) {
        HAL_SPI_Receive(&hspi1,&rx_buffer[i],1,100);
        HAL_SPI_Transmit(&hspi1,&tx_buffer[i],100);
        HAL_UART_Transmit(&huart2,HAL_MAX_DELAY);
    }
    
}

编辑: 使用API​​ HAL_UART_TransmitReceive()进行了尝试,但是我无法接收数据。

void SPI_call()
{
    uint8_t tx_buffer = 0x20;
    uint8_t rx_buffer;

    HAL_SPI_TransmitReceive(&hspi1,&tx_buffer,&rx_buffer,1000);
    HAL_UART_Transmit(&huart2,HAL_MAX_DELAY);   
}

解决方法

通常,SPI通信至少需要一个主机和一个从机。但是,由于SPI使用全双工通信(即,它同时进行发送和接收),通常可以将MOSI连接到MISO并实现回送通信。

我已经在Nucleo-F411RE上对其进行了测试,并且可以正常工作。

使用STM32CubeMX,我为Nucleo-F411RE配置了一个默认设置的项目(8 MHz外部时钟,SWD,适用于板载ST-Link的UART2引脚等)。另外,我启用了SPI2。 SPI1与Nucleo电路板布线冲突。我还短路了MOSI和MISO(PC2和PC3)。

我添加的唯一代码是 while 循环中的代码:

  while (1)
  {
    /* USER CODE END WHILE */

    HAL_Delay(1000);

    uint8_t tx_buffer[] = { 'H','e','l','o','\r','\n' };
    uint8_t rx_buffer;
    for (int i = 0; i < sizeof(tx_buffer); i++) {
      HAL_SPI_TransmitReceive(&hspi2,tx_buffer + i,&rx_buffer,1,100);
      HAL_UART_Transmit(&huart2,100);
    }

    /* USER CODE BEGIN 3 */
  }

供参考的SPI初始化(由STM32CubeMX生成):

  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }