首先,MIPI(Mobile Industry Processor Interface)移动行业处理器接口联盟不仅开发了新标准,还将现有的显示借口进行了标准化。这其中包括MIPI-DBI、MIPI-DPI、MIPI-DSI、MIPI-CSI等:
1)MIPI-DBI是MIPI联盟发布的第一个显示标准,用来规定显示接口。MIPI-DBI中定义了三类接口:
- A类:基于Motorola 6800总线
- B类:基于Intel 8080总线
- C类:基于SPI协议
2)MIPI-DPI通过TFT控制器对接口进行标准化。用来与没有帧缓冲器的显示器进行连接。像素数据必须实时流式传输到显示器。
3)MIPI_DSI封装了DBI或DPI信号,采用高带宽多通道差分链路,它使用标准的MIPI D-PHY作为物理链路。
STM32 MCU支持的显示接口类型如下:
- 所有STM32 MCU均支持MIPI-DBI C类(SPI)接口
- 带F(S)MC的所有STM32 MCU均支持MIPI-DBI A类和B类接口,即将LCD当存内存一样接在FSMC接口上
- 带LTDC的STM32 MCU支持MIPI-DPI接口
- 嵌入DSI主机的STM32 MCU支持MIPI-DSI接口
大致来说,103等可以采用FSMC接口,429等可以采样LTDC RGB模式,469、769等可以使用DSI模式。几种模式的整体流程图如下:
- DBI(Display Bus Interface)
DBI(Display Bus Interface), 显示总线接口, 也称MCU接口或者80/8080接口,DBI接口最大的特点就是LCM自带framebuffer, 存储Host端发过来的数据, 并由内部的控制IC不断重复的刷到LCD上, 也就是说其内部实现了自刷新, Host只要发送一次数据即可, 这帧数据会一直显示在屏幕上。由于不需要Host端自刷新,对Host处理器的要求很低, 没有时钟线,Host和LCM可以是简单的GPIO相连
DBI传输可以选择并口和串口传输,两者差别就是数据线数量不同,时序是相同的。
- 并行传输一般包括以下信号线:
CSX: 片选信号,图中低电平有效; D/CX:数据/命令信号;WRX: 写使能, 上升沿锁存;RDX:读使能, 上升沿锁存;D[17:0]: 数据线
M0~3四根引脚有0000、0001、0010、0011四种配置,分别对应8位、16位、9位、18位并行数据线
TE(tearing effect)引脚用于同步,可以指示LCM一帧数据是否刷完(也可配置LCM每刷多少帧产生一个信号告知Host)
以上信号线中,除数据线外,其它信号线表示的写或读的时序,具体的写或读的内容是通过数据信号线传输的,可以是命令或像素点值,命令又分为带参数和不带参数两种,带参数则均为两个字节。上面的M0-3配置了数据线的条数,每种配置根据信号线时序的不同,又分为四种:写数据或命令的参数、写命令、读数据、读命令的参数。具体的时序图如下
以RGB565为例:先发送写内存命令0x2c, 接着开始写帧数据,即连续发送所有像素点的数据
并行传输接口可以用FSMC接口来实现,并且FSMC接口支持6800和8080两种模式
- 串行传输则有三条线和四条线两种:
1)3线制时信号分时钟DCX、片选CSX、数据SDA,特别注意,3线制每传输一个字节需要9bit, 多出一个bit来表示该字节是命令还是数据,用GPIO实现相对较好,因为SPI的每字节只能是8位,即使指定spi->bits_per_word = 9,SPI也会将其自动转为读取两个字节。
2)4线制每byte就是8bit,通过这根多出的引脚告知LCM这个byte是命令还是数据。
- DPI(Display Pixel Interface)
显示像素接口, 也称RGB接口, 之所以叫像素接口, 是因为数据采用并口在一个时钟周期就传输一个像素的数据, 所以时钟一般设置像素时钟而不是bit时钟。与DBI不同的是, LCD端没有framebuffer, 转移到Host端, 所以为了维持画面能够持续显示在屏幕上, Host要持续发送数据过去, 并且为保证数据的同步, 引入VSYNC/HSYNC等功能(更准确说是继承了以前的叫法),信号包括
Vsync:帧同步信号 vbp: 帧同步信号的后肩,单位为1行的时间。vfp: 帧同步信号的前肩,单位为1行的时间。
Hsync:行同步信号, hbp:行同步信号的后肩,单位为1像素的时间。hfp:行同步信号的前肩,单位为1像素的时间。
Dotclk:点时钟或称像素时钟 DE: 数据有效信号(屏蔽掉前后肩)
但是这里特别注意的是,vbp/vfp/hbp/hfp这四个参数只是为了兼容以前的CRT显示器而保留的,而物理管脚上,这四个信号无论是CRT还是LED也不需要单独的管角,它是用DE信号和Vsync、Hsync组合来实现这个四个参数的。
同时,DPI接口的数据管脚只传输数据,命令由单独的SPI接口来传输,所以典型的DPI控制器管脚包括:CS、RST、SCL、SDA、Vsync、Hsync、DOTCLK、DB(0-15),其中时钟是像素时钟,即一个象素点的16位或24位数据是在一个像素时钟内并型传输过去的
LCD显示需要显示控制器,显示控制器是LCD越来越大,功能越来越多的发展结果。 LCD控制器同LCD驱动器是有着本质区别的。简单来说LCD控制器在嵌入式系统中的功能如同显卡在计算机中所起到的作用。LCD控制器负责把显存(可能是内存中的指定域)中的LCD图形数据传输到LCD驱动器(LCD driver)上,并产生必须的LCD控制信号,从而控制和完成图形的显示,翻转,叠加,缩放等一系列复杂的图形显示功能。LCD驱动器则只负责把CPU发送的图像数据在LCD显示出来,不会对图像做任何的处理。LCD控制器可以兼容各种各样的CPU接口以及各种各样的LCD模块的接口,硬件完成复杂图像显示功能(缩放,翻转,叠加,动态等等)
LCD控制器的功能就是生成LCD像素时钟,将GRAM中的数据搬运到LCD屏幕上去显示。在一般的小型LCD模块一般都集成了一个LCD控制器,如常用的ili9320/ili9325等型号,这些LCD模块同时还集成了几百KB大小的RAM,用于显示;一般地MCU先通过8080接口或SPI向控制器发送命令,配置LCD参数,然后向集成的RAM中写入数据就可以显示,是低成本项目的首选方案。
STM32F429自带的LTDC也是LCD控制器,与ili9320相比,支持的分辨率更高,功能更多,但是LTDC只负责产生LCD需要的时序,并没有集成RAM。那么在使用LTDC的时候,首先要配置LCD的时序,然后要设置GRAM的地址(这里GRAM的地址就是外扩的SDRAM的地址),最后开启LTDC。配置好LTDC之后,硬件会自动将GRAM中的内容搬运到LCD屏幕上,只要改变GRAM中的数据就可以改变显示内容。
LTDC支持2个图层和1个背景图层,一般情况下用一个图层显示就可以了;这2个图层可以单独设置显示区域和GRAM地址,并且同时开启时,硬件自动将2个图层的显示内容进行混合,混合顺序是:图层2 -> 图层1 -> 背景色,图层2位于最顶层
这里有一个理解起来比较困难的地方,就是LTDC和DMA2D之间的关系,因为从二者的逻辑图功能上看,似乎完全一样。先看逻辑图