0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈全志R128点屏SPI LCD颜色的相关配置

冬至子 来源:丨budboool 作者:丨budboool 2023-12-06 16:50 次阅读

SPI LCD 颜色相关问题

首先,得先确定显示屏使用的是SPI接口,还是DBI接口,不同的接口,输入数据的解析方式是不一样的。

DBI接口的全称是 Display Bus Serial Interface ,在显示屏数据手册中,一般会说这是SPI接口,所以有人会误认为SPI屏可以使用 normal spi 去直接驱动。

阅读lcd_dbi_if部分的介绍可以知道,在3线模式时,发送命令前有1位A0用于指示当前发送的是数据,还是命令。

而命令后面接着的数据就没有这个A0位了,代表SPI需要在9位和8位之间来回切换,而在读数据时,更是需要延时 dummy clock 才能读数据,normal spi 都很难,甚至无法实现。所以 normal spi 只能模拟4 线的DBI的写操作。

对于R128这类支持DBI接口的CPU,可以选择不去了解SPI。如果需要用到SPI去驱动显示屏,必须把显示屏设置成小端。

RGB565和RGB666

SPI显示屏一般支持RGB444,RGB565和RGB666,RGB444使用的比较少,所以只讨论RGB565和RGB666.

RGB565代表一个点的颜色由2字节组成,也就是R(红色)用5位表示,G(绿色)用6位表示,B(蓝色)用5位表示,如下图所示:

image-20231016100553340

RGB666一个点的颜色由3字节组成,每个字节代表一个颜色,其中每个字节的低2位会无视,如下图所示:

image-20231016100620890

SPI 接口

因为SPI接口的通讯效率不高,所以建议使用RGB565的显示,以 jlt35031c 显示屏为例,他的显示驱动芯片ST7789v,设置显示格式的方式是往 3a 寄存器写入0x55(RGB565)或者 0x66(RGB666),在 R128SDK 中,已经把 jlt35031c 的通讯格式写死为 0x55lcd_pixel_fmt配置选项无效:

sunxi_lcd_cmd_write(sel, 0x3a);
sunxi_lcd_para_write(sel, 0x55);

在例程中,输入的数据是 0xff,0x00,0xff,0x00,对于SPI接口,是按字节发送。实际上,例程只需要每次发送2字节即可,因为前后发送的都是相同的ff 00,所以没有看出问题。

根据对 565 的数据解析,我们拆分 ff 00 就可以得到红色分量是 0b11111,也就是 31,绿色是0b111000,也就是 56,,蓝色是 0.我们等效转换成 RGB888,有:

R = 31/31*255 = 255
G = 56/63*255 = 226

在调色板输入对应颜色,就可以得到黄色

image-20231016100913213

因为 DBI 通讯效率较高,所以可以使用 RGB565 或者 RGB666,使用 DBI 接口,也就是 lcd_if 设置为1时,驱动会根据 lcd_pixel_fmt 配置寄存器,以 SDK 中的 kld2844b.c 为例,这显示屏的显示驱动也是 ST7789,但是不同的屏幕,厂家封装时已经限制了通讯方式,所以即使是能使用 DBI 接口的驱动芯片的屏幕,或许也用不了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 格式,不再是以字节的形式去解析,而是以字的方式去解析,为了统一,软件已经规定了,RGB565 格式时,字大小是2字节,也就是16位,而 RGB666 格式时,字大小是4字节,也就是32位。

对于 RGB565 格式,同样是设置为 0xff,0x00。因为屏幕是大端,而芯片存储方式是小端,所以芯片的 DBI 模块,会自动把数据从新排列,也就是实际上 DBI 发送数据时,会先发送0x00,再发送0xff,也就是红色分量为0,绿色分量为 0b000111,也就是7,蓝色分量是 0x11111,也就是31,我们同样转换成RGB888

G = 7/63*255 = 28
B= 31/31*255 = 255

在调色板上输入,可以得到蓝色。

image-20231016101233907

如果是 RGB666,虽然占用的是3个字节,但是没有CPU是3字节对齐的,所以需要一次性输入4字节,然后 DBI 硬件模块,会自动舍弃1个字节,软件同意舍弃了最后一个字节。

依旧以例程为例,例程输入了 0xff,0x00,0xff,0x00,为了方便说明,标准为 0xff(1),0x00(1),0xff(2),0x00(2),其中 0x00(2)会被舍弃掉,然后发送顺序是0xff(2),0x00(1),0xff(1),也就是 0xff(2) 是红色分量,0xff(1) 是蓝色分量,混合可以得到紫色。

