OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2872|回复: 2

F0的SPI在读写时卡死。

[复制链接]

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
发表于 2017-6-13 10:55:03 | 显示全部楼层 |阅读模式
1金钱
我在用F091的SPI进行通讯时,一直没反应,SPI的配置都正确,代码如下[mw_shl_code=c,true]u8 dSPIN_Write_Byte(u8 TxData)
{       
        CS_X = 0;       
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){;}//等待发送区空         
        SPI_SendData8(SPI1, TxData); //通过外设SPIx发送一个byte  数据        
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;}
        CS_X = 1;                       
        return SPI_ReceiveData8(SPI1); //返回通过SPIx最近接收的数据       
}[/mw_shl_code]
经过调试发现程序一直卡在while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} ,我也上网查了一下感觉最合理的解释是:调试过程中,如果打开了SPI监控窗口,如果调试器先读走了DR的内容,就会导致RXNE位被清除,导致死在while中。
然后我在while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} 后面加了使LED灯亮的语句,结构运行时LED灯不亮。说明确实是卡在这里。不知为何原因。
最后我根据某网友的解决办法,把
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;}
改为
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){;} //等待接收完一个byte  
程序正常运行,SPI也可以通讯了。
请问万能的坛友while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} 卡死的原因是什么啊?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

175

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-30
在线时间
141 小时
发表于 2017-6-13 13:42:33 | 显示全部楼层
因为你没有接收数据啊、、、、、、、
回复

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
 楼主| 发表于 2017-6-13 14:18:41 | 显示全部楼层
执迷 发表于 2017-6-13 13:42
因为你没有接收数据啊、、、、、、、

没接收到数据的话,那就表明也没有数据发送。但是我确实把数据发出了的呀!不解啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-18 18:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表