Last week we successfully got an ESP32-S3 board and LCD screen talking over an 8-bit parallel connection; potentially much faster than the usual SPI interface that’s used. Some configurations were producing visual glitches though. And while fast, we couldn’t push it fully to the speeds expected.
Was the problem with our code (despite following the examples), some limitations or quirks of the hardware, or unresolved issues in Espressif’s libraries relating to the LCD? Two of these were untestable…but the third, the libraries, we actually have options…
Espressif’s ESP-IDF framework can be accessed a couple of different ways:
- In the Arduino IDE, a version of ESP-IDF is installed with the ESP32 board support package.
- A standalone version is designed for command-line use, independent of the Arduino IDE.
The ESP-IDF version bundled with the Arduino board package tends to lag the latest code somewhat…it looks like a new release is made roughly quarterly, bringing the current ESP-IDF release snapshot at the time, while the mainline branch continues to evolve.
LCD support is so vital in devices today, I just had a hunch this would be one of the evolved areas. If I switched from Arduino development to Espressif’s command line tools, the glitches and speed issues might clear up on their own. I’d been favoring Arduino-centered development mostly because its wide adoption makes it easier to share code and projects…but a little bit, also, I’d just been dreading yet another one-off toolchain install that’s unpleasant to use or ill-supported. But I had to verify the evolved library theory…
And as it turns out, the ESP-IDF command line tools are a breeze! Setup and basic use is summarized right there in the top-level README…
The build tools work great on Windows, Linux or Mac (I hate needing to bring out a second machine or set up a VM for one vendor’s tools). And the “menuconfig” tool is really interesting to fool around with. To build and upload one of the example projects, the same idf.py
script performs several different actions: set-target, menuconfig, build, flash and monitor.
And sure enough, the newer LCD-related library code resolved all the previously-seen issues; byte swapping in hardware worked without visual glitches, and we could now drive the parallel connection up to 20 MHz (16 MHz with graphics data in PSRAM), refreshing the screen at 70 Hz. Buttery smooth!
Just a few days ago, the ESP32 Arduino boards package saw a new release, bringing with it an updated ESP-IDF…and sure enough, this version includes the LCD fixes! So it’s nice to know that either approach — Arduino or command line — are solid options now.