加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、點屏準備工作
    • 二、點屏標準步驟
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

如何在MCU上快速點亮一款LCD屏(MIPI DSI篇)?

02/10 09:25
8123
閱讀需 17 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是i.MXRT1170上快速點亮一款全新LCD屏的方法與步驟。

我們知道 LCD 屏的接口有很多:DPI-RGB、MIPI DSI、DBI/MCU(I8080)、LVDSSPI 等等,接口不同,對應(yīng)的軟件驅(qū)動也不同。RT1170 片內(nèi)外設(shè)對以上接口都能很好地支持,今天我們主要聊最近比較火的 MIPI DSI 接口。

恩智浦官方 SDK (v2.14) 里目前支持的 MIPI DSI 接口的 LCD 屏主要有如下四款,但客戶在實際應(yīng)用中選擇的屏五花八門(生產(chǎn) MIPI DSI 接口的 LCD 廠商非常多),如果我們拿到一款全新 LCD 屏,該如何快速點亮它呢?今天痞子衡教你方法:

LCD屏型號 LCD分辨率 LCD驅(qū)動IC
晶鴻電子 RK055AHD091 720x1280 瑞鼎科技 RM68200
晶鴻電子 RK055MHD091 720x1280 奇景光電 HX8394-F
晶鴻電子 RK055IQH091 540x960 瑞鼎科技 RM68191
定制屏 G1120B0MIPI 390x390 瑞鼎科技 RM67162

一、點屏準備工作

磨刀不誤砍柴工,在開始點屏之前我們需要準備如下材料,這在后續(xù)修改和調(diào)試 LCD 屏相關(guān)代碼時非常重要。其中 LCD 屏數(shù)據(jù)手冊一般需要向屏廠獲取,有了屏數(shù)據(jù)手冊我們就能知道其相應(yīng)驅(qū)動 IC,從而下載這個驅(qū)動 IC 的數(shù)據(jù)手冊。

1.?LCD?屏配套的數(shù)據(jù)手冊
2.?LCD?屏內(nèi)置驅(qū)動?IC?的數(shù)據(jù)手冊
3.?RT1170?板卡連接?LCD?屏的原理圖
4.?恩智浦?SDK_2_14_0_MIMXRT1170-EVKB
5.?能夠訪問?github

痞子衡就以深圳柯達科電子生產(chǎn)的 KD050FWFIA019-C019A 屏為例,這款 MIPI DSI 屏分辨率是 480x854,其驅(qū)動 IC 是來自奕力科技的 ILI9806E。

二、點屏標準步驟

2.1 熟悉SDK標準例程

恩智浦 SDK 里的 elcdif_rgb 例程是一個很好的基礎(chǔ)工程,我們可以基于這個工程來修改代碼做調(diào)試。工程里我們主要關(guān)注 elcdif_support.c/h 文件,在這個文件里,恩智浦已經(jīng)把不同屏之間的差異做了抽離處理,你搜索 MIPI_PANEL_ 宏就能找到那些差異,這些差異的地方就是我們需要改動的地方。

SDK_2_14_0_MIMXRT1170-EVKBboardsevkbmimxrt1170driver_exampleselcdifrgbcm7iar

這個 elcdif_rgb 例程里沒有看到 G1120B0MIPI 身影,因為小分辨率的圓屏不太適合這個 example,其驅(qū)動可在 RT595_SDKboardsevkmimxrt595vglite_examples 里找到。

2.2 調(diào)整屏控制I/O腳(Power_en、Reset、Backlight)

先來關(guān)注硬件上需要注意的改動,RT1170 上 MIPI DSI 這個外設(shè)不同于其它外設(shè)有很多 pinmux 選項,其就一組固定的引腳(并且是專用的),所以這組引腳我們不需要做任何代碼上的配置。

但是 LCD 屏除了 MIPI DSI 相關(guān)信號以及電源、地之外,通常還有三個控制信號,即 Power_en(電源使能-可選)、Reset(硬復(fù)位)、Backlight(背光控制),這三個信號一般是通過普通 GPIO 來控制的。

所以我們需要打開板卡原理圖,找到 LCD 相關(guān)連接把這三個信號所用的 GPIO 找出來,并在代碼里如下地方做相應(yīng)改動:

