首先,MIPI(Mobile Industry Processor Interface)移动行业处理器接口联盟不仅开发了新标准,还将现有的显示借口进行了标准化。这其中包括MIPI-DBI、MIPI-DPI、MIPI-DSI、MIPI-CSI等:
1)MIPI-DBI是MIPI联盟发布的第一个显示标准,用来规定显示接口。MIPI-DBI中定义了三类接口:
2)MIPI-DPI通过TFT控制器对接口进行标准化。用来与没有帧缓冲器的显示器进行连接。像素数据必须实时流式传输到显示器。
3)MIPI_DSI封装了DBI或DPI信号,采用高带宽多通道差分链路,它使用标准的MIPI D-PHY作为物理链路。
STM32 MCU支持的显示接口类型如下:
DBI(Display Bus Interface), 显示总线接口, 也称MCU接口或者80/8080接口,DBI接口最大的特点就是LCM自带framebuffer, 存储Host端发过来的数据, 并由内部的控制IC不断重复的刷到LCD上, 也就是说其内部实现了自刷新, Host只要发送一次数据即可, 这帧数据会一直显示在屏幕上。由于不需要Host端自刷新,对Host处理器的要求很低, 没有时钟线,Host和LCM可以是简单的GPIO相连
DBI传输可以选择并口和串口传输,两者差别就是数据线数量不同,时序是相同的。
以RGB565为例:先发送写内存命令0x2c, 接着开始写帧数据,即连续发送所有像素点的数据
并行传输接口可以用FSMC接口来实现,并且FSMC接口支持6800和8080两种模式
但是这里特别注意的是,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之间的关系,因为从二者的逻辑图功能上看,似乎完全一样。先看逻辑图
从图上看,二者都有像素格式转换、图层混合、输出格式转换功能。其部件意义如下:
FG FIFO 与 BG FIFO:是两个 64x32 位大小的缓冲区,它们用于缓存从 AHB总线获取的像素数据,分别专用于缓冲前景层和背景层的数据源。AHB总线的数据源一般是 SDRAM,也就是说在 LTDC外设中配置的前景层及背景层数据源地址一般指向 SDRAM 的存储空间,使用 SDRAM 的部分空间作为显存。
FG PFC 与 BG PFC:是两个像素格式转换器,分别用于前景层和背景层的像素格式转换,不管从 FIFO 的数据源格式如何,都把它转化成字的格式(即 32 位),ARGB8888。图中的“ɑ”表示 Alpha,即透明度,经过 PFC,透明度会被扩展成 8 位的格式。图中的“CLUT”表示颜色查找表(Color Lookup Table),它使用一个 256x32 位的空间缓存 256 种颜色,颜色的格式是 ARGB8888 或RGB888。利用颜色查找表,实际的图像只使用这 256 种颜色,每种颜色4*8=32位。该数据并不是直接的 RGB 颜色数据,而是指向颜色查找表的地址偏移,即表示这个像素点应该显示颜色查找表中的哪一种颜色。DMA2D 的颜色查找表可以由 CPU自动加载或编程手动加载。
OUT PFC:输出像素格式转换器,它把混合器转换得到的图像转换成目标格式,如ARGB8888、RGB888、RGB565、ARGB1555 或 ARGB4444,具体的格式可根据需要在输出 PFC控制寄存器 DMA2D_OPFCCR 中选择。STM32F429 芯片使用 LTDC、DMA2D 及 RAM 存储器,构成了一个完整的液晶控制器。
要理解上述功能上的看似重复,索性从头学习一下DMA,stm32有两个DMA控制器,DMA1有7个DMA通道,DMA2有5个通道。stm32增加一个专用于图形加带的DMA2D,就是我们上边介绍的。每个外设可以使用的DMA通道是不同的。如下表:
在传统的DMA传输中,有如下特点:
1)只能单纯的完成四种类型传输,不能像DMA2D那种做各种数据的变换。
在stm32cube中配置DMA通道,只涉及add一条通道,并没有以上源地址等配置工作,可见,DMA初始化的每一步只是设置一条DMA通道相关的配置参数,而具体的源地址、目标地址、传输数据量、数据格式等参数是DMA请求源在启动DMA前在代码中设置的。
DMA2D是专用于图形加速的DMA,在stm32cube中只需要激活即可,然后设置相关的参数,同样没有源地址等设置。应当也是在初始化代码中设置的。
DMA2D有四种工作模式,在stm32f769的LCD例程中设置为M-M,即内存到内存,从表中可以看到,这种模式只把LTDC设置的SDRAM缓存中的数据传入FIFO,并不执行上述DMA2D框图中的PFC及混合功能,而是直接输出到OUT FIFO,而这个地址应当就是设置为LTDC控制器的FIFO。
那么,即然指定M_M模式不启用PFC及混合等功能,那和DMA传输有何不同呢?在stm32cube配置中可以看到,专用于图形传输的DMA2D可以设置输入数据的格式,如ARGB8888,还有A通道混合等设置参数。
所以综上,DMA2D完成的是从显示缓存到LDTC的FIFO的数据运输关系,存于DMA2D可能不仅只为LDTC服务,因此,DMA2D同样有图像格式转换及混合等功能,但是在它为LDTC服务时,LDTC本身具有这些功能,所以只启用DMA2D的内存到内存模式的搬运功能。
顺便介绍两个概念:帧数(帧率)和刷新率:
1)帧率:就是画面改变的速度,帧数高画面就流畅。理论上,每一帧都是不同的画面。60fps就是每秒钟显卡生成60张画面图片。
2)刷新率:显示信号输出刷新的速度。60赫兹(hertz)就是每秒钟显卡向显示器输出60次信号。
假设帧数是刷新率的1/2,即显卡每两次向显示器输出的画面是用一幅画面。相反,如果帧数是刷新率的2倍,那么画面每改变两次,其中只有1次是被显卡发送并在显示器上显示的。 所以高于刷新率的帧数都是无效帧数,对画面效果没有任何提升,反而可能导致画面异常。
STM32F429 系列芯片内部自带一个 LTDC液晶控制器,使用 SDRAM 的部分空间作为显存,可直接控制液晶面板,无需额外增加液晶控制器芯片。STM32 的 LTDC液晶控制器最高支持 800x600 分辨率的屏幕;可支持多种颜色格式,包括 RGB888、RGB565、ARGB8888 和 ARGB1555 等(其中的“A”是指透明像素);支持 2 层显示数据混合,利用这个特性,可高效地做出背景和前景分离的显示效果,如以视频为背景,在前景显示弹幕。
LTDC外设使用 3 种时钟信号,包括 AHB时钟、APB2 时钟及像素时钟 LCD_CLK。AHB时钟用于驱动数据从存储器存储到 FIFO,APB2 时钟用于驱动 LTDC 的寄存器。而LCD_CLK 用于生成与液晶面板通讯的同步时钟。
LCD_CLK的来源是 HSE(高速外部晶振),经过“/M”分频因子分频输出到“PLLSAI”分频器,再经倍频因子 N 倍频得到“PLLSAIN”时钟、再由“/R”因子分频得到“PLLCDCLK”时钟,再经过“DIV”因子得到“LCD-TFT clock”,“LCD-TFT clock”即通讯中的同步时钟LCD_CLK,它使用 LCD_CLK 引脚输出。
在实际使用 LTDC控制器控制液晶屏时,使 LTDC正常工作后,往配置好的显存地址写入要显示的像素数据,LTDC 就会把这些数据从显存搬运到液晶面板进行显示,而显示数据的容量非常大,所以我们希望能用 DMA来操作,针对这个需求,STM32 专门定制了DMA2D 外设,它可用于快速绘制矩形、直线、分层数据混合、数据复制以及进行图像数据格式转换,可以把它理解为图形专用的 DMA。
DPI模式需要MCU带有LTDC控制器,以stm32f429为例 ,其内部LTDC框图如下:LTDC利用简单的3.3V信号提供了多达28个信号,包括: • 像素时钟LCD_CLK。 • 数据使能LCD_DE。 • 同步信号(LCD_HSYNC和LCD_VSYNC)。 • 像素数据RGB888。
LTDC控制器只能驱动上述的信号, 不属于LTDC的信号可以使用GPIO和其他外设进行管理。 比如背光单元需要额外的背光控制电路和GPIO。 一些显示面板需要复位信号以及串行接口(如I2C或SPI)。这些接口通常用于显示器初始 化命令或触摸面板控制。
LTDC可以按照以下并行格式输出数据:RGB565、RGB666和RGB888。LTDC信号极性可编程 LTDC控制信号的极性是可编程的,这使得STM32微控制器能够驱动任意RGB并行显示器。利 用LTDC_GCR寄存器,可以将控制信号(Hsync, Vsync和数据使能DE)以及像素时钟 (LCD_CLK)定义为高电平有效或低电平有效。
DPI方式显示的整个流程是MCU先生成数据,放入缓存,该缓存大小是根据LCD屏像素大小来决定的,如果MCU内部RAM够用,则可以将缓存放在MCU内部RAM中,如果内部RAM不足,则放在FMC接口的外部RAM中。内部RAM的带宽大,无延时。据有文章称,stm32f429将缓外放在外部的SDRAM缓冲区时,当时钟高于40Mhz时,就无法正常显示。
微控制器对要在帧缓冲器中显示的图像进行计算,以组成图标或图像等图形基元。CPU通过运行图形库软件来执行此过程。该过程可以由图形库使用专用硬件(如DMA2DChrom-Art Accelerator®)来加速。帧缓冲器更新的频率越高,动画越流畅(动画每秒帧数)。双缓冲使用两个帧缓冲器,一个用于显示,一个用于存入下一帧,可以避免显示正在写入缓冲器的内容。显示控制器持续“刷新”显示器,以每秒60次(60Hz)的速度将帧缓冲器内容传送到显示屏。显示控制器可以嵌入显示模块或MCU中,即LTDC。
LTDC是以逐行方式读取图像数据的控制器。其存储器访问模式的长度为64字节,但当到达一行的结尾并且剩余数据少于64个字节时,LTDC将提取剩余的数据。
在每个像素时钟上升沿或时钟下降沿,并在屏幕有效区域内,LTDC层从其FIFO中检索一个 像素数据,将其转换为内部ARGB8888像素格式,并将其与背景和/或其他图层像素颜色进 行混合。得到的像素以RGB888格式编码,通过抖动单元并被驱动到RGB接口中。像素便会 显示到屏幕上。
以上的DSI和DPI在速度上无法满足越来越大的带宽需求,而且不同的外设相应的硬件接口也不统一,由此就产生了MIPI接口,MIPI接口相对于上述接口主要完成了两个工作:
1)物理上在高速模式时采用200mv的差分信号传输,使单通道的信号传输速度最高达到1G
2)将传输分为四个层,上层对数据及命令进行协议打包,底层物理层只负责无差异的单bit信号传输,这些信号可以通过1-4个通道传,不再关心具体信号代表的意思,其含义转而由接收端上层按协议进行数据包的组装及命令解释,这样使得不同硬件可以使用相同的物理接口来和CPU连接,使硬件和接口各自独立。
从整体流程上看到,DBI、DPI都是相应的控制器将数据发给LCD,而DSI用的是LTDC产生的数据,LTDC通过内部DBI接口将数据传给SDIHOST,然后才开始下面四层DSI接口协议的处理封包。所有说DSI是封装了DBI或DPI。与配置DSI时,一定会配置相应的LTDC
MIPI定义的最上层是Application,即应用层,可由软件或者硬件实现。它的作用是把像素值或命令打包了8位的字节包,而且整个MIPI从最上层到最下层的物理层,发送单元都是按一个字节来发送的。每一种图像的像素格式是不同的,除了RAW8和JPEG8等几种外,其它的如RAW10、YUV422、RGB565、RGB555、RGB444的每个像素点的位数均不一样,Application层要按照各种格式的协议把每个像素点的各位分别打包成一个或多个字节。比如RGB565,一个像素点是16位,打包时会分成两个包,第一个是G2-4和B3-7共8位,第二个包是R3-7和G5-7共8位,同时注意,可能是最后24位的原因,不足24位的格式是使用高位的,所以本例是G的6位是2-7,没有0和1。
需指出,包有命令包、数据包,还有行同步、帧同步等功能包,长短包的字节数也不同,而不同格式的图像打包的方式也不同,那接收方怎么知道包的长度以及该怎么还原成正确的格式呢?这就是下面介绍的包格式中都含有的ID字节的作用了。无论长包还是短包,其发送都以SOT开始,收到SOT后,表示后边紧跟着的就是数据包,而第一个字节就是标识ID,数据标识(DI)字节的高两个bit定义了数据lane个数,后六个bit定义了执行类型。根据该执行类型就可以解析出包长度,包类型(如行同步,帧同步,命令包等),数据格式(8位、16位、24位,YUV,RGB等)
MIPI协议用这6位bit一共定义了33种字节类型,比如:帧开始,传输结束EOT,24位RGB格式等。所以包类型如下:
0x01 ( 000001 ) 表示本包是帧起始包,是一个短包 (SyncEvent, V Sync Start Short)
0x11 (010001 ) SyncEvent, V Sync End Short
0x21 100001 SyncEvent, H Sync Start Short
0x31 110001 SyncEvent, H Sync End Short
0x08 001000 Endof Transmission packet (EoTp) Short
0x02 000010 ColorMode (CM) Off Command Short
0x12 010010 ColorMode (CM) On Command Short
0x22 100010 ShutDown Peripheral Command Short
0x32 110010 TurnOn Peripheral Command Short
0x03 000011 GenericShort WRITE, no parameters Short
0x13 010011 GenericShort WRITE, 1 parameter Short
0x23 100011 GenericShort WRITE, 2 parameters Short
0x04 000100 GenericREAD, no parameters Short
0x14 010100 GenericREAD, 1 parameter Short
0x24 100100 GenericREAD, 2 parameters Short
0x05 000101 DCSShort WRITE, no parameters Short
0x15 010101 DCSShort WRITE, 1 parameter Short
0x06 000110 DCSREAD, no parameters Short
0x37 110111 SetMaximum Return Packet Size Short
0x09 001001 NullPacket, no data Long
0x19 011001 BlankingPacket, no data Long
0x29 101001 GenericLong Write Long
0x39 111001 DCSLong Write/write_LUT Command Packet Long
0x0C 001100 LooselyPacked Pixel Stream, 20-bit YCbCr, 4:2:2 Format Long
0x1C 011100 PackedPixel Stream, 24-bit YCbCr, 4:2:2 Format Long
0x2C 101100 PackedPixel Stream, 16-bit YCbCr, 4:2:2 Format Long
0x0D 001101 PackedPixel Stream, 30-bit RGB, 10-10-10 Format Long
0x1D 011101 PackedPixel Stream, 36-bit RGB, 12-12-12 Format Long
0x3D 111101 PackedPixel Stream, 12-bit YCbCr, 4:2:0 Format Long
0x0E 001110 PackedPixel Stream, 16-bit RGB, 5-6-5 Format Long
0x1E 011110 PackedPixel Stream, 18-bit RGB, 6-6-6 Format Long
0x2E 101110 LooselyPacked Pixel Stream, 18-bit RGB, 6-6-6 Format Long
0x3E 111110 PackedPixel Stream, 24-bit RGB, 8-8-8 Format Long
这些数据类型有的只能用于command模式,有的只能用于video模式,如下表,将一张图片写入LCD屏,如果用command DCS模式,则数据包ID类型为39h,如果用video长包,则数据包ID类型为3Eh。
另外,在下表中的数据类型中,有几类是指示数据包为指令包,它们分别是03h、13h、23h、05h、15h、06h、29h、39h,这些指令可以分为两大类:Generic类和DCS类,其中它们相应的指令基本是可以相互替代的,比如03h是无参数Generic短指令包,其功能和05h一样。它们之间的区别是DCS指令包中携带的指令是MIPI协议中的DCS标准指令,据说是nokia制定的。而Generic指令包中携带的指令即是各手机厂家自已制定的指令,比如苹果、华为都有自已的指令包,他们只要保证定制的MIPI和LCD能够互相解释该指令就可以,但是和不包含这些专用指令的硬件之间是无法通讯的。另外,根据下面介绍的数据包的格式,指令内容就是跟在ID字节后的,指令分为无参数、一个参数、二个参数三种。具体的DCS指令参见下面第二张表
下面会介绍整个数据包的结构,在数据包结构中会看到,除了数据本身各字节外,还是ECC包头检验字节和checksum结尾和校验字节,这部分是low level protocol层打包。而开始标志SOT和结束标志则是由最低层的物理层D-PHY打包的
在low level protocol下还有lane manager通道管理层,经过low level protocol层打包后的数据已经完全和上层分离,是不代表任何意思的纯字节数据,lane manager负责将这些字节流按规定的规则分配到通道中去发送。
在low level protocol层下就是负责具体发送和接收的物理层D-PHY,这部分在下面介绍完包格式后介绍。
下面介绍MIPI的最终完成的包的格式,包分为短包和长包,格式分别下:
1)短包(4 bytes长度)——命令设置或参数配置或同步信号传输,组成如下:标识(DI)- 1个字节、帧数据- 2个字节、错误检测(ECC)1个字节
2)长包——长包用2个字节定义数据长度,最多传输数据为65535,组成如下:
帧头:4字节,组成和短包的4字节相同,区别是短包中2字节的帧数据是即内容,而长包中这2个字节是后面帧数据的长度
帧数据:长度为0-65525个字节
帧尾:2字节校验和
以上所有超过1字节的部分,发送时均是先发低字节。而每个字节内部,也是先发低位,再发高位。
MIPI的D-PHY包含一个时钟通道和1-4个数据通道,每个通道包含的模块数是不同的,最多为5个模块,分别是:
需说明的是,无论一个通道含有上述5个模块中的几个,他们使用的均是同一对差分线Dp,Dn线,即这5个模块并不是同时工作的,要么工作在高速,要么工作是低速,要么工作在读,要么工作在写。一个通道中倒底应该包含几个模块,是这么确定的:
下面介绍D-PHY层的工作模式
D- PHY的物理层支持HS(High Speed)和LP(Low Power)两种工作模式:
链路层的模式分为:Command模式和Video模式。链路层选择Command模式时,物理层可以为HS模式,也可以为LP模式;链路层选择Video模式时,物理层只能选择HS模式。 command mode通过TE pin来同步,video mode通过将v-sync及h-sync信号包含在数据包里发送给panel来做同步,和RGB不同的是RGB专门有v-sync以及h-sync PIN引脚,而video mode是v-sync及h-sync信号包。
但是不同的屏会有不同的要求,有的屏的部分命令要求只能以低功耗模式传输。
每个通道的两条差分线可以工作在高速传输或低功耗传输,其中高速传输是200mv差分信号,速度80Mbps ~ 1Gbps/Lane ,两根线的相对电平高低来来表示是0或1,即此时有两种状态。而低功耗传输不是差分信号每通道最高速率是10M,电压是0-1.2V,两根线的电平状态相互独立,则有四种电平组合LP11、LP10、LP01、LP00,其中0表示低电平,即0V。1表示高电平,即1.2V。所以,高速状态和低功耗状态合计有6种状态。
D-PHY在没有任务时总是处于低功耗状态LP11下,所以无论进入以上三种模式的哪一种,都是从LP11状态开始的,从表中看到,该状态表示停止态。在进行数据突发传输时,data lane就进入高速数据传输模式,结束高速数据传输后又进入Stop State(LP11)。
这里需要强调一个问题,D-PHY的传输有HS和LP两种 ,在HS模式下数据包一定以SOT开始包起始,以EOT结束包结束。而SOT和EOT包都是特理层产生的。而在后面的LP模式下发送命令的时序看到,LP模式下是没有SOT和EOT包的。另外,从MIPI DSI v1.02版本开始,在EoT之前加入了EoTp短包,用于表示HS模式传输即将结束。EoTp短包是在协议层产生,在上面介绍的数据包ID中可以找到EoTp包。
在stm32cube中DSIHOST–Data and Clock lanes–Flow control可以配置是否使能EoTp包,使能分为使能EoT发送、EoTp接收、CRC接收、ECC接收,可以看到除了EoT有发送和接收外,CRC和ECC都只有接收,接收指的是接收子机发来的包,而EoT、CRC、ECC短包都是在协议层生成和解释的,根据以下HS数据包的格式看到,无论是长包还是短包,都包含CRC、ECC字节,即这两个字节是数据包的标准字节,主机发送数据包时,一定是按数据包格式封装好的,所以设置时没有CRC、ECC字节的使能及关闭选项。
为了兼容以前的版本,可以选择使能或关闭EoTp短包,开启和关闭的时序对比图如下:
![使能EoT,连续发送2个短包SP,1个长包lgP,看到多了1个EoTp的SP]](https://img-blog.csdnimg.cn/20190605105006210.png)
表中进入HS、Control Mode、Escape Mode三种式是通过特定的电平序列来实现的。首先看总的转换图,然后分步解释
从低功耗状态进入高速状态,首先发送进入高速请求,表中可以看到是LP01,其次进入Bridge状态,即LP00,这个状态起名Bridge,大概也是因为从低功耗的0-1.2V电平过渡到高速的200mv电平,先进入0电平,好像一个电平桥一般。所以整个电平序列为LP-11—>LP01—>LP00,然后发送SOT开始标志码,然后接上面的数据长包或短包进行发送。发送结束后,发EOT结束包,然后电平回到LP11。
在进入HS发送数据时,时钟lane会以差分信号提供时钟,时钟信号有如下特征
1)它会在数据通道开始前,先从时钟低功耗状态进入时钟HS状态,进入的方式也是LP11-LP01-LP00
2)时钟在进入HS在状态后,首先会维持一段时间的HS0状态(即时钟差分0平电),然后正常时钟01交替信号,再过一段时间,数据通道才会进入HS状态。stm32cube设置DSIHOST中有一个PHY Timings参数,对应的就是下面时钟通道中的Tcld-pre,OTM8009A显示驱动芯片要求的T CLK_PRE 最小值为8UI(Unit Interval,对应一个lane byte clock )。演示例中设置参数为10。
3)时钟通道要到所有数据通道均退出HS在状态后,才会进入低功耗状态,而且进入前会先持续一段时间,再进入HS0持续一段时间,最后通过时钟LP11进入时钟低功耗状状,这个过程和上面进入的进程是对称的
下面是时钟进入HS的时序,前半部分是退出HS,后半部分是进入HS
Turnaround 模式用于改变数据传输的方向,顺便提一下,主机到从机的传输速度和从机到主机的传输速度是可以不一样的。比如现在是正向传输 ,通过Link Turnaround流程 就变成了反相传输。Link Turnaround流程只能在Control Mode下才能进行。同时,正如上面所述,每个通道最多含有5个模块,但是不一定含有全部5个,只有双向通道才需要即包含HS-TX、LP-TX,又包含HS-RX、LP-RX,同时包含方向控制LP-CD模块。
Turnaround 模式改变传输方向的时序图如下,需做几点说明
1)主机申请变为从机,同样从LP11停止态开始,然后发低功耗申请LP10,但是整个转换申请共5个电平状态LP-11—>LP10—>LP00—> LP10—> LP00。当LP00保持Tta-sure时间后,原来的从机就知道自已的身份已转换为主机,而在此之前,线路电平都是由原主机驱动的
2)从机确认自已身分转换为主机后,驱动LP00保持Tta-get时间,然后驱动线路电平到LP10,原主机(现从机)收到信号后,代表已知道自已的身份已转换为从机
3)新主机再把线路电平驱动到LP11,通知现从机,全部身份转换过程完成。
3、Escape Mode
Escape Mode是一个比较特殊的模式,在该模式下,可以使data lane 进入Low-Power states、Ultra-Low states等模式。在正向传输时,是肯定支持Escape Mode的,但反向时可以不支持。
Data lane 通过一系列进入Escape Mode的操作流程(LP-11,LP-10,LP-00,LP-01,LP-00)才能进入Escape Mode。只要最后的LP-00状态出现在data lane上,就进入Escape Mode了。如果在没有到最后的LP-00状态前,data lane上出现了LP11,则会退出进入Escape Mode流程。只要进入了Escape Mode,发送方就会发送一个8位宽的输入命令,来代表其请求的操作。
下表就是一些可以发送的请求操作命令,比如发送8位1110_0001,就表示将进入低功耗数据传输模式,发送0001_1110 就表示将进入超低功耗状态。 需注意的是几下几点:
1)所有从Escape Mode模式进入的各种模式都是不需要时钟通道的,这些模式的时钟是由数据通道特殊的编码方式来获得的。具体的说,是就数据通道的DP和DN线异或而来,而DP和DN数电平是相等和不等两种状态交替出现的,即00或11–01或10–00或11-01或10,两线异或就出现了周其变化的时钟信号
2)进入Escape Mode模式的电平序列LP-11,LP-10,LP-00,LP-01,LP-00是半周期发送的,即每位点半个周期,而紧随其后的8位命令字符或数据字符是全周期的,即每个位占有一个周期。而且没有HS传输模式中的SOT开始包、EOT结束包
3)命令或数据位是在DN线上发送的,如果是0,则在每个时钟周期内内会产生电平跳变,高电平和低电平各占半个时钟周期。如果是1,则不会产生电平跳变,始终是低电平。而DP线电平则根据需要来定,方式和保持和DN线电平异或后产生周期的时钟信号
4)数据发送可能有间断,即无数据时段,这时DN和DP都保持0电平,相应的时钟信号也消失,维持在0电平
首先来看,进入Escape Mode模式后可以发送的命令表:
其次,以发送Reset-Trigger命令为例,来看相应的电平时序
再次,来看进入Escape Mode后发送Low-Power Data Transmission命令进入低功耗模式,然后以此模式来传输数据的时序
再次,进入Ultra-Low Power State 超低功耗状态 等方式和以上进入Low-Power Data Transmission的方法类似
接下来,看看MIPI的时钟设置,以MIPI LCD屏为例:
时钟频率=(屏幕分辨率宽width+hsync+hfp+hbp)x ( 屏幕分辨率高height+vsync+vfp+vbp) x(RGB显示数据宽度) x 帧率/ (lane_num)/2
其中:lane_num----是数据通道数量,一个时钟内,几个lane是可以同时传输数据的。同时,除以2是因为根据mipi通讯协议,CLK_N、CLK_P这两根时钟线的上升沿/下降沿可以获取到数据,即每个时钟周期可以传输2bit数据
这里涉及到的时钟有:
1)位时钟,是传输一个bit对应时钟,或者更准确的说是2个bit的时钟,因为时钟是差分信号,时钟DP、DN交叉两次才是一个完整的时钟,而时钟DP和DN线的上升沿都会采样,所以实际是半个时钟就会发送一个bit
2) 字节时钟,数据被分配到多个数据通道上传输,但是每个通道上的最小单位是字节,即字节0到data0上,字节1在data1上。
3)像素时钟,在stm32cube的时钟配置图上,即LCD_TFT时钟
4)ESC Clock,低功耗模式下的时钟,最大19.2M
以上时钟的关系为:
1)字节时钟=位时钟/8
2)像素时钟=字节时钟*数据通道数/每像素字节数
DSI传输像素时钟计算举例:
假设:LCD的分辨率为600 x 1024,帧率为57 HZ。行同步、行前肩、行后肩、帧同步、帧前肩、帧后肩分别为24、100、60、2、22、10,则:一帧图像的数据量为:FRAME_BIT=(600+24+100+60) x (1024+2+22+10) x(24)=19907328 bit
一秒钟的数据量为:19907328 x 57 = 1134.717696 Mbps
所需的mipi时钟频率为:1134717696/2(lane)/2= 283.679424 Mhz,但是stm32F769最大时钟只能到62.5M,所以它支持不了这么大屏或是不能以57帧的速度来刷新。
LCD=TFT时钟树频率:计算方式 DSI通道速率通道数/位每像素,500Mbs2/24=41.6666,约等于41.7MHz。
在mipi command mode模式下还有一个重要的信号:TE pin,它是来作为同步的,它是LCD的驱动IC在完成一帧的刷新后,返回给CPU的一个反馈信号,告知CPU当前帧已经刷新完毕,可以送另一帧新数据过来了。以此保证CPU发送数据和LCD的刷新步调一致,防止切屏。TE信号还要和显示缓冲的更新相匹配,防止在LCD刷新显示时更新RAM显存产生切屏,所有通常TE选择为上升沿触发。当然,在TE信号所在的一个时钟周期无法完成全部显示更新,但是只要写内存的速度比LCD刷新的速度快,LCD刷新拿到的数据就可以保证是内存已完更新完的数据,就可以保证不产生新旧数据同在一屏的切屏现象
DSI时钟的设置一共涉及到4个时钟
1)AHB时钟:使用HCLK,用于LTDC将数据从存储器传输到 FIFO 层
2)APB2 时钟:PCLK2,用于LTDC配置寄存器
3)DSI通道时钟:stm32的DSI每通道最大传输数率是500Mbit,每通道最小单位是字节,所以在时钟图上是dsi lane byte=500/8=62.5M
4)像素时钟:即时钟图上的LCD_TFT,它是pllsai1倍频分频而来。计算值应为62.5通道数2每字节8位/每像素24位=41.6M。由于时钟设及多个外设,所以在时钟图上配置这个时钟时最为麻烦,本来可以直接填入41.6,但是stm32cube会更多出现两种情况
a) 找不到合适的参数值
b) 手工设置各倍频分频参数,结果会自动改回来到原值
可能要经过很多次尝试,才会将LCD_TFT成功的设置为41.6M,这可能是stm32cube的问题,最好的方式可能是先填入41.6自动计算,然后再填改HCLK、APB1等时钟到正确的值。