最近转战ESP32,ESP32-D0WDQ6 型号的GPIO只有那么20个左右,且还有几个GPIO只能做输入,非常捉襟见肘。所以如果要驱动LCD液晶屏,绝大多数都会选择SPI接口的MCU屏

为了编写一个通用的ESP32-SPI-LCD驱动,前前后后买了一小桌液晶屏,用了十几款驱动IC,说下整个过程的选型、体验、注意事项:

驱动IC的重要参数

  • 像素点数(如240x320)
  • 色彩深度(18Bit-262K,24Bit-16.7M)

时序、接口这类的参数都不会差太多,各厂商的寄存器定义基本都保持一致,使得后期的驱动编写有很好的兼容性。

常说的262K、xx位色是什么意思?

先明确一个概念,大家都知道屏幕的像素点是由于RGB三种颜色构成的,而为了方便存储颜色信息,比较常用的颜色编码有 RGB888RGB666RGB565。其中RGB888使用8+8+8=24Bit=3Byte,RGB565使用5+6+5=16Bit=2Byte,由于这两种可以将颜色按照完整的字节顺序排列,又不会造成存储空间的浪费,所以得到广泛使用。

262K说的是屏幕像素为RGB666,因为单个像素可以显示 2^18 = 262,144 种颜色,所以便叫 262K。
16.7M 的来源便是RGB888,2^24 = 16,777,216。
RGB888相比RGB666,在每个像素上多出了两位,所以16.7M的显示效果要比262K更加细腻。

支持3/4线SPI的驱动IC型号

支持3/4线SPI的驱动IC大致有:(比较常见的)

  • ST7735(132x162,262K)支持SPI-RGB565(2字节)、SPI-RGB666(3字节)

  • ST7735S(132x162,262K)支持SPI-RGB565(2字节)、SPI-RGB666(3字节)

  • ST7789V(240x320,262K)支持SPI-RGB565(2字节)、SPI-RGB666(3字节)

  • ST7796S(320x480,262K)支持SPI-RGB565(2字节)、SPI-RGB666(3字节)

  • ILI9225(176x220,262K)支持SPI-RGB565(2字节)、SPI-RGB666(3字节)

  • ILI9341(240x320,262K)支持SPI-RGB565(2字节)、SPI-RGB666(3字节)

  • ILI9481(320x480,262K)94xx仅支持SPI-RGB666(3字节)

  • ILI9486(320x480,262K)94xx仅支持SPI-RGB666(3字节)

  • ILI9488(320x480,16.7M)94xx仅支持SPI-RGB666(3字节)

  • HX8357(320x480,16.7M)支持SPI-RGB565(2字节)、SPI-RGB666(3字节)

注意:ILI94xx用SPI写GRAM时,仅有3字节的RGB666可用(这一点巨坑)。而同分辨率的ST7796S、HX8357 同时支持2字节的RGB565,传输效率更高。相同SPI速率下,刷屏可节约1/3的时间。
【实际过程中快的可不止1/3。因为RGB565正好占用2个字节,并且ESP32的内存为小端,在内存中的存储顺序与SPI发送顺序一致,可以由uint16_t指针直接用DMA发送,中间不需要任何格式转换。而3字节的RGB666需要将在内存中的2字节RGB565重新转换,既浪费计算的时间,也浪费发送的时间,还要单独腾出一块内存来存放这并不实用的RGB666

注意:由于上面的原因,ESP32的LCD选型非常不建议用 ILI94xx。不仅仅是刷屏慢,也会造成后期的驱动编写不统一,费时费力。

注意:即使驱动IC支持16.7M的24位色,用SPI接口写像素也不支持RGB888,最大只支持到RGB666,这好像是IC设计厂商一个约定俗成的习惯。

SPI接口写GRAM像素的时序

SPI接口 - 2字节/像素 - RGB565 传输时序:

(ILI9341数据手册配图)

SPI接口 - 3字节/像素 - RGB666 传输时序:

LCD液晶屏的寄存器功能

寄存器 功能
0x36 设置扫描方向、设置RGB/BGR像素格式
0x3A 设置像素格式 16/18 Bits/像素
0x2A 0x2B 设置GRAM行列的写入坐标,和写入窗口的大小
单字节命令 功能
0x01 软复位
0x21 颜色反显
0x11 退出睡眠
0x29 开启显示
0x2C 写GRAM

