V1.3 / FAQ / 中文

TXW82x LCD FAQ

泰芯半导体LOGO 2022版本透明底

责任与版权

修订记录

日期 版本 描 述 修订人

2026-07-15

V1.3

增加mcu-spi屏幕帧间命令等修改 Ethan
2026-05-23

V1.2

添加mipi屏幕设置,rgb屏幕抖动处理操作等 Ethan
2025-10-09

V1.1

初始版本 Ethan

1. SPI屏幕驱动配置讲解

1.1. 简要说明

相比之前81x芯片82x lcdc 模块进行了升级可以直接支持spi屏幕,不必在占用spi总线。配置一个spi屏幕大致步骤,配置io,lcdc 参数,替换spi屏幕驱动,编译调试出图。

Note:以release sdk txw82x_fpv_2.7.07-37092_beta版本为基础介绍。

1.2. SPI IO 配置

SPI屏幕常见控制引脚有:CS ,SCL ,SDA, DC ,TE, RES 等引脚,分别作用如下:

  • CS - 片选控制引脚
  • SCL - 时钟信号输出脚
  • SDA - 数据命令输出信号脚
  • DC - 命令数据选择引脚
  • TE - 防撕裂引脚,出现撕裂的时候用于同步刷新
  • RES - 复位引脚

在目前SDK中以上引脚,如果定义了PIN_FROM_PARAM的话,需要到project/ config.cfg 中去配置对应IO,可以参考下图。

如果没有定义PIN_FROM_PARAM,只需要在project_config.h中修改即可,可以参考下图。

Note:要注意芯片IO电压阈问题,譬如上图中用到的PB9~PB13是VCC1电压阈,开发板默认接的1.8V。而LCD的VDD目前接的是3.3V,所以VCC1改接成3.3V,避免通信失败。

1.3. LCDC 参数配置

对82x芯片的LCDC模块配置,在lcdstruct 结构体中,如果你要新加一份新的驱动芯片,可以模仿st7735的配置另copy一份.c文件。以下介绍几项重要配置。

  1. 总线相关配置默认跟st7735一致:

  • lcd_bus_type(总线类型),bus_width(总线宽度),color_mode(颜色模式)

  1. 旋转角度配置:

  • osd_scan_mode (osd层lvgl的旋转角度),按需配置。

  • scan_mode(video层的旋转角度特殊,谨慎使用),按需配置。

  1. 总线时钟速率:

  • pclk(spi写入时钟频率),由系统时钟分频而来,根据lcd驱动芯片去适配。

  1. lcd有效显示尺寸设置

  • screen_w/h:需要按实际显示范围来设置。

  • video_w/h和osd_w/h:分别是video和osd层有效显示宽高,按实际显示范围设置,不能超过screen_w/h。

  • video_x/y和osd_x/y:分别是video和osd层偏移,有需要的可以填没有的就默认0,确保所要显示的图像信息都在screen_w/h内,不能超过screen_w/h的显示范围。

  1. init_table是lcd寄存器初始化表,frame_table帧间命令暂时可以不用,需要的可以参考后面章节添加,其余为提及部分跟st7735配置一致。

    Note:思维发散一下,相同驱动芯片会遇到驱动不同size屏幕,每次都需要改一下2a,2b设置显示范围。是否可以不改初始化表,可以通过lcdc偏移操作,screen_w/h设置成驱动芯片显存范围,video_w/h和osd_w/h设置有效显示范围,video_x/y和osd_x/y设置XOFFSET和YOFFSET偏移,参数是由显存宽高和有效宽高计算得来,按照差值除2这个逻辑计算。设置后lcdc本身会做偏移,所以不用在初始化lcd寄存器的时候设置2a,2b。

1.4. 屏幕寄存器初始化

init_table,这部分需要根据屏幕驱动IC来配置,一般可以直接要求供应商提供!但也会存在供应商给的配置文件不对无法点亮,需要使用者有一定的datasheet阅读能力检查设置是否正常。

