我想知道是否还有另一种同步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循环的解决方案?
如果在同步期间执行无限期等待的问题是您无法在无法进行其他炒锅的情况下进行“忙碌等待”,则解决方案是:
在大循环解决方案中,您可能会有:
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
}