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

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

3天内不再提示

如何在i.MXRT1170上快速点亮一款全新LCD屏?

痞子衡嵌入式 来源:痞子衡嵌入式 2024-01-05 15:49 次阅读

我们知道 LCD 屏的接口有很多:DPI-RGB、MIPI DSI、DBI/MCU(I8080)、LVDS、SPI 等等,接口不同,对应的软件驱动也不同。RT1170 片内外设对以上接口都能很好地支持,今天我们主要聊最近比较火的 MIPI DSI 接口。

在恩智浦官方 SDK (v2.14) 里目前支持的 MIPI DSI 接口的 LCD 屏主要有如下四款,但客户在实际应用中选择的屏五花八门(生产 MIPI DSI 接口的 LCD 厂商非常多),如果我们拿到一款全新 LCD 屏,该如何快速点亮它呢?今天痞子衡教你方法:

LCD屏型号 LCD分辨率 LCD驱动IC
晶鸿电子 RK055AHD091 720x1280 瑞鼎科技 RM68200
晶鸿电子 RK055MHD091 720x1280 奇景光电 HX8394-F
晶鸿电子 RK055IQH091 540x960 瑞鼎科技 RM68191
定制屏 G1120B0MIPI 390x390 瑞鼎科技 RM67162

一、点屏准备工作

磨刀不误砍柴工,在开始点屏之前我们需要准备如下材料,这在后续修改和调试 LCD 屏相关代码时非常重要。其中 LCD 屏数据手册一般需要向屏厂获取,有了屏数据手册我们就能知道其相应驱动 IC,从而下载这个驱动 IC 的数据手册。

1.LCD屏配套的数据手册
2.LCD屏内置驱动IC的数据手册
3.RT1170板卡连接LCD屏的原理图
4.恩智浦SDK_2_14_0_MIMXRT1170-EVKB
5.能够访问github

痞子衡就以深圳柯达科电子生产的 KD050FWFIA019-C019A 屏为例,这款 MIPI DSI 屏分辨率是 480x854,其驱动 IC 是来自奕力科技的 ILI9806E。

二、点屏标准步骤

2.1 熟悉SDK标准例程

恩智浦 SDK 里的 elcdif_rgb 例程是一个很好的基础工程,我们可以基于这个工程来修改代码做调试。工程里我们主要关注 elcdif_support.c/h 文件,在这个文件里,恩智浦已经把不同屏之间的差异做了抽离处理,你搜索 MIPI_PANEL_ 宏就能找到那些差异,这些差异的地方就是我们需要改动的地方。

SDK_2_14_0_MIMXRT1170-EVKBoardsevkbmimxrt1170driver_exampleselcdif
gbcm7iar
281f9282-ab9e-11ee-8b88-92fbcf53809c.png

这个 elcdif_rgb 例程里没有看到 G1120B0MIPI 身影,因为小分辨率的圆屏不太适合这个 example,其驱动可在 RT595_SDKoardsevkmimxrt595vglite_examples 里找到。

2.2 调整屏控制I/O脚(Power_en、Reset、Backlight)

先来关注硬件上需要注意的改动,RT1170 上 MIPI DSI 这个外设不同于其它外设有很多 pinmux 选项,其就一组固定的引脚(并且是专用的),所以这组引脚我们不需要做任何代码上的配置。

2829dd96-ab9e-11ee-8b88-92fbcf53809c.png

但是 LCD 屏除了 MIPI DSI 相关信号以及电源、地之外,通常还有三个控制信号,即 Power_en(电源使能-可选)、Reset(硬复位)、Backlight(背光控制),这三个信号一般是通过普通 GPIO 来控制的。

282d98dc-ab9e-11ee-8b88-92fbcf53809c.png

所以我们需要打开板卡原理图,找到 LCD 相关连接把这三个信号所用的 GPIO 找出来,并在代码里如下地方做相应改动:

28310dc8-ab9e-11ee-8b88-92fbcf53809c.png

elcdif_rgb 例程会在共享函数 BOARD_InitLcdPanel() 里操作 BOARD_MIPI_PANEL_BL 宏所指向的 GPIO 来打开背光。此外 BOARD_MIPI_PANEL_RST 和 BOARD_MIPI_PANEL_POWER 宏所指向的 GPIO 操作已经被封装在如下函数里,这个函数被进一步封装进 display_handle_t 里供后续驱动灵活使用:

