高级会员

- 积分
- 640
- 金钱
- 640
- 注册时间
- 2018-8-9
- 在线时间
- 150 小时
|
本帖最后由 maidilong 于 2022-4-22 16:53 编辑
我经常看网上SPI的读写函数:
方式1:
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最近接收的数据
}
方式2:
u8 SPI2_ReadWriteByte(u8 TxData)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}
这两种方式就是少了中间那个等待时间,时间结束就跳,网上也有很多人用方式二的,所以肯定也是能用的,但我用板子试了一下,方式1是可以用的,原子的例程就是方式1,方式2在我板子上是用不了,
是不是卡死在检查标志位里了吧??我仿真了一下,没有卡死,就是我的SPI驱动的OLED屏没有亮,这是怎么回事了,难度又是我的SPI速度太快了,把SPI的时钟降到16分频,OLED一样的没能显示,改回
方式1就没问题,SPI的时钟用多少分频都能正常显示。
我把方式1的retry改成 if(retry>1),也能正常工作。
请问我要怎弄才能正常使用用方式2呢?
|
|