SPI驱动OLED问题,SPI读写需要加延时。

2019-07-21 00:32发布

如题,SPI读写函数如下,
void SpiSendCmd(u8 cmd)
{
        OLED_CS(LOW);
        OLED_DC(LOW);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,cmd);
//        delay_us(50);
        OLED_CS(HIGH);
}

void SpiSendData(u8 data)
{
        OLED_CS(LOW);
        OLED_DC(HIGH);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1,data);
//        delay_us(50);
        OLED_CS(HIGH);
        OLED_DC(LOW);
}

加上延时后,就可以显示,但是刷屏速度会很慢,如果注释带延时,就不会正常显示。不知道哪里出了问题。SPI初始化如下。
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_CRCPolynomial = 7;//
       
        SPI_Init(SPI1,&SPI_InitStructure);
        SPI_Cmd(SPI1,ENABLE);

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
edmund1234
2019-07-21 00:37
这是因为发完(其实没完)命令后, CD由0转1, 因为判断的是TXE标志位, 它代表你已经把最后一个Command送到SPI_DR, 但SPI还没把它发送完成, 但这时你就把CD由0转1, 所以LCD会出错
要不就加Delay, 要不就多加一条判断SPI_Busy标志位, 才把CD由0转1发数据

同理发完数据如果紧接着再发Command情况也是一样的

一周热门 更多>