上图中展示的就是LCD寄存器初始化表:

隐藏部分是porch/gate/vcom/lcm/vdv/vrh/power/gamma等相关配置。(需要深入研究的可以参考lcd驱动芯片datasheet)。

  • 0x11,sleep out退出睡眠,可以放置在最开始部分,随后加一定延时用于稳定。
  • 0x3a,pixel format,像素颜色格式设置,设置成rgb565跟lcdc模块一致。
  • 0x21,display inversion,反转显示模式,退出用0x20,重复无设置无作用。
  • 0x29,display on,打开lcd显示,显存内容会被激活显示。
  • 0x2a,0x2b,行列地址设置,用于设置显示有效区(这里设置成最大显存,lcdc做偏移)。
  • 0x2c,memory write,写显存命令,发送显存数据前使用。
  • END,结束标识,用于判断结束。

1.5. 检查初始化调用情况

这部分由于部分新sdk释放冲忙,合并的时候未将初始化部分添加进去,主要检查以下部分:

  1. app_lcd.c文件下lcd_hardware_init函数分支是否有对LCD_BUS_SPI4类型做判断。

  2. app_lcd.c文件下lcd_hardware_init565函数中是否以添加LCD_BUS_SPI4相关配置。

    lcd_spi_cs_lock_time的三个参数作用:一个是cs拉低后,什么时候出数据;一个是数据结束后,什么时候拉高cs;一个cs间的最小hold间隔时间,一般不需要调整。

1.6. 运行lvgl benchmark测试出图

  1. app_fpv.c打开lvgl_init_msic组件函数。

  2. interface_mgnt_v3.c文件中屏蔽main_ui,添加lv_demo_benchmark。

  3. 编译运行,下载到板子上,查看点亮情况。

Note:如果有字体报错提醒,可以在lv_config.h中打开对应字号字体。

2. MIPI-DSI屏幕驱动配置讲解

2.1. 简要说明

相比之前81x芯片82x lcdc模块进行了升级,可以支持mipi屏幕。配置一个mipi-dsi屏幕大致步骤,配置io,lcdc参数,替换mipi屏幕驱动,编译调试出图,分享一些mipi调试技巧

Note:以release sdk txw82x_fpv_2.7.07-37092_beta版本为基础介绍。

2.2. DSI IO 配置

MIPI屏幕常见控制引脚有,DSI_CLKN/P,DSI_D0N/P ,DSI_D1N/P用于命令数据通讯,以及RES,BACK_LIGHT,复位和背光控制引脚。

/*mipi dsi io 配置 ,引脚可以按组映射,N P 引脚可以互换*/

#define PIN_MIPI_DSI_CLKN PD_7//default PD_2

#define PIN_MIPI_DSI_CLKP PD_6//default PD_3

#define PIN_MIPI_DSI_D0N PD_5//default PD_4

#define PIN_MIPI_DSI_D0P PD_4//default PD_5

#define PIN_MIPI_DSI_D1N PD_3//default PD_6

#define PIN_MIPI_DSI_D1P PD_2//default PD_7

/***4 lane 只有96pin封装支持 不常用 ***/

#define PIN_MIPI_DSI_D2N 255//default PD_8

#define PIN_MIPI_DSI_D2P 255//default PD_9

#define PIN_MIPI_DSI_D3N 255//default PD_10

#define PIN_MIPI_DSI_D3P 255//default PD_11

#define PIN_LCD_BKLIGHT PB_8 //背光控制引脚 需要用户自己定义

#define PIN_LCD_RESET PB_9 // lcd 复位控制引脚,硬件电路上也可以直接硬件控制

Note:如果project_confi.h中开启PIN_FROM_PARAM,以上PIN脚IO定义是通过脚本和config.cfg配置去实现的。如果遇到4lane的屏幕接82x_2lane的芯片需要确定屏幕硬件或者软件以将屏幕设置成2lane模式。

