天天看点

STM32的SPI2操作Flash

关于STM32F107的SPI标志 SPI_I2S_FLAG_BSY和SPI_I2S_FLAG_TXE的疑问   ​​ ​​

用STM32 SPI1驱动DAC7611,在发送数据的时候用了while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);等待发送缓冲区为空后再拉高CS。结果发现在数据(16位)没有发送完时,就执行了CS拉高。然后我换了这个语句while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);就正确了。我想知道,STM32如何判断发送缓冲区为空的?这两个标识位的判断有什么区别?

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET); //等待发送完成

while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_BSY)==SET);

只发送过程(BIDIMODE=0并且RXONLY=0)

在此模式下,传输过程可以简要说明如下,使用BSY位等待传输的结束(见图215

466/754

和图216):

1. 设置SPE位为’1’,使能SPI模块;

2. 在SPI_DR寄存器中写入第一个要发送的数据,这个操作会清除TXE标志;

3. 等待TXE=1,然后写入第二个要发送的数据。重复这个操作,发送后续的数据;

4. 写入最后一个数据到SPI_DR寄存器之后,等待TXE=1;然后等待BSY=0,这表示最后一个数据的传输已经完成。

也可以在响应TXE标志的上升沿产生的中断的处理程序中实现这个过程。

注: 1. 对于不连续的传输,在写入SPI_DR寄存器的操作与设置BSY位之间有2个APB时钟周期的延迟,因此在只发送模式下,写入最后一个数据后,最好先等待TXE=1,然后再等待BSY=0。

2. 只发送模式下,在传输2个数据之后,由于不会读出接收到的数据,SPI_SR寄存器中的OVR位会变为’1’。(译注:软件不必理会这个OVR标志位)

是配置的时候有点问题,

    SPI_InitTypeDef  SPI_InitStructure;

      SPI_Init(SPI2, &SPI_InitStructure);

     SPI_InitTypeDef  *SPI_InitStructure;

      SPI_Init(SPI2, SPI_InitStructure);