使用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,通过上述实验可以总结出,在发送完一次后必须进行
一定的延时(读数据寄存器起到的效果也是延时),才能正常发送。可这是为什么要添加延时呢,求大神解答?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-21 07:22
你操作太快了吧,呵呵.
没用过硬件SPI驱动OLED.
Coder
2楼-- · 2019-07-21 11:48
 精彩回答 2  元偷偷看……
磨剑
3楼-- · 2019-07-21 14:12
回复【2楼】正点原子:
---------------------------------
我的spi设置成256分频,频率算下来是328khz。而oled最大频率支持4mhz。速度应该没有io模拟spi操作快。
磨剑
4楼-- · 2019-07-21 19:07
回复【3楼】Coder:
---------------------------------
是因为速度的原因吗?
三叶草
5楼-- · 2019-07-21 23:32
我觉的还是驱动程序的问题!
严加伟
6楼-- · 2019-07-22 03:36
楼主搞定了吗,我现在也有这个问题

一周热门 更多>