2.3. MIPI-DSI接口LCDC参数配置

82x芯片的lcdc模块配置成mipi-dsi接口,在lcdstruct结构体中,如果你要加一份新的驱动芯片,可以模仿st7701s_mipi.c的配置另copy一份.c文件。重点关注以下几点:

  1. 总线相关配置默认跟st7701s_mipi一致:

  • lcd_bus_type(总线类型),bus_width(总线宽度),color_mode(颜色模式)

  1. 旋转角度配置:

  • osd_scan_mode (osd层lvgl的旋转角度),按需配置。

  • scan_mode(video层的旋转角度特殊,谨慎使用)按需配置。

  1. 总线时钟速率:

  • pclk(mipi 的像素时钟),根据lcd驱动芯片要求去适配。

  • 目前7701配置的24Mhz,那么2lane高速模式下单lane速率就要是24*3*8/2=288Mhz,帧率就是像素点+porch 约等于51FPS,帧率够用就好,如果一味的提升会增加功耗和psram的带宽压力。

  1. lane_num数量配置:根据实际屏幕需求设置1lane还是2lane。

  2. lcd有效显示尺寸设置:

  • screen_w/h:需要按你实际驱动芯片的显存宽高来设置。

  • video_w/h和osd_w/h:分别是video和osd层有效显示宽高,按实际显示范围设置。

  • video_x/y和osd_x/y:分别是video和osd层偏移,通过计算得来。

  1. porch设置:

    也就是行场消隐,根据屏厂要求填写,屏幕不同porch设置不同。

  2. init_table是lcd寄存器初始化表(找屏厂索取)记得END结尾,frame_table暂时可以不用。

Note:mipi需要注意一下DSI单lane速率上限,如果所需于不高于480M就选DSI_MODULE_CLK480,高于480M就选DSI_MODULE_CLK_960M,在mipi_dsi_driver.c中配置

2.4. MIPI-DSI屏幕调试技巧

  • Step1:打开turnaround模式,查看发送的初始化命令是否会卡住,是否完全发送。

  • Step2:用逻辑分析仪(逻辑电平1.2V或者1.5V)抓取一下LowPowerMode下dat0lane发送的cmd是否有回应。

  • Step3:在0x29打开显示命令前,发送0x23看看是否像素点全亮,或者让lcd驱动芯片进入自测模式。需要在dsi切换高速模式前while(1)住。

  • Step4:读取lcd 寄存器状态,根据芯片手册查看对应寄存器状态是否正确。

Note:如果在点亮mipi屏幕时发现颜色偏色,不是顺序不对的那种情况,有可能是屏幕GCK锁存出错,可以做以下尝试:上下小幅度修改vbp参数,比如上下加1,加2,加3变化。以及修改hs/vs极性,譬如hs_inv=0,vs_inv=0,可以修改成hs_inv=1,vs_inv=1。

3. SPI屏幕CLK异常停止,在4线SD卡带FEM应用中注意

在开了4线SD卡,且开了FEM的应用中需要在pin_function.c 修改lcd_pin_func函数中关于dtclk 映射配置。

4. LCD屏幕抖动

4.1. dclk补全设置

留心这里设置,如果没有就在lcd_hardware_init565添加打开,这里是处理帧间隔停clk抖动的屏幕,rgb/mipi屏幕均建议开启。

4.2. 缩短帧间隔设置

如果video旋转角度是0或者180,那么推荐尝试改小linebuf行数减少等待时间,目前默认是64行,可以修改成32,16,8。这里是处理某些对帧间隔要求比较严格导致抖动的屏幕。

4.3. 修改dma burst

