微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 HAL

如何解决使用 HAL

我试图通过在准备发送消息时更改谁是主节点来使两个带有 HAL 的 STM32F4 通过 SPI 单工模式进行通信。两个平台都从slave开始,然后变成master发送消息,然后又回到slave。

 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);
  }

configMaster() 之后使用 configSlave() 更改 SPI 配置而不调用接收例程 HAL_SPI_Receive() 效果很好。但是,如果我在两者之间添加接收例程,我的问题就会出现。

如果我在将节点更改为主控时在配置之间添加 HAL_SPI_Receive(),则该节点将开始通过 CLK 引脚发送恒定时钟并将 DATA 引脚拉低,直到我发送 Hello World 消息。那么为什么会发生这种情况呢?是不是去初始化问题?

我确保在重新配置为每种模式之前取消初始化 SPI 外设,并通过调试模式检查取消初始化期间 SPI 寄存器是否为 0。同样,我确保每次全局 SPI 处理程序都重置为 0,这样它就不会保留其他模式的某些配置。

enter image description here

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

static void configMaster(void)
{
    if(HAL_SPI_DeInit(&hspi1) != HAL_ERROR)
    {
        memset(&hspi1,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_SPI_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));

欢迎提出任何建议。谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。