SPI LCD 顏色相關(guān)問題
首先,得先確定顯示屏使用的是SPI接口,還是DBI接口,不同的接口,輸入數(shù)據(jù)的解析方式是不一樣的。
DBI接口的全稱是 Display Bus Serial Interface
,在顯示屏數(shù)據(jù)手冊(cè)中,一般會(huì)說這是SPI接口,所以有人會(huì)誤認(rèn)為SPI屏可以使用 normal spi
去直接驅(qū)動(dòng)。
閱讀lcd_dbi_if
部分的介紹可以知道,在3線模式時(shí),發(fā)送命令前有1位A0用于指示當(dāng)前發(fā)送的是數(shù)據(jù),還是命令。
而命令后面接著的數(shù)據(jù)就沒有這個(gè)A0位了,代表SPI需要在9位和8位之間來回切換,而在讀數(shù)據(jù)時(shí),更是需要延時(shí) dummy clock
才能讀數(shù)據(jù),normal spi
都很難,甚至無法實(shí)現(xiàn)。所以 normal spi
只能模擬4 線的DBI的寫操作。
對(duì)于R128這類支持DBI接口的CPU,可以選擇不去了解SPI。如果需要用到SPI去驅(qū)動(dòng)顯示屏,必須把顯示屏設(shè)置成小端。
RGB565和RGB666
SPI顯示屏一般支持RGB444,RGB565和RGB666,RGB444使用的比較少,所以只討論RGB565和RGB666.
RGB565代表一個(gè)點(diǎn)的顏色由2字節(jié)組成,也就是R(紅色)用5位表示,G(綠色)用6位表示,B(藍(lán)色)用5位表示,如下圖所示:
RGB666一個(gè)點(diǎn)的顏色由3字節(jié)組成,每個(gè)字節(jié)代表一個(gè)顏色,其中每個(gè)字節(jié)的低2位會(huì)無視,如下圖所示:
SPI 接口
因?yàn)镾PI接口的通訊效率不高,所以建議使用RGB565的顯示,以 jlt35031c
顯示屏為例,他的顯示驅(qū)動(dòng)芯片是 ST7789v
,設(shè)置顯示格式的方式是往 3a
寄存器寫入0x55(RGB565
)或者 0x66(RGB666)
,在 R128SDK
中,已經(jīng)把 jlt35031c
的通訊格式寫死為 0x55
,lcd_pixel_fmt
配置選項(xiàng)無效:
sunxi_lcd_cmd_write(sel, 0x3a);
sunxi_lcd_para_write(sel, 0x55);
在例程中,輸入的數(shù)據(jù)是 0xff,0x00,0xff,0x00
,對(duì)于SPI接口,是按字節(jié)發(fā)送。實(shí)際上,例程只需要每次發(fā)送2字節(jié)即可,因?yàn)榍昂蟀l(fā)送的都是相同的ff 00,所以沒有看出問題。
根據(jù)對(duì) 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)色板輸入對(duì)應(yīng)顏色,就可以得到黃色
因?yàn)?DBI
通訊效率較高,所以可以使用 RGB565
或者 RGB666
,使用 DBI
接口,也就是 lcd_if
設(shè)置為1
時(shí),驅(qū)動(dòng)會(huì)根據(jù) lcd_pixel_fmt
配置寄存器,以 SDK
中的 kld2844b.c
為例,這顯示屏的顯示驅(qū)動(dòng)也是 ST7789
,但是不同的屏幕,廠家封裝時(shí)已經(jīng)限制了通訊方式,所以即使是能使用 DBI 接口的驅(qū)動(dòng)芯片的屏幕,或許也用不了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);
}
對(duì)于 DBI 格式,不再是以字節(jié)的形式去解析,而是以字的方式去解析,為了統(tǒng)一,軟件已經(jīng)規(guī)定了,RGB565
格式時(shí),字大小是2字節(jié),也就是16位,而 RGB666
格式時(shí),字大小是4字節(jié),也就是32位。
對(duì)于 RGB565
格式,同樣是設(shè)置為 0xff,0x00
。因?yàn)槠聊皇谴蠖?,而芯片存?chǔ)方式是小端,所以芯片的 DBI 模塊,會(huì)自動(dòng)把數(shù)據(jù)從新排列,也就是實(shí)際上 DBI 發(fā)送數(shù)據(jù)時(shí),會(huì)先發(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個(gè)字節(jié),但是沒有CPU是3字節(jié)對(duì)齊的,所以需要一次性輸入4字節(jié),然后 DBI 硬件模塊,會(huì)自動(dòng)舍棄1個(gè)字節(jié),軟件同意舍棄了最后一個(gè)字節(jié)。
依舊以例程為例,例程輸入了 0xff,0x00,0xff,0x00
,為了方便說明,標(biāo)準(zhǔn)為 0xff(1),0x00(1),0xff(2),0x00(2)
,其中 0x00(2)
會(huì)被舍棄掉,然后發(fā)送順序是0xff(2),0x00(1),0xff(1)
,也就是 0xff(2)
是紅色分量,0xff(1)
是藍(lán)色分量,混合可以得到紫色。
-
寄存器
+關(guān)注
關(guān)注
31文章
5432瀏覽量
124048 -
RGB
+關(guān)注
關(guān)注
4文章
807瀏覽量
59789 -
LCD屏
+關(guān)注
關(guān)注
0文章
126瀏覽量
15981 -
SPI接口
+關(guān)注
關(guān)注
0文章
263瀏覽量
35429 -
驅(qū)動(dòng)芯片
+關(guān)注
關(guān)注
13文章
1403瀏覽量
56285
發(fā)布評(píng)論請(qǐng)先 登錄
全志R128應(yīng)用開發(fā)案例—適配SPI驅(qū)動(dòng)ST7789V2.4寸LCD

R128點(diǎn)屏踩坑筆記

評(píng)論