我想知道是否还有其他方法来同步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);
}在没有使用循环的情况下,有什么解决方案吗?
发布于 2020-04-29 11:51:56
如果do -而不确定地等待同步的问题是不能在不能执行其他工作的情况下进行“繁忙-等待”,则解决方案包括:
architecture).
在大循环解决方案中,您可能拥有:
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
}您可以通过创建一个函数(如:
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 ;
}然后:
while(;;)
{
if( !isSlaveSynchronised() )
{
// do SPI work
}
// do other work
}注意,带回家是一般的原则,而不是精确的代码。如果不知道从设备或应用程序的性质,就不可能是特定的。适应你的需要。
https://stackoverflow.com/questions/61498555
复制相似问题