Severe tearing on ESP32-S3 + ST7789 (SPI, no TE pin) when scrolling with LVGL 8.3.6

Hi,

I am using a Waveshare ESP32-S3-LCD-1.9 board with a 170x320 ST7789 display over SPI.

Hardware:

  • Board: Waveshare ESP32-S3-LCD-1.9
  • MCU: ESP32-S3
  • Display: ST7789, 170x320, SPI
  • Touch: FT3168
  • TE pin: not exposed on this board

Software:

  • Arduino framework
  • LVGL 8.3.6
  • UI partly generated with SquareLine Studio
  • Software rotation enabled to display landscape UI on a portrait physical panel

Problem:
I get very visible tearing when scrolling horizontally. The tearing appears as horizontal lines moving from top to bottom during fast scroll. The issue is much less obvious when the UI is static.

Important limitation:
Waveshare confirmed that the TE pin is not exposed on this board, so true TE/VSYNC synchronization is not available.

What I have already tried:

  • Keeping the panel in physical portrait mode and using LVGL software rotation
  • Using partial refresh
  • Using full refresh
  • SPI clock at both 80 MHz and 20 MHz
  • Different DMA chunk sizes
  • Queue depth = 1
  • Reducing redraws from WiFi/time/battery UI
  • Moving status widgets to the top layer
  • Freezing status updates while scrolling
  • Simplifying the UI background and removing shadows
  • Changing the scroll behavior to reduce continuous redraw

Current observations:

  • Full refresh did not solve it
  • Lower SPI clock did not solve it
  • Reducing redraw outside the scroll area helped only slightly
  • The old simpler UI tears less than the newer richer UI
  • The main issue seems tied to continuous scroll on SPI ST7789 without TE

My questions:

  1. On LVGL 8.3.x, is there any recommended configuration specifically for ST7789 SPI panels with software rotation and no TE pin?
  2. Is partial update + software rotation known to worsen tearing on this setup?
  3. Would you recommend avoiding continuous scroll entirely and switching to page-by-page snapping on this class of hardware?
  4. Is there any LVGL-side optimization I may still be missing for this specific case?
    YouTube link here

Current relevant settings:

  • LV_COLOR_DEPTH = 16
  • LV_COLOR_16_SWAP = 1
  • LVGL running on ESP32-S3
  • ST7789 over SPI
  • No TE pin available
  • Landscape UI rendered via software rotation

If useful, I can also share:

  • a short video showing the tearing
  • current display driver init code
  • LVGL display configuration
    YouTube link here
    Thanks.