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