LCD驱动使用的3-line SPI和4-line SPI

0 Preface/Foreword

在做LCD显示项目时候,需要驱动一个LCD,那么就会接触到LCD驱动接口,常用的有8080,QSPI,3-line SPI,4-line SPI。

下面将以实际案例来介绍3-line4-line SPI接口。

LCD驱动接口中的SPI和标准的SPI接口有没有异同点?

0.1 Terms

CPOL:时钟极性,表示SPI空闲时电平

CPHA:时钟相位,表示采样是哪个边沿,上升沿(第一个边沿)还是下降沿(第二个边沿)。

1 3-line SPI

1.1 ST7735S

这里的3线和4线,主要是总共的信号线,不是只数据线:

3线一帧数据,包含9bits,其中最高位标识命令还是数据

  • CLK
  • SDA
  • CS 

4线:一帧数据,包含8bits,命令和数据由另外一个信号线指示。

  • CLK
  • SDA
  • CS
  • SEL:区分命令和数据 

如下为3线9bits数据格式

在代码实现的时候,一帧数据就是按照9-bit来发送。 

2 4-line SPI

D/CX高低电平

  • 高电平:数据
  • 低电平:命令

2.1 ST7735S 

2.2 ST7789V

 

 

 

### ESP-IDF 使用 SPI 接口驱动 LCD 屏 为了在 ESP32 上使用 ESP-IDF 框架通过 SPI 接口驱动 LCD 屏幕,通常需要配置硬件连接、初始化 SPI线以及设置显示屏的具体参数。以下是详细的说明示例代码。 #### 硬件准备 确保正确连接 ESP32 LCD 屏之间的信号线。对于 SPI 显示屏来说,主要涉及 MOSI (Master Out Slave In),MISO (Master In Slave Out),SCLK (Serial Clock Line),CS (Chip Select),DC (Data Command) 及 RST (Reset) 这些管脚的接法[^2]。 #### 初始化 SPI线 创建一个新的 C 文件用于实现 SPI 的初始化工作: ```c #include "driver/spi_master.h" #include "lcd.h" spi_device_handle_t spi; void lcd_spi_init(void){ const spi_bus_config_t buscfg={ .miso_io_num=PIN_NUM_MISO, .mosi_io_num=PIN_NUM_MOSI, .sclk_io_num=PIN_NUM_CLK, .quadwp_io_num=-1, // Not used with standard SPI .quadhd_io_num=-1 // Not used with standard SPI }; spi_bus_initialize(VSPI_HOST,&buscfg,0); const spi_device_interface_config_t devcfg={ .command_bits=8, .address_bits=8, .mode=0, // SPI mode 0 .duty_cycle_pos=128, // Symmetric duty cycle .cs_ena_pretrans=5, // CS enable time before transaction starts .clock_speed_hz=40*1000*1000,// Clock out at 40 MHz .spics_io_num=PIN_NUM_CS, // CS pin .flags=SPI_DEVICE_HALFDUPLEX }; spi_bus_add_device(VSPI_HOST,&devcfg,&spi); } ``` 这段程序定义了一个名为 `lcd_spi_init` 函数用来建立 VSPI 主机与设备间的通信链路,并设置了相应的时钟频率其他必要的属性。 #### 设置显示控制器命令集 接着要编写针对特定型号液晶面板的数据发送函数,这里假设采用 ST7789V 控制器为例: ```c #define CMD_SWRESET 0x01 #define CMD_SLPOUT 0x11 ... static void send_command(uint8_t cmd,uint8_t *data,size_t length){ esp_err_t ret; spi_transaction_t t; memset(&t,0,sizeof(t)); if(data==NULL){ // Send command only when data is null t.length=8; // Command is sent as a single byte t.tx_buffer=&cmd; t.flags=SPI_TRANS_USE_TXDATA; ret=spi_device_polling_transmit(spi,&t); assert(ret==ESP_OK); return ; } // Send both command and data t.length=(length+1)*8; static uint8_t hbuff[64]; hbuff[0]=cmd; memcpy(hbuff+1,data,length); t.tx_buffer=hbuff; t.flags=0; ret=spi_device_polling_transmit(spi,&t); assert(ret==ESP_OK); } // Initialize the display controller void init_display(){ send_command(CMD_SWRESET,NULL,0); // Software reset delay_ms(150); ... } ``` 上述片段展示了如何向显示器发出控制指令的方法,包括软件重置操作等基本功能调用。 #### LVGL 图形库集成 如果打算利用图形界面开发,则可考虑引入轻量级 GUI 库——LVGL 来简化 UI 设计过程。按照官方文档指导完成移植后,在项目源码里加入如下几行以启动绘图引擎并关联至物理屏幕输出路径[^3]: ```c lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.flush_cb = my_disp_flush; lv_disp_drv_register(&disp_drv); ``` 其中 `my_disp_flush()` 是自定义回调方法负责实际渲染像素点位信息给到外部器件处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值