高级会员

- 积分
- 572
- 金钱
- 572
- 注册时间
- 2018-4-16
- 在线时间
- 77 小时
|
1金钱
spi.c节选一个函数 spi读写函数
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}
这是原子哥的代码。我有点不解。采用这种retry自增的方式超时退出的机制,一定程度上避免了死在等待上,假设没有retry,假设执行while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);到这一步恰好从机可能是坏的没有返回数据,那么就会死在这里;现在要是从机是好的但从机返回的数据刚好要是0x00,如何区分到底是读写失败返回的0还是读写成功后从机返回的0呢?还是说这样写是因为从机一定不会返回0x00?
|
最佳答案
查看完整内容[请看2#楼]
哇。。突然间懂了。。被我刚才上一楼回复你的那段话惊醒。根本不存在卡死在等待接收上。就算从机坏了始终是一个固定电平那么主机在发完数据的时候肯定同步收到数据。最多是数据线没有变动接收到0x00或者0xff。发完肯定能接收到。顶多接收的数据是没有点平变化的数据(0x00或者0xff),肯定不会卡在等待接收上。
|