在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);
问题解决。 |