大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是 i.MXRT1060 上 LCD 横向渐变色显示出亮点问题的分析解决经验。

 

痞子衡前段时间在支持一个 i.MXRT1060 客户项目时遇到了 LCD 显示有异常亮点的问题,这个问题的定位和排查花了一点时间,整个过程现在回想起来仍觉得有意思。做嵌入式(尤其是软件)这行主要工作除了写代码就是解 Bug 了,而且很多时候往往是写代码容易,解 Bug 难,所以解 Bug 能力是衡量一个工程师是否资深的重要因素。Bug 不仅要解得好,还得解得快,这个很考验工程师的逻辑思维能力和调试经验。今天痞子衡就给把之前分析解决 LCD 异常亮点问题全过程复现给大家,希望对大家今后解 Bug 有所帮助。

 

本篇是上篇,主要是抛出问题,希望大家能够留言积极回复,给出你解 Bug 的思路,看看谁的思路能更胜一筹。

 

一、问题描述

先给大家简单描述一下这个 LCD 显示异常亮点问题,客户使用的是一块由 ST7701S 驱动的 480x480 分辨率的 RGB 接口 LCD 屏,主控芯片是 i.MXRT1062,客户在 FlexSPI1 接口上挂了一片 QuadSPI Flash 存放应用程序,还在 FlexSPI2 接口上挂了一片 HyperRAM 做显存。为了验证系统是否正常,客户设计了一个 LCD 显示测试程序(即下图中的 App),这个 App 连同 L2 Boot 一起被烧写进 QuadSPI Flash,芯片上电启动,BootROM 加载 L2 Boot 运行,L2 Boot 完成 HyperRAM 初始化(为什么设计二级启动后面会解释)后加载 App 到 HyperRAM 运行,App 里构造 uint32_t s_frameBuffer[480][480](像素格式是 XRGB8888)内容后借助 eLCDIF 模块驱动 LCD 屏显示,s_frameBuffer 里的内容就是简单的横向渐变色,但是渐变色显示出了问题,如下图中左边 LCD 示意图所示,均匀地出现了几根不明白色纵向线条。

 

 

这是客户的 LCD 显示测试代码(下图左侧),基于 \SDK_2.6.2_EVK-MIMXRT1060\boards\evkmimxrt1060\driver_examples\elcdif\rgb 下的 IAR 工程,代码仅稍作修改(LCD 驱动部分要增加 ST7701S 初始化,并且相应调整 LCD 宽高参数),主函数则相当简单,s_frameBuffer[][]放在 HyperRAM 里,其内容填充由 APP_FillFrameBuffer()函数完成,实现红 / 绿 / 蓝三种颜色的横向渐变显示(下图右侧,存在不明亮线条)。

 

 

核心显示数据填充函数 APP_FillFrameBuffer()再贴一遍,防止大家看不清上图中的代码:

 

#define APP_IMG_HEIGHT 480
#define APP_IMG_WIDTH  480

__no_init   uint32_t s_frameBuffer[APP_IMG_HEIGHT][APP_IMG_WIDTH];

void APP_FillFrameBuffer(void)
{
    uint32_t i = 0, j = 0;
    for (i = 0; i < APP_IMG_HEIGHT / 3; i++)
    {
        for (j = 0; j < APP_IMG_WIDTH; j++)
        {
            uint8_t k = j % 255;
            s_frameBuffer[i][j]                    = APP_MakeLutData(k, 0, 0);
            s_frameBuffer[i+APP_IMG_HEIGHT/3][j]   = APP_MakeLutData(0, k, 0);
            s_frameBuffer[i+APP_IMG_HEIGHT*2/3][j] = APP_MakeLutData(0, 0, k);
        }
    }
}

 

二、现有条件

一个实验室,焊接工具一应俱全。

 

一块出问题的客户板子(以及客户测试程序)。

 

客户 LCD 屏厂给的驱动程序(基于 STM32 开发板,屏厂反馈屏面板本身没有问题)

 

一块恩智浦官方 i.MXRT1060-EVK,如下图所示。

 

几片 HyperRAM 芯片(与恩智浦 EVK 上 HyperFlash 同封装,但型号与客户板子上 HyperRAM 不一致)

 

客户 LCD 屏 40pin 连接线与恩智浦 EVK 上 LCD 屏 40pin 连接线线序不一致。

 

 

三、你的解 Bug 思路

  

痞子衡列了一些可能出问题的地方(不一定全),供大家参考:

 

客户 LCD 显示测试代码逻辑是否有问题?

 

客户 LCD 屏与 i.MXRT1060 连接(线序)是否有问题?

 

客户 LCD 屏的 ST7701S 驱动移植(从 STM32 到 i.MXRT1060)是否有问题?

 

客户选用的 HyperRAM 本身质量是否有问题?

 

i.MXRT1060 配置的客户 HyperRAM 时序参数是否有问题?

 

i.MXRT1060 的 LCD 显示模块 eLCDIF 驱动是否有问题?

 

i.MXRT1060 系统的总线处理(如 Cache、总线竞争)是否有问题?

 

请留言给出你能想到的其他出问题的地方,你解 Bug 的思路(要从解决问题的效率出发,看看谁的方法能更快的定位问题)。