SPI同步的思想

问题描述 投票:0回答:1

我想知道是否还有另一种同步SPI通信的方法。在STM示例中,我发现这部分代码有效:

void Slave_Synchro(void)
{
    uint8_t txackbyte = SPI_SLAVE_SYNBYTE;
    uint8_t rxackbyte = 0x00;

    do
    {
        if (HAL_SPI_TransmitReceive_IT(&SpiHandle, (uint8_t *)&txackbyte, (uint8_t *)&rxackbyte, 1) != HAL_OK)
        {
            Error_Handler();
        }

        while (HAL_SPI_GetState(&SpiHandle) != HAL_SPI_STATE_READY){}
    }
    while (rxackbyte != SPI_MASTER_SYNBYTE);
}

有没有不使用while循环的解决方案?

embedded stm32 spi
1个回答
0
投票

如果在同步期间执行无限期等待的问题是您无法在无法进行其他炒锅的情况下进行“忙碌等待”,则解决方案是:

  1. 使用RTOS调度程序,并在与“其他工作”不同的线程中进行繁忙等待。
  2. 而不是轮询HAL_SPI_STATE_READY,使用SPI中断并在中断处理程序中检查同步。
  3. 在do-while循环中进行“其他工作”(即所谓的“大循环”或“执行循环”架构)。

在大循环解决方案中,您可能会有:

bool synchronised = false ;

while(;;)
{       
    if( !synchronised && HAL_SPI_GetState(&SpiHandle) == HAL_SPI_STATE_READY )
    {
        if (HAL_SPI_TransmitReceive_IT(&SpiHandle, (uint8_t *)&txackbyte, (uint8_t *)&rxackbyte, 1) != HAL_OK)
        {
            Error_Handler();
        }
    }

    synchronised == HAL_SPI_GetState(&SpiHandle) == HAL_SPI_STATE_READY &&
                    rxackbyte == SPI_MASTER_SYNBYTE);

    if( synchronised )
    {
        // do SPI work
    }

    // do other work
}
© www.soinside.com 2019 - 2024. All rights reserved.