打印

SPI接口忙(busy)状态的使用

[复制链接]
4811|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2010-8-26 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在SPI接口的应用中,许多时候在给DR写入数据后要查询SPI的BUSY状态来确认数据是不是已经发送出去;许多器件中间不用等待立即查询就可以获得正确的结果,例如本人过去用的新华龙的C8051F340:
SPI0DAT=dat>>8;
while(SPI0CFG&0x80);
和TMS320F2812:
SpiaRegs.SPITXBUF    =dat<<8;
while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
都没有问题,也就是说这2个器件在数据写入数据寄存器后BUSY状态立即有效;但是在STM32F10x系列好像就不可以,本人在调试过程中开始也是这样用的:
SPI2->DR=Dat;
while(SPI2->SR & SPI_BUSY);
但是无论如何目的器件都没有正确动作,后经过示波器观察SCK和片选信号,发现SPI刚开始发送的时候片选就无效了,也就是说最终SPI是把数据发送出去了,但是从器件并没有收到数据;经过分析,得出在写入DR寄存器后BUSY不是立即有效,因此在while语句前插入一个适当的延时,就像这样:
SPI2->DR=Dat;
delay(1);
while(SPI2->SR & SPI_BUSY);
问题解决。
沙发
香水城| | 2010-8-26 09:47 | 只看该作者
解决问题的方法是对的。

这个问题的根源是因为STM32的内部结构导致的,Cortex-M3执行外设操作指令后,操作命令需要经过APB桥才能到达外设,同样外设的状态也要通过APB桥才能反馈回CPU,数据和命令信号经过APB桥时都会有时间延迟,结果就是楼主看到的情况。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

428

主题

1183

帖子

3

粉丝