elcdif_rgb 例程會在共享函數(shù) BOARD_InitLcdPanel() 里操作 BOARD_MIPI_PANEL_BL 宏所指向的 GPIO 來打開背光。此外 BOARD_MIPI_PANEL_RST 和 BOARD_MIPI_PANEL_POWER 宏所指向的 GPIO 操作已經(jīng)被封裝在如下函數(shù)里,這個函數(shù)被進一步封裝進 display_handle_t 里供后續(xù)驅(qū)動靈活使用:

static?void?PANEL_PullResetPin(bool?pullUp);
static?void?PANEL_PullPowerPin(bool?pullUp);

2.3 創(chuàng)建LCD驅(qū)動IC源文件

現(xiàn)在我們需要在如下目錄下,創(chuàng)建 ILI9806E 的驅(qū)動文件,可以先直接拷貝 hx8394 文件夾下的文件并將其改名后添加進工程,并且在 elcdif_support.c/h 里也復(fù)制添加相應(yīng)代碼保證編譯通過(后續(xù)再參考 ILI9806E 數(shù)據(jù)手冊修改代碼)。

SDK_2_14_0_MIMXRT1170-EVKBcomponentsvideodisplay

2.4 調(diào)整屏上電復(fù)位延時(Power_en、Reset)

有了 fsl_ili9806e.c/h 基本源文件后,現(xiàn)在我們需要根據(jù) ILI9806E 數(shù)據(jù)手冊來修改代碼。首先是調(diào)整屏上電以及復(fù)位延時時間,這個延時一般既可以在 KD050FWFIA019-C019A 屏的數(shù)據(jù)手冊也可以在 ILI9806E 的數(shù)據(jù)手冊里找到。

有了延時數(shù)值之后,在 ILI9806E_Init() 函數(shù)里做相應(yīng)設(shè)置即可:

status_t?ILI9806E_Init(display_handle_t?*handle,?const?display_config_t?*config)
{
????const?ili9806e_resource_t?*resource?=?(const?ili9806e_resource_t?*)(handle->resource);
????/*?Only?support?480?*?854?*/
????if?(config->resolution?!=?FSL_VIDEO_RESOLUTION(480,?854))
????{
????????return?kStatus_InvalidArgument;
????}
????/*?Power?on.?*/
????resource->pullPowerPin(true);
????ILI9806E_DelayMs(1U);
????/*?根據(jù)屏數(shù)據(jù)手冊調(diào)整復(fù)位延時時間.?*/
????resource->pullResetPin(true);
????ILI9806E_DelayMs(10U);
????resource->pullResetPin(false);
????ILI9806E_DelayMs(10U);
????resource->pullResetPin(true);
????ILI9806E_DelayMs(120U);
????
????/*?代碼省略?*/
}

2.5 調(diào)整屏顯示相關(guān)參數(shù)

現(xiàn)在我們需要在 elcdif_support.h 里根據(jù) KD050FWFIA019-C019A 屏的數(shù)據(jù)手冊修改如下定義包含:屏分辨率、六個行列掃描參數(shù)、四個信號極性(APP_POL_FLAGS)、數(shù)據(jù)位寬,這些都是屏本身的特性。

#if?(USE_MIPI_PANEL?==?MIPI_PANEL_KD050FWFIA019)
#define?APP_PANEL_HEIGHT?854
#define?APP_PANEL_WIDTH??480
#define?APP_HSW??????????4
#define?APP_HFP??????????18
#define?APP_HBP??????????30
#define?APP_VSW??????????4
#define?APP_VFP??????????20
#define?APP_VBP??????????30
#endif
#define?APP_POL_FLAGS?
????(kELCDIF_DataEnableActiveHigh?|?kELCDIF_VsyncActiveLow?|?kELCDIF_HsyncActiveLow?|?kELCDIF_DriveDataOnFallingClkEdge)

#define?APP_DATA_BUS???????24
#define?APP_LCDIF_DATA_BUS?kELCDIF_DataBus24Bit

關(guān)于六個行列掃描參數(shù)(HSW/HFP/HBP/VSW/VFP/VBP)稍稍科普一下,這些信號是以行列同步信號(VSYNC/HSYNC)為時間起點來做的延時,相當(dāng)于在實際顯示的圖像寬高基礎(chǔ)上做了外圍擴大,從而提高圖像有效區(qū)域顯示的可靠性(實際上是等待面板做好每行數(shù)據(jù)刷新前的準備工作)。