staticvoidPANEL_PullResetPin(boolpullUp);
staticvoidPANEL_PullPowerPin(boolpullUp);

2.3 创建LCD驱动IC源文件

现在我们需要在如下目录下,创建 ILI9806E 的驱动文件,可以先直接拷贝 hx8394 文件夹下的文件并将其改名后添加进工程,并且在 elcdif_support.c/h 里也复制添加相应代码保证编译通过(后续再参考 ILI9806E 数据手册修改代码)。

SDK_2_14_0_MIMXRT1170-EVKBcomponentsvideodisplay
28350a04-ab9e-11ee-8b88-92fbcf53809c.png

2.4 调整屏上电复位延时(Power_en、Reset)

有了 fsl_ili9806e.c/h 基本源文件后,现在我们需要根据 ILI9806E 数据手册来修改代码。首先是调整屏上电以及复位延时时间,这个延时一般既可以在 KD050FWFIA019-C019A 屏的数据手册也可以在 ILI9806E 的数据手册里找到。

283e140a-ab9e-11ee-8b88-92fbcf53809c.png

有了延时数值之后,在 ILI9806E_Init() 函数里做相应设置即可:

status_tILI9806E_Init(display_handle_t*handle,constdisplay_config_t*config)
{
constili9806e_resource_t*resource=(constili9806e_resource_t*)(handle->resource);
/*Onlysupport480*854*/
if(config->resolution!=FSL_VIDEO_RESOLUTION(480,854))
{
returnkStatus_InvalidArgument;
}
/*Poweron.*/
resource->pullPowerPin(true);
ILI9806E_DelayMs(1U);
/*根据屏数据手册调整复位延时时间.*/
resource->pullResetPin(true);
ILI9806E_DelayMs(10U);
resource->pullResetPin(false);
ILI9806E_DelayMs(10U);
resource->pullResetPin(true);
ILI9806E_DelayMs(120U);

/*代码省略*/
}

2.5 调整屏显示相关参数

现在我们需要在 elcdif_support.h 里根据 KD050FWFIA019-C019A 屏的数据手册修改如下定义包含:屏分辨率、六个行列扫描参数、四个信号极性(APP_POL_FLAGS)、数据位宽,这些都是屏本身的特性。

#if(USE_MIPI_PANEL==MIPI_PANEL_KD050FWFIA019)
#defineAPP_PANEL_HEIGHT854
#defineAPP_PANEL_WIDTH480
#defineAPP_HSW4
#defineAPP_HFP18
#defineAPP_HBP30
#defineAPP_VSW4
#defineAPP_VFP20
#defineAPP_VBP30
#endif
#defineAPP_POL_FLAGS
(kELCDIF_DataEnableActiveHigh|kELCDIF_VsyncActiveLow|kELCDIF_HsyncActiveLow|kELCDIF_DriveDataOnFallingClkEdge)

#defineAPP_DATA_BUS24
#defineAPP_LCDIF_DATA_BUSkELCDIF_DataBus24Bit

关于六个行列扫描参数(HSW/HFP/HBP/VSW/VFP/VBP)稍稍科普一下,这些信号是以行列同步信号(VSYNC/HSYNC)为时间起点来做的延时,相当于在实际显示的图像宽高基础上做了外围扩大,从而提高图像有效区域显示的可靠性(实际上是等待面板做好每行数据刷新前的准备工作)。

2848e588-ab9e-11ee-8b88-92fbcf53809c.png

分辨率和行列扫描参数均设置正确了之后,别忘了根据想要的刷新率(比如 60Hz)计算得出所需的 pixel clock,在 BOARD_InitLcdifClock() 函数里做相应设置。

voidBOARD_InitLcdifClock(void)
{
/*
*Thepixelclockis(height+VSW+VFP+VBP)*(width+HSW+HFP+HBP)*framerate.
*UsePLL_528asclocksource.
*For60Hzframerate,theKD050FWFIA019pixelclockshouldbe29MHz.
*/
constclock_root_config_tlcdifClockConfig={
.clockOff=false,
.mux=4,/*!< PLL_528. */
#if (USE_MIPI_PANEL == MIPI_PANEL_RK055AHD091) || (USE_MIPI_PANEL == MIPI_PANEL_RK055MHD091)
        .div = 9,
#elif (USE_MIPI_PANEL == MIPI_PANEL_RK055IQH091)
        .div = 15,
#elif (USE_MIPI_PANEL == MIPI_PANEL_KD050FWFIA019)
        // 我们需要设置 29MHz 的 pixel clock
        .div = 18,
#endif
    };
    CLOCK_SetRootClock(kCLOCK_Root_Lcdif, &lcdifClockConfig);
    mipiDsiDpiClkFreq_Hz = CLOCK_GetRootClockFreq(kCLOCK_Root_Lcdif);
}

