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

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

3天内不再提示

什么是定位LCD花屏显示问题的第一大法

电子设计 来源:电子设计 作者:电子设计 2020-10-30 14:49 次阅读

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是 i.MXRT1170 上 LCD 花屏显示问题的分析解决经验。

痞子衡最近这段时间在参与一个基于 i.MXRT1170 的大项目(先保个密),需要做一个开机动画功能,板子连接的 LCD 屏分辨率是 1280x480,因为开机动画要求达到 30fps,并且要画质清晰,如果是从 SD 卡里读 mp4 或者 jpeg 去解码,这么高分辨率的图像(暂不考虑低分辨率的图片再用 PXP 模块去拉伸的方案)解码耗时比较长,恐怕难以达成 30fps,所以痞子衡打算直接把图片的裸 rgb 数据事先存在 Flash 里,然后 LCD 模块直接去刷 Flash 里的数据去显示。

板子上的 SPI NOR Flash 有两种,默认是八线 DDR 高性能 Flash,还有一个可选的四线 SDR 普通 Flash,痞子衡做好的代码在默认高性能 Flash 上跑得没问题,换到另一块 rework 为普通四线 Flash 上就出问题了,显示完全是花屏,没有一点图片的影子,到底是怎么回事?跟着痞子衡一起去发现答案吧。

一、项目板卡简图

先来看一下这个项目板卡简图,简图里只示意了痞子衡今天要分享的 LCD 问题相关的器件,显示屏是 TM103XDKP13 控制器驱动的 LVDS 接口屏,跟 i.MXRT 连接的话需要有一个 RGB2LVDS 转接。Flash 都是选的旺宏的,一个是 MX25UW51345(200MHz,8bit,DDR),还有一个是 MX25U25645(133MHz,4bit,SDR)。此外还有两个 16bit 的 W9825G6KH 组成的 32bit SDRAM 做显存,总容量是 64MB。

二、在 Flash 中准备好图片裸数据

首先我们需要在 Flash 中存入图片数据,1280x480-24bpp (rgb888)图片一张的裸数据大小是 1800KB,32MB 的 Flash 最大可以存 18 张图片,为了给程序存储留点空间,我们就存 17 张,从 Flash 偏移 0x100000 处开始存图片。

2.1 截取一段 mp4 视频

痞子衡本地有一个 NXP 十周年宣传视频(MP4 格式),原始分辨率是 1920x1080,可以先用 ffmpeg 或者格式工厂将其转换成 1280x480,然后可以直接用 Windows 自带的图片软件里的 Trim 功能截取其中一段,30fps 帧率的视频截取 1 秒就够了。

2.2 使用 ScreenToGif 软件分离出图片

这时候可以用非常好用的 GIF 制作软件 ScreenToGif 打开这个 1 秒的 MP4,可以看到一共有 31 张图片,可以删掉其中一些留下 17 张,然后将其保存为图片(当前版本仅能保存为 png 格式),可以再用格式工厂软件将图片格式转为 jpg,存在 D:/nxp_logo 文件夹下。

2.3 Python 脚本转成 rgb888 裸数据

有了 17 张 jpg 图片,这时候写一个 Python 脚本(jpg2rgb.py),借助 Image 库将 17 张 jpg 图片中的 rgb 数据全部抽取出来保存在一个 bin 文件中,下面脚本使用命令为 python jpg2rgb.py D:/nxp_logo/ -o startup_video_white_rgb888_17f.bin 。

importsys,os importargparse importImage parser=argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("-o","--output",required=True,metavar="PATH",type=argparse.FileType('wb')) parser.add_argument("input",help="JPEGImagefolder.") args=parser.parse_args() imgFiles=[] #获取指定文件夹中所有 jpg 图片路径 imgFolder=os.path.abspath(args.input) inputFiles=os.listdir(imgFolder) foridxinrange(len(inputFiles)): imgFiles.append(os.path.join(imgFolder,inputFiles[idx])) foridxinrange(len(imgFiles)): #使用 Image 库打开 jpg 图片 imgObj=Image.open(imgFiles[idx]) pixelBuf=imgObj.getdata() #抽取 rgb 裸数据写入 bin 文件 foriinrange(len(pixelBuf)): forjinrange(len(pixelBuf[i])): args.output.write(chr(pixelBuf[i][len(pixelBuf[i])-j-1])) args.output.close()

2.4 将图片裸数据 bin 文件下载进 Flash

现在可以借助 MCUBootUtility 的通用编程器功能将 startup_video_white_rgb888_17f.bin 文件烧录进 Flash 里 0x100000 处偏移的地方。至此,准备工作已经就绪。

三、引出 LCD 花屏显示问题

