MIPI 系列之 DCS
目录
1、Display Architectures
2、Power Level Definition
3、Display Command Set
4、Command List
5、Command Accessibility
6、Default Modes and Values
7、Command Descriptions
7.1、enter_idle_mode
7.2、set_page_address
7.3、set_column_address
MIPI 协议族,定义了一个专门用于显示的命令集,叫做 Display Command Set,简称为 DCS;这个 DCS 起什么作用呢?主要是 Host 和 Display 之间的一些 Command 配置和数据传输,以及读 Display 的数据等;
使用过 SPI 的屏的朋友们应该知道,上电后,就开始劈里啪啦的一顿配置,比如,SPI 的屏 ST7735S,上电初始化,就是一顿干:
static void LCD_Parameters_Init(void)
{LCD_RST_LOW();// Resetdelay_ms(100);LCD_RST_HIGH();delay_ms(100);LCD_BLK_HIGH();// Open bldelay_ms(100);LCD_WriteCmd(0x11); // Sleep outdelay_ms(120); // Delay 120ms//------------------------------------ST7735S Frame rate-------------------------------------------------//LCD_WriteCmd(0xB1); //Frame rate 80HzLCD_WriteData(0x02);LCD_WriteData(0x35);LCD_WriteData(0x36);LCD_WriteCmd(0xB2); //Frame rate 80HzLCD_WriteData(0x02);LCD_WriteData(0x35);LCD_WriteData(0x36);LCD_WriteCmd(0xB3); //Frame rate 80HzLCD_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 inversionLCD_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); //VCOMLCD_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 modeLCD_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 的 Framebuffer 中,然后 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;
Manufacturer 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 + Paramter 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 坐标起始和终止;
Command + Paramter 1 + Paramter 2 + Paramter 3 + Paramter 4
SC 是 Start Column 的简写,EC 是 End Column 的简写,图:
典型用法如上面一个所示:
用于指定一个矩形区域进行绘制;
还有很多 Command,就不全部列举了,这个文档,可以当作参考手册来使用,用的时候来查就行;