高级会员

- 积分
- 560
- 金钱
- 560
- 注册时间
- 2016-4-12
- 在线时间
- 230 小时
|
1金钱
如题,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);
|
最佳答案
查看完整内容[请看2#楼]
这是因为发完(其实没完)命令后, CD由0转1, 因为判断的是TXE标志位, 它代表你已经把最后一个Command送到SPI_DR, 但SPI还没把它发送完成, 但这时你就把CD由0转1, 所以LCD会出错
要不就加Delay, 要不就多加一条判断SPI_Busy标志位, 才把CD由0转1发数据
同理发完数据如果紧接着再发Command情况也是一样的
|