最近用硬件SPI来驱动TFTLCD屏幕,平常用SPI都是双向传输,实际上硬件SPI是支持单线只发送模式的。直接将SPI发送模式配置为SPI_Direction_1Line_Tx。然后修改SPI的发送函数为以下,发现并不能直接使用。
void SPI2_WR_Byte(u8 data)
{
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==0){;} //等待发送完成
SPI2->DR = data;
}
然后在网上查找相关硬件SPI单线只发送模式,有人说在SPI写入DR寄存器后还是会有两个APB1的时钟周期,那我等待忙BSY位为0时在发送第二个数据可以吗。
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空
SPI2->DR=TxData; //通过外设SPIx发送一个byte 数据 while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_BSY)== SET){}
还是不行。因为想到双线的时候需要读接收标志位。加上一个读接收标志位的操作试试看。
void SPI2_WR_Byte(u8 TxData)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空
SPI2->DR=TxData; //通过外设SPIx发送一个byte 数据
SPI2->SR&=(1<<0);
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_BSY)== SET){}
}
唉,果然LCD就可以电亮了。