现在让我们开始设计开机动画程序,可以基于 /SDK_2.x.x_MIMXRT1170-EVK/boards/evkmimxrt1170/jpeg_examples/sd_jpeg 例程,将其中的 LCD 配置,Pinmux 配置稍微改一下,适配这个项目的板子,然后主函数可以精简如下(sd 卡读,libjpeg 解码函数全部去掉):

#defineAPP_FB_HEIGHT480 #defineAPP_FB_WIDTH1280 /*LCDframebufferbyteperpixel,RGB888format,24-bit.*/ #defineAPP_FB_BPP3 constuint32_ts_imagePics=17; constuint32_ts_imageStartAddr=0x30100000; intmain(void) { uint8_t*imageAddr=(uint8_t*)s_imageStartAddr; uint32_timageBytes=APP_FB_HEIGHT*APP_FB_WIDTH*APP_FB_BPP; BOARD_ConfigMPU(); BOARD_InitBootPins(); BOARD_BootClockRUN(); BOARD_ResetDisplayMix(); APP_InitDisplay(); while(1) { /*Waitfortheprevioussetframebufferactive.*/ while(s_newFrameShown==false); /*Nownewframeisready,passittoLCDIF.*/ s_newFrameShown=false; g_dc.ops->setFrameBuffer(&g_dc,0,imageAddr); imageAddr+=imageBytes; if((uint32_t)imageAddr>=(s_imageStartAddr+imageBytes*s_imagePics)) { break; } } } staticvoidAPP_BufferSwitchOffCallback(void*param,void*switchOffBuffer) { s_newFrameShown=true; }

这时候把代码下载进高性能 DDR Flash 的那块板子,我们的代码可以链接到 TCM 里执行,这样不占用运行时 Flash 访问带宽,不与 LCD 抢带宽。断电重启可以看到在 60Hz 的 LCD 刷新率下,开机动画效果显示杠杠的。

现在把代码下载进普通 SDR Flash 的板子试试,可以看到 LCD 显示花屏了,完全没有图像的影子,这时候该怎么定位问题?

四、尝试降低 LCD 刷新率

在尝试降低 LCD 刷新率之前,痞子衡额外做了一些 debug 工作来确认是不是 Flash 焊接的问题,首先是调试器挂上去查看 PC 指针停在哪里,经调试发现,PC 指针是在 TCM 里,根据工程 map 文件可以查到其地址对应的是程序的结尾,说明代码正常跑完了,这至少证明芯片能够正常从 Flash 启动。

然后痞子衡又对程序作了一些改动,将 Flash 中的图片数据拷贝到 SDRAM 中,让 LCD 模块去刷 SDRAM,这时候图像显示是正常的,这几乎就可以定位问题了,是普通 SDR Flash 带宽不够,Flash 访问速度撑不起 60Hz 刷新率。

#defineDEMO_HSW(1U) #defineDEMO_HBP(48U) #defineDEMO_HFP(16U) #defineDEMO_VSW(1U) #defineDEMO_VBP(3U) #defineDEMO_VFP(5U) staticvoidBOARD_InitLcdifClock(void) { /* *Thepixelclockis(height+VSW+VFP+VBP)*(width+HSW+HFP+HBP)*framerate. * *For60Hzframerate,theTM103XDKP13pixelclockshouldbe40MHz. * */ constclock_root_config_tlcdifv2ClockConfig={ .clockOff=false, .mfn=0, .mfd=0, .mux=4,/*!< PLL_528. */         .div      = 12,     };     CLOCK_SetRootClock(kCLOCK_Root_Lcdifv2, &lcdifv2ClockConfig); }

让我们尝试降低 LCD 刷新率来验证是不是 Flash 带宽的问题,在 BOARD_InitLcdifClock()函数中修改 lcdifv2ClockConfig.div 的值,慢慢增大该值,经痞子衡测试,当 div 设为 22 时(即对应 LCD 刷新率为 33.9Hz),终于能够正常显示开机动画了。

五、关于带宽的分析

现在给出痞子衡的观点,对于一个新项目,如果首次测试 LCD 显示,建议先从低刷新率开始,只有低刷新率调试通过,再逐渐增大刷新率,否则会因为带宽问题浪费不少时间。

最后再让我们通过理论公式来推算这款普通 SDR Flash 能支持最大的刷新率,计算公式其实很简单:

LCD 最大刷新率 = (Flash 时钟频率 * Flash 数据位) / 图片大小 = 133MHz * 4bit / (1280 * 480 * 24bit) = 36.08Hz

理论计算值 36.08Hz 跟我们实测值 33.9Hz 很接近,那点差值应该是 FLEXSPI 和 eLCDIF 模块的开销。

至此,i.MXRT1170 上 LCD 花屏显示问题的分析解决经验痞子衡便介绍完毕了,掌声在哪里~~~

审核编辑 黄昊宇

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

    关注

    34

    文章

    4426

    浏览量

    167517
