Arm 使用HAL在运行时STM32F4期间从SPI从站更改为主站

Arm 使用HAL在运行时STM32F4期间从SPI从站更改为主站,arm,stm32,communication,spi,hal,Arm,Stm32,Communication,Spi,Hal,我试图使两个带HAL的STM32F4通过SPI单工模式进行通信,方法是在准备发送消息时更改主节点。这两个平台都是从机开始的,它们会切换到主机以发送消息,然后返回到从机 while (1) { configSlave(); while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY_RX); HAL_SPI_Receive(&hspi1, (uint8_t *)buff, 13, 1000);

我试图使两个带HAL的STM32F4通过SPI单工模式进行通信,方法是在准备发送消息时更改主节点。这两个平台都是从机开始的,它们会切换到主机以发送消息,然后返回到从机

 while (1)
  {
      configSlave();

      while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY_RX);
      HAL_SPI_Receive(&hspi1, (uint8_t *)buff, 13, 1000);       /* Including this line generates the issue */

      HAL_Delay(10);

      configMaster();
      
      HAL_Delay(10);

      sendHelloWorld();
      HAL_Delay(10);
  }
configSlave()
之后使用
configMaster()
更改SPI配置,而不调用接收例程
HAL\u SPI\u receive()
效果很好。然而,如果我在两者之间添加receive例程,我的问题就来了

如果我在配置之间添加
HAL\u SPI\u Receive()。那么为什么会发生这种情况呢?这是一个去初始化问题吗

我确保在重新配置到每个模式之前对SPI外围设备进行去初始化,并在去初始化期间通过调试模式检查SPI寄存器是否为0。类似地,我确保每次全局SPI处理程序都重置为0,这样它就不会保留其他模式的一些配置

作为参考,这些是我的
configMaster()
configSlave()
例程

static void configMaster(void)
{
    if(HAL_SPI_DeInit(&hspi1) != HAL_ERROR)
    {
        memset(&hspi1, 0, sizeof(SPI_HandleTypeDef));

        /* SPI1 parameter configuration*/
        hspi1.Instance = SPI1;
        hspi1.Init.Mode = SPI_MODE_MASTER;
        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.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
        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();
        }
    }
}

static void configSlave(void)
{
    if(HAL_SPI_DeInit(&hspi1) != HAL_ERROR)
    {
        /* SPI1 parameter configuration*/
        hspi1.Instance = SPI1;
        hspi1.Init.Mode = SPI_MODE_SLAVE;
        hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
        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();
        }

    }
}
主机开始发送时钟的确切位置也发生在这里:
HAL\u SPI\u Init()

欢迎任何建议。谢谢

  /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/
  /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management,
  Communication speed, First bit and CRC calculation state */
  WRITE_REG(hspi->Instance->CR1, (hspi->Init.Mode | hspi->Init.Direction | hspi->Init.DataSize |
                                  hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |
                                  hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit  | hspi->Init.CRCCalculation));