上述两个表格为一些常用的寄存器功能。各厂家的IC均保持一致。
电源配置、帧率配置、伽马配置 一般会有很大的不同,详见手册或者厂家例程。

其他注意事项

  • ESP32的SPI最大可配置CLK80MHz,但必须使用IOMUX默认的引脚。使用GPIO矩阵任意引脚映射的方式,会令SPI限制在30MHz。(实际有没有80MHz不清楚,但我用60MHz的速率跑时明显比26MHz刷屏快很多)

  • 单片机用SPI接口刷LCD,尽量使用 2字节/像素-RGB565 的方式,相较于 3字节/像素-RGB666 可以有效提高刷新速率。(ILI94xx就尽量别用SPI了,本来SPI就快不到哪去,3字节/像素更拉跨)

  • STxxxx 的GRAM 有偏移量,且改变行列的扫描方向后,偏移量也会跟着改变,更可怕的是不同型号IC的偏移量也不同。而ILIxxxx则完全没有偏移量,驱动写起来更舒服。

  • ILI9481手册中,给出的PCLK最大速率为可怜的9.6MHz,实测为16MHz以上,但再往上上20MHz就上不去了,而其他的IC基本都实测过60MHz,跟其他的一比实在是慢的可怜。并且 ILI9481 在官网找不到,好像停产了,慎用。

一些感慨和吐槽:esp32的IDF开发环境,在国内MCU的SDK中绝对可以称得上是佼佼者,但选型使用起来总觉得差点意思。例如 esp32的io少又没有usb、s2没蓝牙、s3又不知何时能买到。个人感觉可以趁stm32涨价,出一波有蓝牙+USB+改进ADC的芯片,不需要WIFI,趁机抢占低功耗/通用MCU市场,类似nrf52832的定位。日常使用中感觉esp32就是功耗大了些、ADC不好用些、缺少IO和并口,其他功能是可以替代stm32这类通用mcu的。而阉割掉WIFI,给功耗降下来,现在价格相差那么悬殊的情况下,必定会吸引一大波低功耗+通用MCU的份额。毕竟有IDF和Arduino那么多库加持,生态才是esp32最大的优势。


ESP32开发板开源计划


  现已开源一款ESP32物联网开发板,支持WIFI、蓝牙、以太网、RS485、CAN通信。板载6轴IMU、温湿度传感器、38K红外遥控收/发、独立RTC、TF卡座。USB和18650双电源供电,有2.0寸单点电容屏可用,配套各外设驱动和LVGL源码。Github、立创EDA、CSDN全云端同步更新。

  详情可见:

  • ESP32-IOT-KIT 开发板介绍
    ESP32开发板开源啦 ESP32-IOT-KIT全开源物联网开发板

  • PCB硬件
    立创EDA:ESP32开发板 IOT-KIT原理图、PCB、BOM

打样免费的时代,速去JLC白嫖PCB。

开源学习交流Q群:827686418