收藏 人收藏

    评论

    相关推荐

    手机将在2013年成为第一大闪存芯片消耗者

    市场调研公司IHS iSuppli近日发布报告称,手机将在2013年成为第一大闪存芯片消耗者。
    发表于 02-03 14:16 965次阅读

    PCB之家,中国PCB行业第一大论坛开通啦

    PCB之家,中国PCB行业第一大论坛,为您提供最及时的PCB行业咨询信息、最新的PCB行业技术资料、以及最专业的PCB人才信息交流,同时还为您提供方便的在线商务交流平台,为您的产品提供个网络展示平台,PCB之家竭诚为您服务  http://www.pcbhom
    发表于 09-30 17:59

    “金三角”撑起2010年电子元器件第一大

    “金三角”撑起2010年电子元器件第一大展 有数据显示,2009年前三季度,中国电子元件、器件行业销售额与去年相比,分别下降2.8%和2.1%,但多数电子元器件三季度
    发表于 01-13 09:23 985次阅读

    腾讯增持至21.25%京东股成第一大股东

    截至8月17日,腾讯持有京东股票比例从2014年5月的17.6%升至21.25%,超过刘强东(微博),成为京东第一大股东。
    发表于 08-20 11:47 1119次阅读

    全球第一大广告巨头WPP下调营收预期 引发抛售惨案

    全球第一大广告巨头WPP在二季报中下调年度营收预期,引发投资者大量抛售其股票,股价跌超10%。
    发表于 08-24 10:16 1114次阅读

    Canalys的最新报告显示:小米取代了三星成为印度第一大智能手机厂商

    根据来自新加坡市场研究公司Canalys的最新报告显示,在去年12月拿下印度27%的出货量份额之后,小米取代了三星成为印度第一大智能手机厂商。
    的头像 发表于 01-27 09:52 3580次阅读

    阿里巴巴已经成为中国第一大AI智能音箱厂商

    天猫精灵官方宣布,天猫精灵系列AI智能音箱目前累计销量已经突破1000万台。这也意味着,阿里巴巴已经成为中国第一大AI智能音箱厂商。
    发表于 03-08 09:31 875次阅读

    科创板 | 顶着“中国第一大硅晶圆厂”光环的它成色几何?

    上交所公布最新批科创板受理名单,其中拥有“中国第一大硅晶圆厂”称号的上海硅产业集团也出现在列。
    的头像 发表于 05-06 11:28 4065次阅读

    报告显示:德国2021年有望成为全球第一大电动汽车市场

    3月6日消息,据国外媒体报道,管理咨询公司麦肯锡发布的报告显示,汽车生产大国德国明年有望生产超过170万辆电动汽车,并成为全球第一大电动汽车市场。
    的头像 发表于 03-06 15:36 2663次阅读

    lcd显示屏出现花屏如何处理

    任何产品在使用过程中都有可能会发生这样或那样的问题,lcd显示屏属于易碎品在使用中也要特别小心,经常有朋友都会遇到关于lcd显示花屏的问题
    发表于 06-24 10:22 5866次阅读

    超越美国!中国首次成为欧盟第一大贸易伙伴

    据商务部官微商务微新闻消息显示,今年前7个月,中欧双边贸易额达到了3827亿欧元(约2.63万亿人民币),同比增加了2.6%,中国首次成为欧盟第一大贸易伙伴,超过欧美贸易额52亿欧元。同时,中国保持欧盟第一大进口来源地、第三大出
    的头像 发表于 09-25 15:21 2092次阅读

    苏州超越上海成为中国第一大工业城市

    其工业实力的强劲。 、苏州超越上海成为中国第一大工业城市 苏州工业依靠的是什么功力再次独占鳌头呢?数据显示: 1、支柱性行业稳定增长:电子信息、电气机械、钢铁、专用设备制造业产值分别增长2.9%、4.9%、6.7%和4.8%,
    的头像 发表于 10-23 10:04 4107次阅读

    特斯拉在美国加州Firebaugh启用全球第一大超级充电站

    经过数月建设,日前,特斯拉在美国加州Firebaugh启用了全球第一大超级充电站。
    的头像 发表于 11-16 10:07 1820次阅读

    LG化学全球第一大电池厂商正式成立

    12月1日,LG化学宣布,全球第一大电池厂商LG Energy Solution(LG能源解决方案)正式成立,同时,这也将是韩国首家纯电池制造公司。
    的头像 发表于 12-02 10:16 3100次阅读

    瑞士第一大移动网络运营商Sunrise将裁员6.14%

    瑞士第一大移动网络运营商Sunrise将裁员6.14% 瑞士第一大移动网络运营商Sunrise目前全职员工总数有2703名;Sunrise计划2024年3月底裁员166 人;约占6.14%。 Sunrise希望通过裁员来实现更精简的公司结构的目的。
    发表于 01-17 18:51 1007次阅读