ESP32 SPI display not working

I am designing a pcb with an ESP32. I designed it with a round 1.28" display and it works like intended. The only problem is the display size, it is too small so i want to change it to a bigger 3.5 or 4" display.

I have bought multiple and those use the 40 pin connector (instead of the 12 pin connector the 1.28" display uses (GC9A01))

I have bought a few different displays and they use a ILI9488 or ILI 9481 controller.

The new displays use 12 GPIO pins instead of 6 and i don't have enough pins to control the display.

How can i extend the GPIO to get the display working. I saw this tutorial ( IPS Capacitive LCD on an ESP32 (DIY Generator Part 8) - Daumemo) which uses the same 40 pin connector. Can i use some kind of multiplexer or something to expand the GPIO and connect D0 till D7 to the multiplexer?

First of all, I have to say that, reading your question, I don't think your level of knowledge and experience at this time will be enough for this project. It is quite an advanced level project that will require significant electronics and software development.

If it were my project, I would think about using a 74hc595 shift register to connect to the D0-7 pins. The serial register would also be connected to the esp's SPI pins. This would allow quite a fast data transfer from the esp to the display. I once connected a 128x64 monochrome LCD display to an esp8266 this way. Modifications were needed to the library used to draw on the display.

While not the low-cost dealer for hardware, much of Adafruit's prices reflect the significant investment in software and solutions support.

SPI based TFT 3.5 inches:
https://www.adafruit.com/product/3651

Other larger display:
https://www.buydisplay.com/4-3-tft-lcd-display-module-controller-board-serial-spi-i2c-mcu

... and a potential solution that will require some compatibility investigation:
https://www.adafruit.com/product/1590

I want to use a display without pcb so i can connect it to my own pcb. I don't understand why my display stays white or black (2 different displays).

I have this display: ( 2.4/2.8/3.2/3.5 Inch Tft Lcd scherm Touch Panel 40 Pin Socket Mcu I8080 8/16BIT Spi 3/4 Draad Pcb Connector Ips Full View|3.5 inch tft|lcd display screeninch tft lcd - AliExpress)

Both 3.5" without touch (super wide and ips)

I see i can connect it via SPI (so no D0 till D15) which means i wouldn't need a 74hc595.
(Ps: I'm sorry, i meant a shift register instead of a multiplexer).

I have made my own user_setup file and checked connections multiple times, but the display doesn't show anything.

This is the "read_user_setup":

TFT_eSPI ver = 2.3.70
Processor    = ESP32
Frequency    = 240MHz
Transactions = Yes
Interface    = SPI
Display driver = 7796
Display width  = 320
Display height = 480

MOSI    = GPIO 23
MISO    = GPIO 19
SCK     = GPIO 18
TFT_CS   = GPIO 15
TFT_DC   = GPIO 2
TFT_RST  = GPIO 4
TOUCH_CS = GPIO 22

Font GLCD   loaded
Font 2      loaded
Font 4      loaded
Font 6      loaded
Font 7      loaded
Font 8      loaded
Smooth font enabled

Display SPI frequency = 10.00
Touch SPI frequency   = 2.50

This is my setup file

//                            USER DEFINED SETTINGS
//   Set driver type, fonts to be loaded, pins used and SPI control method etc
//
//   See the User_Setup_Select.h file if you wish to be able to define multiple
//   setups and then easily select which setup file is used by the compiler.
//
//   If this file is edited correctly then all the library example sketches should
//   run without the need to make any more changes for a particular hardware setup!

// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################

// Display type -  only define if RPi display
//#define RPI_DISPLAY_TYPE

// Only define one driver
#define ST7796_DRIVER

// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################

// >>>>> EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP   <<<<<

// The ESP32 hardware SPI can be mapped to any pins, these are the recommended default

#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS   15   // Chip select control pin
#define TFT_DC    2   // Data Command control pin
#define TFT_RST   4   // Reset pin (could connect to RST pin)
//#define TFT_RST  -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST

#define TOUCH_CS 22     // Chip select pin (T_CS) of touch screen

// ##################################################################################
//
// Section 2. Not used for ESP32
//
// ##################################################################################


// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################

// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT

// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################


// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################

// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an RPi ST7796 MH4.0 display 80MHz is OK for ESP32, 40MHz maximum for ESP8266

   #define SPI_FREQUENCY  10000000
// #define SPI_FREQUENCY  20000000
// #define SPI_FREQUENCY  40000000
// #define SPI_FREQUENCY  80000000

// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
//#define USE_HSPI_PORT

// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
   #define SPI_TOUCH_FREQUENCY  2500000

I also notice that the longer the display is connected, the display turns white with stripes


(i don't mean the diagonal stripes, they are from the screen protector)

No one knows what the problem could be?

First off. Select the SPI interface on the IM# pins.
Connect CS, RS, SDI, SDO pins.
Run the Read_ID_bitbash.ino example to identify the controller.

Then configure your User_Setup correctly. Your link implies ILI9488. So it is unwise to say "ST7796S"

Seriously. It is much safer to buy displays that are already configured and mounted on a pcb. There are less things to go wrong.

When you have developed and tested your project on a prototype (using ready made components) you can design a custom pcb for bare components.

David.

Well, is didn't understand it eather but the read_user_setup showed: Display driver: 7796.
I run the Read_ID_bitbash but it gives this output:

TFT driver register values:
===========================
Register 0x01: 0x00
Register 0x04: 0x7FFFFF
Register 0x09: 0xFFFFFFFF
Register 0x0A: 0x7F
Register 0x0B: 0xFF
Register 0x0C: 0x7F
Register 0x0D: 0xFF
Register 0x0E: 0x7F
Register 0x0F: 0xFF
Register 0x2E: 0xFFFFFF
Register 0x3F: 0xFFFFFFFF
Register 0xDA: 0x7F
Register 0xDB: 0xFF
Register 0xDC: 0x7F
===========================

Looks like driver chip is: Unknown   

I have used a display with pcb and that works fine.
All IM pins are connected to VCC, this can cause the problem but i don't know which pins need 3.3v and which need GND

IM# = 0b111 is the 4-line SPI for both ILI9488 and for ST7796.

There are 40 pins on the panel ribbon. I don't know how you have connected them. i.e. your #defines in the bitbash sketch and the physical wires on your desk.
And you don't seem to understand the datasheet or basic electronics.

I strongly advise you to stick with ready made pcb. Even with these you still have to connect the correct wires.

Which is why God invented Shields for Arduinos. You plug a Shield into a Uno and the wiring is known. Example sketches should work out of the box.

David.

This is how i connected the 40 pins. I am not using an Arduino but an ESP32. Like i said, a display with PCB works fine, and even the 1.28" display without pcb works fine. I can stick with the display with pcb but what am i gainig with that, that part works so now i am figuring out how to connect without the pcb.

Bodmer's bitbash sketch assumes a single bidirectional SDA pin.

4-line SPI defaults to individual SDI, SDO pins.
You can make ILI9481, ILI9488, ST7796 controllers use a single bidirectional pin in software.

I could possibly post you a more versatile bitbash sketch.
But since you appear to quote ILI9481 now, I have lost any confidence in anything you say.

Surely you bought the bare panel. It would have arrived in an antistatic bag with a printed label. It will have a part number printed on the ribbon or the back of the panel.

Bodmer supports ILI9481, ILI9488, ST7796.

David.

The connections are the same on ILI9481 and ILI9488 right?
Like i said, i bought mutliple displays which are ILI9481 and ILI9488

It is very important to select the correct controller. Especially between ILI9481 and ILI9488. Because the Power Registers for one controller correspond to different Manufacturer Registers on the other. And you can damage the controller if the Power Registers receive inappropriate values.

I give up. Is it really too difficult to read labels on a bag or the part numbers on each panel ?

David.

Sorry but probably i don't understand what you mean. I know which display has which driver.
I will keep testing with the ILI9481 if that is what you ask for.

There are no labels on the bag or paper but it was written on it with a marker (from the seller).

Go on. If you know it is ILI9481, then you should have 9481 in #4

Display driver = 9481

An ILI9481 will not work properly (if at all) with ST7796S commands.

David.

That is where it went wrong in my head. Since it shows Display driver = 7796 i thought it detected that.

If i change this in my setup.h file it keeps showing Display driver = 7796

#define ILI9481_DRIVER

After completely recreating a user setup file it works. I don't know why but whatever i did, it wouldn't change the driver. With a new user file it does and now i get the display working

Sit down with a nice cup of tea and study how TFT_eSPI works.
e.g. a pre-cooked Setup file
e.g. a custom User_Setup file

That is all there is to it. i.e. configure the Setup to suit your display and your target. Every sketch will work without any edits.
Change your display, Select the appropriate Setup file.

Other libraries work in different ways.
U8g2 requires you to change the constructor in every example sketch.
MCUFRIEND_kbv requires you to write/use a SPECIAL for anything other than common controllers on standard shields.

David.