首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPI同步思想

SPI同步思想
EN

Stack Overflow用户
提问于 2020-04-29 09:30:10
回答 1查看 395关注 0票数 2

我想知道是否还有其他方法来同步SPI通信。在STM示例中,我发现代码的这一部分工作如下:

代码语言:javascript
复制
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);
}

在没有使用循环的情况下,有什么解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 11:51:56

如果do -而不确定地等待同步的问题是不能在不能执行其他工作的情况下进行“繁忙-等待”,则解决方案包括:

architecture).

  • 使用RTOS调度程序,并在“其他工作”

  • 的单独SPI处理程序线程中等待,而不是轮询HAL_SPI_STATE_READY,使用SPI中断并检查中断处理程序中的同步字符。

  • 在do-while循环(所谓的“大循环”或“执行循环”)中执行“其他工作”。

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

代码语言:javascript
复制
bool synchronised = false ;

while(;;)
{       
    if( !synchronised )
    {
        if( 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
}

您可以通过创建一个函数(如:

代码语言:javascript
复制
bool isSlaveSynchronised()
{
    static bool synchronised = false ;

    if( !synchronised )
    {
        if( 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);
    }

    return synchronised ;
}

然后:

代码语言:javascript
复制
while(;;)
{       
    if( !isSlaveSynchronised() )
    {
        // do SPI work
    }

    // do other work
}

注意,带回家是一般的原则,而不是精确的代码。如果不知道从设备或应用程序的性质,就不可能是特定的。适应你的需要。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61498555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档