image-20231016101308346

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5328

    浏览量

    120116
  • RGB
    RGB
    +关注

    关注

    4

    文章

    798

    浏览量

    58414
  • LCD屏
    +关注

    关注

    0

    文章

    122

    浏览量

    15404
  • SPI接口
    +关注

    关注

    0

    文章

    258

    浏览量

    34348
  • 驱动芯片
    +关注

    关注

    13

    文章

    1264

    浏览量

    54500
收藏 人收藏

    评论

    相关推荐

    R128 BLE最高吞吐量测试正确配置测试方法

    R128使用前我们需要了解BLE的最高吞吐量,以方便评估相关功能的开发。
    的头像 发表于 10-27 17:17 1290次阅读
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b> BLE最高吞吐量测试正确<b class='flag-5'>配置</b>测试方法

    R128应用开发案例—适配SPI驱动ST7789V2.4寸LCD

    R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点
    的头像 发表于 11-02 16:44 939次阅读
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>应用开发案例—适配<b class='flag-5'>SPI</b>驱动ST7789V2.4寸<b class='flag-5'>LCD</b>

    R128内存泄漏调试案例分享

    硬件:R128 软件:FreeRTOS + rtplayer\_test(Cedarx)+ AudioSystem
    的头像 发表于 11-20 17:27 972次阅读
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>内存泄漏调试案例分享

    R128踩坑笔记

    本文所整理的R128踩坑笔记均是在参考以下应用开发案例进行屏幕适配时遇到的实际开发问题,涵盖了屏幕花屏、屏幕白屏、LVGL显示颜色错误等常见问题的解决方法。
    的头像 发表于 12-03 10:17 1264次阅读
    <b class='flag-5'>R128</b><b class='flag-5'>点</b><b class='flag-5'>屏</b>踩坑笔记

    纵享丝滑!R128+LVGL驱动多尺寸RGB LCD屏幕流畅运行

    新晋神器,R128!各种屏幕都能!高刷、大、宽色域......通常来讲,显示器的配置越高
    发表于 12-22 09:52

    R128硬件设计指南①

    。添加按键时保证按键按下后,ADC网络电压范围为 0~1.08V,最小间隔大于 200mV。 LCD电路接口R128 支持一路 RGB接口和一路 SPI
    发表于 01-04 09:23

    R128 SDK架构与目录结构

    R128 S2 是提供的一款 M33(ARM)+C906(RISCV-64)+HIFI5(Xtensa) 三核异构 SoC,同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M
    发表于 01-05 10:05

    R128 Devkit开发板原理图模块介绍及使用说明

    :CH341SER.EXE 购买链接 百问科技淘宝店 - R128 DevKit 原理图模块介绍R128 模组R128 模组使用 SMT
    发表于 01-17 09:45

    使用R128将LVGL运行在SPI TFT GUI上

    LVGL 与 SPI TFT GUI 本次使用的是 Dshan_Display Module,如下图: 引脚配置如下: R128 Devkit TFT 模块 PA12 CS PA13 SCK
    发表于 10-23 13:56

    R128应用开发案例——SPI 驱动 TFT LCD

    SPI 驱动 TFT LCD R128 平台提供了 SPI DBI 的 SPI TFT 接口
    发表于 10-23 14:29

    R128平台SPI与DBI性能大对比

    SPI 与 DBI 性能对比 R128 平台的 SPI 接口参数如下 全双工同步串行接口 Master/Slave模式可配置 支持最大96MHz时钟频率 支持
    发表于 11-13 15:58

    R128SPI LCD颜色相关问题

    SPI LCD 颜色相关问题 首先,得先确定显示使用的是SPI接口,还是DBI接口,不同的接口,输入数据的解析方式是不一样的。 DBI接口
    发表于 12-06 09:50

    R128使用RGB LCD移植方法教程

    r128-devkit-100ask-rgb 方案,仓库地址: Gitee: https://gitee.com/weidongshan/100ask_r128_demos/tree/master/other/RGB_LCD
    发表于 12-18 17:03

    R128适配ST7789v LCD

    R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点
    的头像 发表于 10-23 11:26 945次阅读
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>适配ST7789v <b class='flag-5'>LCD</b>

    R128启用USB ADB以及无线ADB配置方法

    首先在FreeRTOS的环境下,选择r128\_c906\_pro
    的头像 发表于 11-01 11:43 1147次阅读
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>R128</b>启用USB ADB以及无线ADB<b class='flag-5'>配置</b>方法