ESP32驱动LCD液晶屏选型、262K什么意思?SPI写LCD的GRAM时序、MCU液晶屏驱动IC的寄存器功能相关推荐

  1. 【嵌入式】MCU(HC32F460)+SPI接口LCD液晶屏ILI9341 移植emWin记录1----点亮LCD屏

    目录 一 SPI屏的接线 二 SPI屏驱动初始化 三 SPI屏点亮 四 附录 一 SPI屏的接线 SPI屏的特点在于接线简单,只需要四根SPI线以及几个GPIO口即可驱动工作,但是由于非并口的,所以当 ...

  2. 手机屏和大屏LCD显示面板接口(和处理器连接的接口类似12864等单片机处理器和屏接口的8086,SPI等并口串口屏以及RGB屏接口)LVDS接口常见于液晶电视中。eDP,LVDS,MIPI,HDMI

    mipi是手机液晶屏最常见的接口了 现在普遍的16:9或者16:10的宽屏,LCD接口大部分都是LVDS,也有RSDS接口,不过比较少.接口一般都是30PIN,不过由于尺寸不同,分辨率的不同,所用到的 ...

  3. [MM32生态]如何使用不带SLCD控制器的MCU IO直接驱动段码屏

    前言 相信大家都对段码液晶屏都不陌生了,在电子大爆炸的日常生活中到处可以见到它的身影,比如在通信工具.家用电器.仪器仪表.交通工具.文教体娱.医疗保健.光阀产品等等应用领域.段码屏一般外形尺寸都在 2 ...

  4. 启明云端分享| 家电应用 串口屏选型推荐

    提示:近日小明做了一份针对90后人群的家电选用调查问卷,90%的人都选择了价格不要太贵.功能要强大点.操控智能,颜值是首选.不可否认,90后群体逐步成为家电消费市场的有生力量,他们对家电的需求代表着年 ...

  5. lcd背光节能matlab代码,【技术分享】LCD背光驱动节电技术-LABC/CABC

    LCD背光驱动节电技术-LABC/CABC 图像永远是最直观的表现方式,而LCD正是目前应用最多的表现媒介.随着技术的增强,人类对视觉的要求不断提高,对图像的分辨率.色彩的要求也越来越高. 我们的手机 ...

  6. 手机丅f丅lcd什么屏_小米10T系列发布:LCD/直屏爱好者请看过来

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这年头想买个稍微高端些的LCD显示屏机器着实不容易,本来用LCD显示屏的手机就少,用高品质LCD显示屏并且还搭配旗舰级别硬件的自然就更少.小米刚推出的10 ...

  7. STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏

    STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏 电子纸墨水屏具有断电界面不失和低反光度的护眼效果.QYEG0213RWS800是2.13寸黑白红三色墨水屏,分辨率为250*122. STM3 ...

  8. Ubuntu NVIDIA显卡驱动工作模式切换,无法检测到笔记本自带屏幕,屏幕无法工作/黑屏

    Ubuntu NVIDIA显卡驱动工作模式切换,无法检测到笔记本自带屏幕,笔记本内置屏幕无法工作 问题描述 解决方法 总结 问题描述 联想Y9000P ubuntu20.04装完nvidia显卡驱动后 ...

  9. LCD控制器的原理及各寄存器功能的详细讲解

    LCD工作原理            如图4-24 所示,LCD 的横截面很像是很多层三明治叠在一起.每面最外一层是透明的玻璃基体,玻璃基体中间就是薄膜电晶体.颜色过滤器和液晶层可以显示出红.蓝和绿三 ...

最新文章

  1. C++知识点28——使用C++标准库(再谈迭代器)
  2. python使用手册-python 教程与手册(60IN1合集)
  3. Android开发中如何使用RecyclerView
  4. Mongodb学习(安装篇): 在centos下的安装
  5. python find函数实现原理_非常干货:Python 探针实现原理
  6. 5919. 所有子字符串中的元音
  7. c语言程序设计基础1千克,c语言学习知识编程经典编辑题汇总整编.doc
  8. linux默认安装数据库密码是多少,Linux服务器上安装MySql数据库(默认安装,密码为空),首次使用需要修改密码(示例代码)...
  9. PaddlePaddle飞桨OCR文本检测——识别图片文字结果并保存为txt(五)
  10. python pyquery不规则数据的抓取_11. 数据提取-PyQuery
  11. 常用数据库优化方案(五)
  12. 【图像去噪】基于matlab中值+均值+高斯+Laplacian+Sobel+Prewitt图像去噪【含Matlab源码 025期】
  13. idea项目工具窗口
  14. linux的进程rl,linux 进程 rl是什么状态
  15. win7主机 ubuntu10.04虚拟机 共享文件夹设置
  16. 百度实时主动推送url
  17. jdk1.8 stream() 把List对象 变成String
  18. 详解自定义钉钉机器人推送消息(一) PHP篇
  19. 「ReactNaitve」对hooks最佳实践的探索
  20. 如何让一张图片填满整个页面

热门文章

  1. Gulp和Webpack对比
  2. mac 安装memcached服务
  3. current online redo logfile 丢失的处理方法
  4. (转)VC++多线程编程
  5. iptables表与链的相关性图
  6. 【Java从0到架构师】SpringBoot - 页面模版_Thymeleaf
  7. IDEA 2020 配置 Maven 创建 Spring Boot 项目
  8. Windows域控 设置全域的密码策略 【全域策略生效】
  9. 不需要Excel的可视化大屏,究竟可以多炫酷?附20份模板
  10. 就数据平台建设,80%的500强企业都有一个共性