TXW82x LCD FAQ
责任与版权
修订记录
| 日期 | 版本 | 描 述 | 修订人 |
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文件。以下介绍几项重要配置。
总线相关配置默认跟st7735一致:
lcd_bus_type(总线类型),bus_width(总线宽度),color_mode(颜色模式)
旋转角度配置:
osd_scan_mode (osd层lvgl的旋转角度),按需配置。
scan_mode(video层的旋转角度特殊,谨慎使用),按需配置。
总线时钟速率:
pclk(spi写入时钟频率),由系统时钟分频而来,根据lcd驱动芯片去适配。
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的显示范围。
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释放冲忙,合并的时候未将初始化部分添加进去,主要检查以下部分:
app_lcd.c文件下lcd_hardware_init函数分支是否有对LCD_BUS_SPI4类型做判断。
app_lcd.c文件下lcd_hardware_init565函数中是否以添加LCD_BUS_SPI4相关配置。
lcd_spi_cs_lock_time的三个参数作用:一个是cs拉低后,什么时候出数据;一个是数据结束后,什么时候拉高cs;一个cs间的最小hold间隔时间,一般不需要调整。
1.6. 运行lvgl benchmark测试出图
app_fpv.c打开lvgl_init_msic组件函数。
interface_mgnt_v3.c文件中屏蔽main_ui,添加lv_demo_benchmark。
编译运行,下载到板子上,查看点亮情况。
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文件。重点关注以下几点:
总线相关配置默认跟st7701s_mipi一致:
lcd_bus_type(总线类型),bus_width(总线宽度),color_mode(颜色模式)
旋转角度配置:
osd_scan_mode (osd层lvgl的旋转角度),按需配置。
scan_mode(video层的旋转角度特殊,谨慎使用)按需配置。
总线时钟速率:
pclk(mipi 的像素时钟),根据lcd驱动芯片要求去适配。
目前7701配置的24Mhz,那么2lane高速模式下单lane速率就要是24*3*8/2=288Mhz,帧率就是像素点+porch 约等于51FPS,帧率够用就好,如果一味的提升会增加功耗和psram的带宽压力。
lane_num数量配置:根据实际屏幕需求设置1lane还是2lane。
lcd有效显示尺寸设置:
screen_w/h:需要按你实际驱动芯片的显存宽高来设置。
video_w/h和osd_w/h:分别是video和osd层有效显示宽高,按实际显示范围设置。
video_x/y和osd_x/y:分别是video和osd层偏移,通过计算得来。
porch设置:
也就是行场消隐,根据屏厂要求填写,屏幕不同porch设置不同。
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。
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同步。
带TE控制的,需要在TE中断中添加发送,这里已经默认按点5指导添加了TE处理。
不带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层透明色设置
osd层透明度设置,lcdc_set_osd_alpha接口范围0~0x100,0x00完全透明到video层。
osd整层透明色配置,lcdc_set_osd_enc_cfg接口,目前设置为0x000000为黑色,osd层中遇这个颜色就会透到video层,多用于video层显示。
特殊颜色做透明色,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坐标