2.6 配置LCD驱动芯片

现在到了最难也是最重要的环节了,KD050FWFIA019-C019A 面板主要是由 ILI9806E 芯片驱动的,ILI9806E 本身是个万能驱动芯片,其支持的接口很多,MIPI DSI 仅是其一,而且 2.5 节里设置的那些关于屏显示相关参数,我们都需要设置进 ILI9806E 内部寄存器里。

打开 ILI9806E 数据手册(V097版),一共 328 页,寄存器一大堆,我们难道要看着数据手册一个个去设置吗?当然不是!这时候需要打开万能的 github,搜索跟 ili9806e 相关的代码,看看前人有没有调试好的现成代码。

28590ec2-ab9e-11ee-8b88-92fbcf53809c.png

其实关于屏的支持,Linux 里做得比较多,痞子衡找了个 RaspberryPI 移植的分支,里面有 ili9806e 参数初始化表,注意这个表不一定完全适用 KD050FWFIA019-C019A(因为用 ILI9806E 芯片驱动的面板非常多),我们需要在这个参数表基础之上做一些调整。

https://github.com/raspberrypi/linux/blob/rpi-6.1.y/drivers/gpu/drm/panel/panel-ilitek-ili9806e.c

把 RaspberryPI 仓库里的参数表移植进我们的 fsl_ili9806e.c 文件里后,粗粗看了一下注释,其配置的是 480x800 的屏,极性设置相关也都和 KD050FWFIA019-C019A 有差异。

最后我们再对照 ILI9806E 数据手册里的寄存器定义做一些参数上的微调,如下四个寄存器需要重点关注。这些微调做完之后,把代码下载进板卡运行,这时候你应该能看到屏开始正常工作了。

285d00fe-ab9e-11ee-8b88-92fbcf53809c.png2860ff74-ab9e-11ee-8b88-92fbcf53809c.png28657e5a-ab9e-11ee-8b88-92fbcf53809c.png2869b8e4-ab9e-11ee-8b88-92fbcf53809c.png

至此,在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤痞子衡便介绍完毕了,掌声在哪里~~~






审核编辑:刘清

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

    关注

    146

    文章

    17123

    浏览量

    350973
  • LCD屏
    +关注

    关注

    0

    文章

    122

    浏览量

    15421
  • 驱动IC
    +关注

    关注

    9

    文章

    302

    浏览量

    33812
  • MIPI
    +关注

    关注

    11

    文章

    310

    浏览量

    48613

