关于三线SPI驱动ST7789V

三线SPI驱动ST7789V

最近在做项目的过程中,公司采购了一款由ST7789V驱动的屏幕。由于考虑到FPC形状,又本着节约开模定制的钱,故而买了三线SPI接口模式的屏幕。

三线SPI,即硬件接口只有SDA数据线,CLK时钟线以及CS片选。三线SPI最尴尬的就是不像四线SPID/C数据/命令选择线,三线SPI要想区分发的是数据还是命令,那就要在8位数据前多发一位0/1,进而确定发的是数据还是命令。如下所示:
在这里插入图片描述
那这就很尴尬了,本身我们SPI就是发的8位数据,这就违背了标准的SPI协议。在程序上,用模拟SPI我们还能仿照时序,但是我们用硬件SPI又该如何发送?才能让ST7789V准确接收并识别呢?

其思想就是9位数据按照按照两个字节发,SPI从高位开始发送,发完有效的9位数据后,剩下发7个零就可以。这样显然浪费了资源,但这却是不改变硬件下最好的解决办法。

我写这篇文章的主要目的是记录一下封装SPI发送16位数据的函数,发送单个数据程序写起来并不困难。我在后续用于填充颜色时,发现颜色填充并不理想,后来去翻了ST7789V的手册,找到了发送颜色的时序,也是自己做了修改和优化。为了防止以后再碰到浪费时间,我这里做一下简单的记录。

我用的芯片时Nordic公司的一款芯片,但是处理流程同样适用STM32,只需要修改一下SPI发送函数即可。

关于三线SPI驱动ST7789V_第1张图片
我选择的时65K16位真彩色模式。即RGB各占位数5-6-5,根据上图时序,我们利用硬件SPI需要处理成标准8位格式,就需要把一个16位的颜色分成3个8位来发,并且还要满足上图的时序。具体原理我这里就不进行详述,我将我代码贴到下面,并不难理解,就是利用位运算,大家自己在纸上画一画就可以明白其中的缘由:

//写16位数据
//data:要写入的值---发数据
void LCD_WR_DATA(uint16_t data)
{
     
		uint32_t Dat=0;
    	uint8_t len = 3;
		uint8_t	Dat2=0,Dat3=0;
		Dat = data;
		Dat = Dat<<7;
		Dat |= 0x800000; //发送数据,高位需要置1
		spi_tx_buf[0] = (Dat&0xff0000)>>16;
		Dat2 = (Dat&0x007E00)>>9;
		Dat2 |=0x40;
		if((Dat&0x8000)!=0x00)
		{
     
				Dat2 |=0x80;
		}
		spi_tx_buf[1] = Dat2;
		Dat3 =(Dat&0x0000ff)>>1;
		if((Dat&0x100)!=0x00)
		{
     
				Dat3 |=0x80;
		}
		spi_tx_buf[2] = Dat3;
	  spi_xfer_done = false;
	  APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, spi_tx_buf, len, spi_rx_buf, len));
    while(!spi_xfer_done);

}

到这里,记录就完成了。也欢迎广大同学留言讨论。

你可能感兴趣的:(嵌入式,单片机)