使用SPI遇到问题,请使用过spi的同学过来看看

2019-07-21 03:25发布

使用spi驱动oled时,在实现发送函数时,遇到了问题。

1、实现方法1:
void SPI1_WriteByte(u8 TxData)
{
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  
    SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte  数据
}
使用这种方法时,oled无法工作。

2,论坛里面找到方法是:在发送函数里面同时进行读写数据寄存器。
实现方法2:
void SPI1_WriteByte(u8 TxData)
{
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  
    SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte  数据

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte  
    SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}
使用这种方法可以正常驱动oled。但是根据spi的通信协议,没有必要在发送函数里面同时读写数据寄存器,于是使用了第三种方法。

3,通过添加延时取代读数据寄存器。
实现方法3:
void SPI1_WriteByte(u8 TxData)
{
    int i;

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  
    SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte  数据

    for(i = 0; i < 1000; i++);
}
使用这种方法可以正常驱动oled。

4,通过上述实验可以总结出,在发送完一次后必须进行
一定的延时(读数据寄存器起到的效果也是延时),才能正常发送。可这是为什么要添加延时呢,求大神解答?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。