MIPI协议族,定义了一个专门用于显示的命令集,叫做Display Command Set,简称为DCS;这个DCS起什么作用呢?主要是Host和Display之间的一些Command配置和数据传输,以及读Display的数据等;
使用过SPI的屏的朋友应该知道,上电后,就开始劈里啪啦的一顿配置,比如SPI的屏幕ST7735S,上电初始化,就是一顿干:
static void LCD_Parameters_Init(void)
{
LCD_RST_LOW();// Reset
delay_ms(100);
LCD_RST_HIGH();
delay_ms(100);
LCD_BLK_HIGH();// Open bl
delay_ms(100);
LCD_WriteCmd(0x11); // Sleep out
delay_ms(120); // Delay 120ms
//------------------------------------ST7735S Frame rate-------------------------------------------------//
LCD_WriteCmd(0xB1); //Frame rate 80Hz
LCD_WriteData(0x02);
LCD_WriteData(0x35);
LCD_WriteData(0x36);
LCD_WriteCmd(0xB2); //Frame rate 80Hz
LCD_WriteData(0x02);
LCD_WriteData(0x35);
LCD_WriteData(0x36);
LCD_WriteCmd(0xB3); //Frame rate 80Hz
LCD_WriteData(0x02);
LCD_WriteData(0x35);
LCD_WriteData(0x36);
LCD_WriteData(0x02);
LCD_WriteData(0x35);
LCD_WriteData(0x36);
//------------------------------------End ST7735S Frame rate-------------------------------------------//
LCD_WriteCmd(0xB4); //Dot inversion
LCD_WriteData(0x03);
//------------------------------------ST7735S Power Sequence-----------------------------------------//
LCD_WriteCmd(0xC0);
LCD_WriteData(0xA2);
LCD_WriteData(0x02);
LCD_WriteData(0x84);
LCD_WriteCmd(0xC1);
LCD_WriteData(0xC5);
LCD_WriteCmd(0xC2);
LCD_WriteData(0x0D);
LCD_WriteData(0x00);
LCD_WriteCmd(0xC3);
LCD_WriteData(0x8D);
LCD_WriteData(0x2A);
LCD_WriteCmd(0xC4);
LCD_WriteData(0x8D);
LCD_WriteData(0xEE);
//---------------------------------End ST7735S Power Sequence---------------------------------------//
LCD_WriteCmd(0xC5); //VCOM
LCD_WriteData(0x0a);
LCD_WriteCmd(0x36);
LCD_WriteData(0x08);
//------------------------------------ST7735S Gamma Sequence-----------------------------------------//
LCD_WriteCmd(0XE0);
LCD_WriteData(0x12);
LCD_WriteData(0x1C);
LCD_WriteData(0x10);
LCD_WriteData(0x18);
LCD_WriteData(0x33);
LCD_WriteData(0x2C);
LCD_WriteData(0x25);
LCD_WriteData(0x28);
LCD_WriteData(0x28);
LCD_WriteData(0x27);
LCD_WriteData(0x2F);
LCD_WriteData(0x3C);
LCD_WriteData(0x00);
LCD_WriteData(0x03);
LCD_WriteData(0x03);
LCD_WriteData(0x10);
LCD_WriteCmd(0XE1);
LCD_WriteData(0x12);
LCD_WriteData(0x1C);
LCD_WriteData(0x10);
LCD_WriteData(0x18);
LCD_WriteData(0x2D);
LCD_WriteData(0x28);
LCD_WriteData(0x23);
LCD_WriteData(0x28);
LCD_WriteData(0x28);
LCD_WriteData(0x26);
LCD_WriteData(0x2F);
LCD_WriteData(0x3B);
LCD_WriteData(0x00);
LCD_WriteData(0x03);
LCD_WriteData(0x03);
LCD_WriteData(0x10);
//------------------------------------End ST7735S Gamma Sequence-----------------------------------------//
LCD_WriteCmd(0x3A); //65k mode
LCD_WriteData(0x05);
LCD_WriteCmd(0x29); //Display on
}
可以看到,一般是一个Command带一堆Data,Command描述了这次传输是用来干嘛的,Data呢,就是此次事件的数据;
为了标准化显示设备,所以呢,就有制定一些个标准(听君一席话,如听一席话);
为了统一江山,Display方,大家按照同一套标准来定制这个Command+data,此刻DCS闪亮登场;
1:Display Architectures
Display的结构,DCS中分为了3类;
可以看出来,这三类的区别就是中间Display Module是否带了Framebuffer,或者是带了一部分的Framebuffer;
Display Module带不带Framebuffer有啥区别呢?如果带了Framebuffer,那么图形数据不用每次都从主机获取,主机刷一次数据到display module的frame buffer中,然后display module就自己会将它自己的framebuffer往屏幕(panel)上面刷;
如果Display Module不带Framebuffer,为了维持屏幕上有数据,需要主机不停的给display module灌数据,并显示到panel上;
2:Power Level Definition
针对上面三种不同的Display架构,DCS中描述了三种对应的Power Level;
第一种显示架构:
第二种显示架构:
第三种显示架构:
3:Display Command Set
DCS 用于发送pixel数据,配置Display Module,或者读Display Module的一些数据或者寄存器;
DCS分为两类:
- User Command Set
- Manufacturer Command Set
Command域都是8-bit的(1 Byte);其中0x00 - 0xAF是User Command Set的,其余的留给了Manufacturer Command Set;
Manufacture Command Set(MCS)是厂商用的,在出厂的时候,设置的一些默认的参数,一旦出厂,这些命令不可见了,会被认为是NOP;
User Command Set是独立的部分,里面的所有的Command(除了write_LUT),都应该被Display Module 厂家实现;
其他的未定义的Command码,都应该被视作NOP;
4:Command List
DCS定义了很多很多的Command,每个Command都有Command Code,有的Command带参数,有的不带,有的只适用与Type1,2,3架构的一种;DCS的List如下所示:
5:Command Accessibility
DCS的这些个命令,并不是所有的状态下(Normal Idle,Sleep,Partial)都可以访问的,具体的可以参考SPEC,太多了,不举例了;
6:Default Modes and Values
同样的,关于Display Module来说,这么多命令,每次都配置一次,太多;默认情况下,有些设置有它的默认值,这里呢,也参考SPEC,太多了,不多列举了;
7:Command Descriptions
DCS每个命令都有一些关于它的描述,包括它的Command code,它的paramters,效果,以及它的流程等;
7.1:enter_idle_mode
Command Code = 0x39
发送这条命令,使得Display Module进入Idle模式
效果如下 :
明显可以看到,Idle模式下,色彩信息被减少了;
进入Idle的流程如下:
7.2 set_page_address
Command Code = 0x2B
用于设置显示区域的Y坐标起始和终止;
Command + Paramter 1 + Parameter 2 + Paramter 3 + Paramter 4
SP 是Start Page的简写,EP是End Page的简写,这里叫Page可能会让你疑惑,那么看这个图:
可以知道,其实Page就是纵坐标的意思;
它的典型使用流程是:
先使用set_column_address命令,设置横坐标,在使用set_page_address 设置纵坐标,然后在这个横坐标之间,去进行局部绘制;
7.3 set_column_address
Command Code = 0x2A
这个命令刚刚上面提到了,用于设置显示区域的X坐标起始和终止;
SC 是Start Column的简写,EC是End Column的简写,图:
典型用法如上面一个所示:
用于指定一个矩形区域进行绘制;
还有很多Command,就不全部举例了,这个文档,可以当作参考手册来使用,用的时候查就行;