原文标题:如何在MCU上快速点亮一款LCD屏(MIPI DSI篇)?

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    i.MXRT1170 的时钟架构

    目前 i.MXRT1xxx 系列主要分为 i.MX RT10xx 和 i.MXRT11xx 两大分支。这两个分支的时钟系统设计是有些差异的,不过总体来说,架构差别不大,我们以如下
    发表于 07-08 17:05 1023次阅读

    介绍i.MXRT1170用于保护片内OCRAM1,2的MECC64功能

    今天痞子衡给大家分享的是i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道。
    的头像 发表于 12-29 16:11 1050次阅读
    介绍<b class='flag-5'>一</b>下<b class='flag-5'>i.MXRT1170</b><b class='flag-5'>上</b>用于保护片内OCRAM1,2的MECC64功能

    i.MXRT1170的相关资料分享

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1xxx系列MCU的划时代新品i.MXRT1170。  自2017年开始,每年的6月25日恩智浦都会在北京举行
    发表于 11-04 08:38

    i.MXRT1170 eFuse空间访问可靠性的保护策略是什么

    Boot时写过两篇,分别是针对RT1050的《eFuse及其烧写方法》 和针对RT600的《OTP及其烧写方法》,今天要介绍的i.MXRT1170 eFuse其实是这两者的融合,在空间组织(尤...
    发表于 12-20 07:56

    i.MXRT1010, 1170型号样的SNVS GPR寄存器读写控制设计资料分享

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1010, 1170型号样的SNVS GPR寄存器读写控制设计。  痞子衡之前两篇文章 《在SBL
    发表于 02-07 07:49

    求助,如何在没有互联网的情况下通过以太网电缆将个简单的十六进制数从I.MXRT1170板发送到PC?

    我有I.MXRT1170 板。我是这个板的新手,我想通过以太网电缆向我的 PC 发送个简单的十六进制数字,如 0x12345678 或任何东西。任何人都可以通过告诉我如何去做以及我可以如何做
    发表于 03-17 07:20

    s32k144evb如何与i.MXRT通信?

    你好呀,我正在为 EV Cluster 设计个项目。我计划将数据从 #S32K144EVB# 发送到 #i.MXRT1170# 以在我的显示器 #RK055HDMIPI4MAO# 显示它。我
    发表于 03-29 07:49

    如何确保 i.MXRT1176 从低功耗模式快速恢复?

    我们有个关于 i.MXRT1176 从低功耗模式恢复缓慢的问题引导 ROM 似乎停留在地址 0x223104,大约 15 秒。这似乎是 i.MXRT1170 上调试安全设计的部分,
    发表于 04-06 07:17

    i.MXRT1166在调试期间禁用WFI节能是为什么?如何让内核保持唤醒状态以进行调试?

    i.MXRT1160/i.MXRT1170 系列找到类似的东西。在这些芯片执行 WFI 指令期间,如何让内核保持唤醒状态以进行调试?
    发表于 06-01 07:22

    痞子衡嵌入式:终于可以放开聊i.MXRT1170这颗划时代MCU了

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1xxx系列MCU的划时代新品i.MXRT1170。  自2017年开始,每年的6月25日恩智浦都会在北京举行
    发表于 10-29 10:21 2次下载
    痞子衡嵌入式:终于可以放开聊<b class='flag-5'>一</b>聊<b class='flag-5'>i.MXRT1170</b>这颗划时代MCU了

    "痞子衡嵌入式:i.MXRT1010, 1170型号样的SNVS GPR寄存器读写控制设计"

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1010 1170型号样的SNVS GPR寄存器读写控制设计。  痞子衡之前两篇文章 《在SBL项
    发表于 12-04 11:36 0次下载
    "痞子衡嵌入式:<b class='flag-5'>i.MXRT</b>1010, <b class='flag-5'>1170</b>型号<b class='flag-5'>上</b>不<b class='flag-5'>一</b>样的SNVS GPR寄存器读写控制设计"

    i.MXRT1170串行NOR Flash双程序可交替启动设计

    i.MXRT10xx 样,这里要聊的还是在片挂载在 FlexSPI 的串行 NOR Flash 里做冗余/双程序设计,就是下图中的 image L 和 image H,不涉及
    的头像 发表于 04-29 15:23 1040次阅读

    i.MXRT1060和RT1170使用高效神经网络进行多人检测

    电子发烧友网站提供《在i.MXRT1060和RT1170使用高效神经网络进行多人检测.pdf》资料免费下载
    发表于 08-17 10:46 0次下载
    在<b class='flag-5'>i.MXRT</b>1060和RT<b class='flag-5'>1170</b><b class='flag-5'>上</b>使用高效神经网络进行多人检测

    i.MXRT1170快速点亮LCD的方法与步骤

    有了 fsl_ili9806e.c/h 基本源文件后,现在我们需要根据 ILI9806E 数据手册来修改代码。首先是调整电以及复位延时时间,这个延时般既可以在 KD050FWFIA019-C019A
    发表于 01-05 15:46 861次阅读
    <b class='flag-5'>i.MXRT1170</b><b class='flag-5'>上</b><b class='flag-5'>快速</b><b class='flag-5'>点亮</b><b class='flag-5'>LCD</b><b class='flag-5'>屏</b>的方法与步骤

    不同J-Link版本对于i.MXRT1170连接复位后处理行为

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是不同J-Link版本对于i.MXRT1170连接复位后处理行为。
    的头像 发表于 08-08 15:29 421次阅读
    不同J-Link版本对于<b class='flag-5'>i.MXRT1170</b>连接复位后处理行为