分辨率和行列掃描參數(shù)均設(shè)置正確了之后,別忘了根據(jù)想要的刷新率(比如 60Hz)計算得出所需的 pixel clock,在 BOARD_InitLcdifClock() 函數(shù)里做相應(yīng)設(shè)置。

void?BOARD_InitLcdifClock(void)
{
????/*
?????*?The?pixel?clock?is?(height?+?VSW?+?VFP?+?VBP)?*?(width?+?HSW?+?HFP?+?HBP)?*?frame?rate.
?????*?Use?PLL_528?as?clock?source.
?????*?For?60Hz?frame?rate,?the?KD050FWFIA019?pixel?clock?should?be?29MHz.
?????*/
????const?clock_root_config_t?lcdifClockConfig?=?{
????????.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)
????????//?我們需要設(shè)置?29MHz?的?pixel?clock
????????.div?=?18,
#endif
????};
????CLOCK_SetRootClock(kCLOCK_Root_Lcdif,?&lcdifClockConfig);
????mipiDsiDpiClkFreq_Hz?=?CLOCK_GetRootClockFreq(kCLOCK_Root_Lcdif);
}

2.6 配置LCD驅(qū)動芯片

現(xiàn)在到了最難也是最重要的環(huán)節(jié)了,KD050FWFIA019-C019A 面板主要是由 ILI9806E 芯片驅(qū)動的,ILI9806E 本身是個萬能驅(qū)動芯片,其支持的接口很多,MIPI DSI 僅是其一,而且 2.5 節(jié)里設(shè)置的那些關(guān)于屏顯示相關(guān)參數(shù),我們都需要設(shè)置進 ILI9806E 內(nèi)部寄存器里。

打開 ILI9806E 數(shù)據(jù)手冊(V097版),一共 328 頁,寄存器一大堆,我們難道要看著數(shù)據(jù)手冊一個個去設(shè)置嗎?當(dāng)然不是!這時候需要打開萬能的 github,搜索跟 ili9806e 相關(guān)的代碼,看看前人有沒有調(diào)試好的現(xiàn)成代碼。

其實關(guān)于屏的支持,Linux 里做得比較多,痞子衡找了個 RaspberryPI 移植的分支,里面有 ili9806e 參數(shù)初始化表,注意這個表不一定完全適用 KD050FWFIA019-C019A(因為用 ILI9806E 芯片驅(qū)動的面板非常多),我們需要在這個參數(shù)表基礎(chǔ)之上做一些調(diào)整。

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

把 RaspberryPI 倉庫里的參數(shù)表移植進我們的 fsl_ili9806e.c 文件里后,粗粗看了一下注釋,其配置的是 480x800 的屏,極性設(shè)置相關(guān)也都和 KD050FWFIA019-C019A 有差異。

最后我們再對照 ILI9806E 數(shù)據(jù)手冊里的寄存器定義做一些參數(shù)上的微調(diào),如下四個寄存器需要重點關(guān)注。這些微調(diào)做完之后,把代碼下載進板卡運行,這時候你應(yīng)該能看到屏開始正常工作了。

至此,在i.MXRT1170上快速點亮一款全新LCD屏的方法與步驟痞子衡便介紹完畢了,掌聲在哪里~~~

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
CPC1918J 1 IXYS Integrated Circuits Division Solid State Relay, TRANSISTOR OUTPUT SOLID STATE RELAY, 2500 V ISOLATION-MAX, ROHS COMPLIANT, ISOPLUS264, 4 PIN
$10.07 查看
TJA1052IT/5Y 1 NXP Semiconductors TJA1052i - Galvanically isolated high-speed CAN transceiver SOP 16-Pin

ECAD模型

下載ECAD模型
$7.84 查看
ABS07-166-32.768KHZ-T 1 Abracon Corporation IOT 32.786KHZ XTAL

ECAD模型

下載ECAD模型
$0.82 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

碩士畢業(yè)于蘇州大學(xué)電子信息學(xué)院,目前就職于恩智浦(NXP)半導(dǎo)體MCU系統(tǒng)部門,擔(dān)任嵌入式系統(tǒng)應(yīng)用工程師。痞子衡會定期分享嵌入式相關(guān)文章