SPI LCD 顏色相關(guān)問題
首先,得先確定顯示屏使用的是SPI接口,還是DBI接口,不同的接口,輸入數(shù)據(jù)的解析方式是不一樣的。
DBI接口的全稱是 Display Bus Serial Interface ,在顯示屏數(shù)據(jù)手冊中,一般會說這是SPI接口,所以有人會誤認(rèn)為SPI屏可以使用 normal spi 去直接驅(qū)動。
閱讀lcd_dbi_if部分的介紹可以知道,在3線模式時,發(fā)送命令前有1位A0用于指示當(dāng)前發(fā)送的是數(shù)據(jù),還是命令。
而命令后面接著的數(shù)據(jù)就沒有這個A0位了,代表SPI需要在9位和8位之間來回切換,而在讀數(shù)據(jù)時,更是需要延時 dummy clock 才能讀數(shù)據(jù),normal spi 都很難,甚至無法實現(xiàn)。所以 normal spi 只能模擬4 線的DBI的寫操作。
對于R128這類支持DBI接口的CPU,可以選擇不去了解SPI。如果需要用到SPI去驅(qū)動顯示屏,必須把顯示屏設(shè)置成小端。
RGB565和RGB666
SPI顯示屏一般支持RGB444,RGB565和RGB666,RGB444使用的比較少,所以只討論RGB565和RGB666.
RGB565代表一個點(diǎn)的顏色由2字節(jié)組成,也就是R(紅色)用5位表示,G(綠色)用6位表示,B(藍(lán)色)用5位表示,如下圖所示:
RGB666一個點(diǎn)的顏色由3字節(jié)組成,每個字節(jié)代表一個顏色,其中每個字節(jié)的低2位會無視,如下圖所示:
SPI 接口
因為SPI接口的通訊效率不高,所以建議使用RGB565的顯示,以 jlt35031c 顯示屏為例,他的顯示驅(qū)動芯片是 ST7789v,設(shè)置顯示格式的方式是往 3a 寄存器寫入0x55(RGB565)或者 0x66(RGB666),在 R128SDK 中,已經(jīng)把 jlt35031c 的通訊格式寫死為 0x55,lcd_pixel_fmt配置選項無效:
sunxi_lcd_cmd_write(sel, 0x3a);
sunxi_lcd_para_write(sel, 0x55);
在例程中,輸入的數(shù)據(jù)是 0xff,0x00,0xff,0x00,對于SPI接口,是按字節(jié)發(fā)送。實際上,例程只需要每次發(fā)送2字節(jié)即可,因為前后發(fā)送的都是相同的ff 00,所以沒有看出問題。
根據(jù)對 565 的數(shù)據(jù)解析,我們拆分 ff 00 就可以得到紅色分量是 0b11111,也就是 31,綠色是0b111000,也就是 56,,藍(lán)色是 0.我們等效轉(zhuǎn)換成 RGB888,有:
R = 31/31*255 = 255
G = 56/63*255 = 226
在調(diào)色板輸入對應(yīng)顏色,就可以得到黃色
因為 DBI 通訊效率較高,所以可以使用 RGB565 或者 RGB666,使用 DBI 接口,也就是 lcd_if 設(shè)置為1時,驅(qū)動會根據(jù) lcd_pixel_fmt 配置寄存器,以 SDK 中的 kld2844b.c 為例,這顯示屏的顯示驅(qū)動也是 ST7789,但是不同的屏幕,廠家封裝時已經(jīng)限制了通訊方式,所以即使是能使用 DBI 接口的驅(qū)動芯片的屏幕,或許也用不了DBI。
sunxi_lcd_cmd_write(sel, 0x3A); /* Interface Pixel Format */
/* 55----RGB565;66---RGB666 */
if (info[sel].lcd_pixel_fmt == LCDFB_FORMAT_RGB_565 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_BGR_565) {
sunxi_lcd_para_write(sel, 0x55);
if (info[sel].lcd_pixel_fmt == LCDFB_FORMAT_RGB_565)
rotate &= 0xf7;
else
rotate |= 0x08;
} else if (info[sel].lcd_pixel_fmt < LCDFB_FORMAT_RGB_888) {
sunxi_lcd_para_write(sel, 0x66);
if (info[sel].lcd_pixel_fmt == LCDFB_FORMAT_BGRA_8888 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_BGRX_8888 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_ABGR_8888 ||
info[sel].lcd_pixel_fmt == LCDFB_FORMAT_XBGR_8888) {
rotate |= 0x08;
}
} else {
sunxi_lcd_para_write(sel, 0x66);
}
對于 DBI 格式,不再是以字節(jié)的形式去解析,而是以字的方式去解析,為了統(tǒng)一,軟件已經(jīng)規(guī)定了,RGB565 格式時,字大小是2字節(jié),也就是16位,而 RGB666 格式時,字大小是4字節(jié),也就是32位。
對于 RGB565 格式,同樣是設(shè)置為 0xff,0x00。因為屏幕是大端,而芯片存儲方式是小端,所以芯片的 DBI 模塊,會自動把數(shù)據(jù)從新排列,也就是實際上 DBI 發(fā)送數(shù)據(jù)時,會先發(fā)送0x00,再發(fā)送0xff,也就是紅色分量為0,綠色分量為 0b000111,也就是7,藍(lán)色分量是 0x11111,也就是31,我們同樣轉(zhuǎn)換成RGB888
G = 7/63*255 = 28
B= 31/31*255 = 255
在調(diào)色板上輸入,可以得到藍(lán)色。
如果是 RGB666,雖然占用的是3個字節(jié),但是沒有CPU是3字節(jié)對齊的,所以需要一次性輸入4字節(jié),然后 DBI 硬件模塊,會自動舍棄1個字節(jié),軟件同意舍棄了最后一個字節(jié)。
依舊以例程為例,例程輸入了 0xff,0x00,0xff,0x00,為了方便說明,標(biāo)準(zhǔn)為 0xff(1),0x00(1),0xff(2),0x00(2),其中 0x00(2)會被舍棄掉,然后發(fā)送順序是0xff(2),0x00(1),0xff(1),也就是 0xff(2) 是紅色分量,0xff(1) 是藍(lán)色分量,混合可以得到紫色。
-
寄存器
+關(guān)注
關(guān)注
31文章
5504瀏覽量
128356 -
RGB
+關(guān)注
關(guān)注
4文章
819瀏覽量
61229 -
LCD屏
+關(guān)注
關(guān)注
0文章
131瀏覽量
16361 -
SPI接口
+關(guān)注
關(guān)注
0文章
271瀏覽量
36224 -
驅(qū)動芯片
+關(guān)注
關(guān)注
13文章
1498瀏覽量
57424
發(fā)布評論請先 登錄
R128點(diǎn)屏踩坑筆記

淺談全志R128點(diǎn)屏SPI LCD顏色的相關(guān)配置





評論