修改device.c中dma设置,修改DMA2AHB_BURST_CH_ROTATE_IN_RD对psram占用效率.其余改小DMA2AHB_BURST_CH_ROTATE_IN_RD改大。如果video旋转的角度只是0度或者180度,DMA2AHB_BURST_CH_ROTATE_IN_RD可以设置到最大,如果旋转角度是90度或者270度遵循pingpang原则,burst设置32,linebuf行数就是32x2=64。

4.4. 添加osd fifo

在app_lcd.c中lcd_driver_init函数中添加下图代码段,对osd抖动有一定优化,fifo size可以适当加大

4.5. OTA出现抖动

空口升级或者写flash保存参数的时候,有概率会holdcpu,导致屏幕抖动,建议开启lcd autokick

4.6. 大屏video+osd频繁解码出现抖动的情况

以上处理完还还出现抖动的情况 ,且会频繁出现lch打印,建议把osd_fifo和video line_buf放到sram最后面,减少内存竞争。

5. MCU和SPI屏幕利用外部中断做TE同步

5.1. 简要说明

带显存的屏幕都会面临撕裂TE同步问题,目前sdk默认是没有处理TE同步,可以参考下面添加82x TE同步,通过外部中断的方式。

  • Step1:在app_lcd.c中设置TE上升沿触发外部中断lcd_extern_te_isr。

37ce427934a64e14e85dc3ffb5456092

  • Step2:在app_lcd.c中添加外部中处理函数lcd_extern_te_isr1,每次TE信号触发IO部中断时数据发送同步。

  • Step3:在lcd_msi.c文件中的lcd_msi_irq_callback判断是否使能TE,做选择直接kick lcd还是在同步中断中kick lcd。

6. MCU和SPI屏幕,增加帧间命令操作

某些特殊不通用的LCD控制器(格科微的GC9309NA等一系列芯片,矽创的st77926),如果需要在数据帧与帧之间添加命令的情况可以查看下面流程。

  • Step1:屏幕驱动中,填写需要发送的帧间命令,譬如需要添加2A,2B,2C命令。

  • Step2:屏幕驱动中,把帧间命令table赋值给frame_table指针变量。

  • Step3:声明定义帧间命令发送函数。

  • Step4:添加帧间发送函数到指定位置,分两种情况带TE和不带TE同步。

  1. 带TE控制的,需要在TE中断中添加发送,这里已经默认按点5指导添加了TE处理。

  2. 不带TE控制的,也就是LCD_TE设置255的情况。需要在lcd_msi.c->lcd_msi_irq_call函数lcdc_set_start_run调用前添加

Note:核心目的是在kick lcd发送显存前,把需要的帧间命令发送出去。

7. MCU屏幕,WR信号跳变不及时导致发送出错

SDK-43316之前的版本会存在这个问题,WR跳变不及时导致数据通讯出错需要添加如下:

需要在app_lcd.c->lcd_hardware_init565函数lcdc_open之后添加lcdc_clk_gather_select设置修改出数据和锁存数据时机。

8. MCU屏幕,ID读取操作设置

需要通过读取接口获取MCU屏幕状态寄存器或者获取屏幕ID操作的可以参考如下修改。

  • Step1:接口设置,在初始化前添加lcdc_reg_read_data读取数据,其中传入参数介绍。

    • pt8[0]->命令长度,0xda一个字节

    • pt8[1]->读取数据长度,下图填的是4字节

    • pt8[2]->读取的寄存器地址

    • pt8[3]->读取到的数据存放位置

  • Step2:Pin脚设置,确保RD引脚配置不是255。其次确定一下pin_function.c->lcdc_pin_func

    要把LCD_D0~D7设置为inout模式,尤其sdk-43316之前版本需要注意。

9. LCD录屏模块,检查显存操作

82x芯片增加了录屏模块,除了可以做录屏应用,也可以方便我们排查问题,用于区分是应用层画图绘制异常,还是屏参驱动设置异常或者是屏幕本身异常。

只需要在app_lcd.c打开宏定义使能。

申请空间,注册中断后,每次screen_done中断产生都会把yuv420p格式的显存数据保存到psram 中,也就是下图中的video_psram_screen 指向的空间。

Note:可以仿真dump出这段数据,之后用ffplay命令查看图像,dump操作可以查看81x lcd_faq文档。

10. DITHER模块使用介绍

82x系列芯片支持dither功能,当然有些lcd屏幕也是支持dither功能,如果lcd屏幕不支持,可以尝试打开82x的dither功能,针对rgb565的图像做一下滤波处理,对于某些色彩较为单调的场景,如白色墙体,天空这类的,能减少过渡断层显示效果会有所提升。

打开方式如下图片设置:

首先设置lcdc_dither_linebuf,3行就够了。其次使能lcdc_dither_en就可以开启ditcher功能

Note:开启会占用3行大小的sram,宽度越宽所需sram越多。目前芯片采用的是空间抖动的方式,使之周围像素看起来更平滑。

11. SCALE2 SCALE3缩放模块使用介绍

需要关注以下三个函数接口:

  • scale_set_in_out_size // 设置输入大小和输出大小

  • scale_set_step // 设置实际缩放大小

  • scale_set_start_addr // 设置相对于输入数据源的偏移

下图是常见的中心缩放显示功能举例,通过at命令改变atcmd_enlarge,从而改变scale_set_step输入size,在通过scale_set_start_addr设置坐标,atcmd_enlarge范围假如10~40。scale_set out和sccale_step out固定时,10到40变化会达到中心拉近放大效果。

Note:需要注意对齐问题,scale输出size遵循8字节对齐原则。

12. SCALE2 buf空间申请规则介绍

如果遇到JPG解码放大到屏幕显示异常,比如条纹,花屏幕,需要调整scale2 buf空间,放大倍数越大,所需scale2buf空间越大

Y需要的SRAM缓存空间

0x20+TW+J0*SRAMBUFLEN*4+256

U或者V需要的SRAM缓存空间

0x10+TW/2+J1*SRAMBUFLEN*2+256

公式参数介绍:

TW-》是scale2输出的目标宽度

J0-》是根据放大倍数计算的到的Y所需空间系数

输入是MJPEG YUV420:J0=(16*倍数)+2,假如2倍放大J0=16*2+2=34

输入是H264 YUV420:J0=(20*倍数)+2,假如2倍放大J0=20*2+2=42

J1-》是根据放大倍数计算得到的U或者V所需空间系数

输入是MJPEG YUV420:J1=(8*倍数)+2,假如2倍放大J1=8*2+2=18

输入是H264 YUV420:J1=(12*倍数)+2,假如2倍放大J1=12*2+2=26

256,128-》分别是冗余处理,看sram紧张程度选择是否添加

Note:如果是存在既要解码MJPEG又要解码H264建议以H264的最大系数去申请scale2buf。

13. OSD层透明色设置

  1. osd层透明度设置,lcdc_set_osd_alpha接口范围0~0x100,0x00完全透明到video层。

  1. osd整层透明色配置,lcdc_set_osd_enc_cfg接口,目前设置为0x000000为黑色,osd层中遇这个颜色就会透到video层,多用于video层显示。

  1. 特殊颜色做透明色,lcdc_osd_spec_color_alpha接口,可以多指定一种颜色做透明色,并设置透明度,可以用于做半透菜单栏效果。参数分别是(设备具柄,使能,透明色,透明度)

14. VIDEO层插黑操作

屏幕的宽高比和sensor镜头比例不一致的时候,又不想裁剪损失画面,这里就常用到一种手段就是插黑了,如下图16:9显示到4:3 lcd上下插入黑色,推荐修改P0 size和P0 location实现。

以preview_ui为例子需要设置scale3_normal_msi输出size,以及发送fb的时候添加p0偏移坐标信息,最终作用到的是lcd_msi中p0 size和p0坐标