ESP32-S3 Driving ST7701S Display

Hi Guys
I am trying to use ESP32 driving 6" ST7701S Display.
This is the connection of ESP32 and Display

This is my testing code

/*******************************************************************************
 * LVGL Hello World
 * This is a simple example for LVGL - Light and Versatile Graphics Library
 * import from: https://github.com/lvgl/lv_demos.git
 *
 * Dependent libraries:
 * LVGL: https://github.com/lvgl/lvgl.git
 *
 * LVGL Configuration file:
 * Copy your_arduino_path/libraries/lvgl/lv_conf_template.h
 * to your_arduino_path/libraries/lv_conf.h
 * 
 * In lv_conf.h around line 15, enable config file:
 * #if 1 // Set it to "1" to enable content
 * 
 * Then find and set:
 * #define LV_COLOR_DEPTH     16
 * #define LV_TICK_CUSTOM     1
 *
 * For SPI/parallel 8 display set color swap can be faster, parallel 16/RGB screen don't swap!
 * #define LV_COLOR_16_SWAP   1 // for SPI and parallel 8
 * #define LV_COLOR_16_SWAP   0 // for parallel 16 and RGB
 ******************************************************************************/
#include <lvgl.h>

/*******************************************************************************
 * Start of Arduino_GFX setting
 *
 * Arduino_GFX try to find the settings depends on selected board in Arduino IDE
 * Or you can define the display dev kit not in the board list
 * Defalult pin list for non display dev kit:
 * Arduino Nano, Micro and more: CS:  9, DC:  8, RST:  7, BL:  6, SCK: 13, MOSI: 11, MISO: 12
 * ESP32 various dev board     : CS:  5, DC: 27, RST: 33, BL: 22, SCK: 18, MOSI: 23, MISO: nil
 * ESP32-C3 various dev board  : CS:  7, DC:  2, RST:  1, BL:  3, SCK:  4, MOSI:  6, MISO: nil
 * ESP32-S2 various dev board  : CS: 34, DC: 38, RST: 33, BL: 21, SCK: 36, MOSI: 35, MISO: nil
 * ESP32-S3 various dev board  : CS: 40, DC: 41, RST: 42, BL: 48, SCK: 36, MOSI: 35, MISO: nil
 * ESP8266 various dev board   : CS: 15, DC:  4, RST:  2, BL:  5, SCK: 14, MOSI: 13, MISO: 12
 * Raspberry Pi Pico dev board : CS: 17, DC: 27, RST: 26, BL: 28, SCK: 18, MOSI: 19, MISO: 16
 * RTL8720 BW16 old patch core : CS: 18, DC: 17, RST:  2, BL: 23, SCK: 19, MOSI: 21, MISO: 20
 * RTL8720_BW16 Official core  : CS:  9, DC:  8, RST:  6, BL:  3, SCK: 10, MOSI: 12, MISO: 11
 * RTL8722 dev board           : CS: 18, DC: 17, RST: 22, BL: 23, SCK: 13, MOSI: 11, MISO: 12
 * RTL8722_mini dev board      : CS: 12, DC: 14, RST: 15, BL: 13, SCK: 11, MOSI:  9, MISO: 10
 * Seeeduino XIAO dev board    : CS:  3, DC:  2, RST:  1, BL:  0, SCK:  8, MOSI: 10, MISO:  9
 * Teensy 4.1 dev board        : CS: 39, DC: 41, RST: 40, BL: 22, SCK: 13, MOSI: 11, MISO: 12
 ******************************************************************************/
#include <Arduino_GFX_Library.h>

#define GFX_BL DF_GFX_BL // default backlight pin, you may replace DF_GFX_BL to actual backlight pin

/* More dev device declaration: https://github.com/moononournation/Arduino_GFX/wiki/Dev-Device-Declaration */
#if defined(DISPLAY_DEV_KIT)
Arduino_GFX *gfx = create_default_Arduino_GFX();
#else /* !defined(DISPLAY_DEV_KIT) */

/* More data bus class: https://github.com/moononournation/Arduino_GFX/wiki/Data-Bus-Class */
Arduino_ESP32RGBPanel *bus = new Arduino_ESP32RGBPanel(
  21 /* CS */, 20 /* SCK */, 19 /* SDA */,
  48 /* DE */, 45/* VSYNC */, 0 /* HSYNC */, 47 /* PCLK */,
  3 /* R0 */, 46 /* R1 */, 9 /* R2 */, 10 /* R3 */, 11 /* R4 */,
  40 /* G0/P22 */, 41 /* G1/P23 */, 42 /* G2/P24 */, 2 /* G3/P25 */, 1 /* G4/P26 */, 8 /* G5 */,
  35 /* B0 */, 36 /* B1 */, 37 /* B2 */, 38 /* B3 */, 39 /* B4 */
);

/* More display class: https://github.com/moononournation/Arduino_GFX/wiki/Display-Class */
Arduino_ST7701_RGBPanel *gfx = new Arduino_ST7701_RGBPanel(
     bus, GFX_NOT_DEFINED /* RST */, 0 /* rotation */,
     false /* IPS */, 480 /* width */, 960 /* height */,
     st7701_type5_init_operations, sizeof(st7701_type5_init_operations),
     true /* BGR */, 
     10 /* hsync_front_porch */, 8 /* hsync_pulse_width */, 50 /* hsync_back_porch */,
     10 /* vsync_front_porch */, 8 /* vsync_pulse_width */, 20 /* vsync_back_porch */);

#endif /* !defined(DISPLAY_DEV_KIT) */
/*******************************************************************************
 * End of Arduino_GFX setting
 ******************************************************************************/

/* Change to your screen resolution */
static uint32_t screenWidth;
static uint32_t screenHeight;
static lv_disp_draw_buf_t draw_buf;
static lv_color_t *disp_draw_buf;
static lv_disp_drv_t disp_drv;

/* Display flushing */
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p)
{
  uint32_t w = (area->x2 - area->x1 + 1);
  uint32_t h = (area->y2 - area->y1 + 1);

#if (LV_COLOR_16_SWAP != 0)
  gfx->draw16bitBeRGBBitmap(area->x1, area->y1, (uint16_t *)&color_p->full, w, h);
#else
  gfx->draw16bitRGBBitmap(area->x1, area->y1, (uint16_t *)&color_p->full, w, h);
#endif

  lv_disp_flush_ready(disp);
}

void setup()
{
  Serial.begin(115200);
  // Serial.setDebugOutput(true);
  // while(!Serial);
  Serial.println("Arduino_GFX LVGL Hello World example");

   // Init Display
   gfx->begin();
   gfx->fillScreen(BLACK);
   
#ifdef GFX_BL
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH);
#endif

  lv_init();

  screenWidth = gfx->width();
  screenHeight = gfx->height();
#ifdef ESP32
  disp_draw_buf = (lv_color_t *)heap_caps_malloc(sizeof(lv_color_t) * screenWidth * 10, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
#else
  disp_draw_buf = (lv_color_t *)malloc(sizeof(lv_color_t) * screenWidth * 10);
#endif
  if (!disp_draw_buf)
  {
    Serial.println("LVGL disp_draw_buf allocate failed!");
  }
  else
  {
    lv_disp_draw_buf_init(&draw_buf, disp_draw_buf, NULL, screenWidth * 10);

    /* Initialize the display */
    lv_disp_drv_init(&disp_drv);
    /* Change the following line to your display resolution */
    disp_drv.hor_res = screenWidth;
    disp_drv.ver_res = screenHeight;
    disp_drv.flush_cb = my_disp_flush;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register(&disp_drv);

    /* Initialize the (dummy) input device driver */
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    lv_indev_drv_register(&indev_drv);

    /* Create simple label */
    lv_obj_t *label = lv_label_create(lv_scr_act());
    //lv_label_set_text(label, "Hello Arduino! (V" GFX_STR(LVGL_VERSION_MAJOR) "." GFX_STR(LVGL_VERSION_MINOR) "." GFX_STR(LVGL_VERSION_PATCH) ")");
    lv_label_set_text(label, "Hello Arduino!");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    Serial.println("Setup done");
  }
}

void loop()
{
    gfx->setCursor(random(gfx->width()), random(gfx->height()));
    gfx->setTextColor(random(0xffff), random(0xffff));
    gfx->setTextSize(random(6) /* x scale */, random(6) /* y scale */, random(2) /* pixel_margin */);
    gfx->println("Hello World!");

    delay(1000); // 1 second
  lv_timer_handler(); /* let the GUI do its work */
  delay(5);
}

The BackLight is on when power-up, but shows nothing, could anyone help me to find out the problem? Thanks

My "Arduino_GFX_Library" version is 1.3.1

Hi @jerrylong_km

Did you check if your display is one of the devices in Arduino_GFX_dev_device.h?
The example PDQgraphicstest.ino is my preferred starting point with this library.

I haven't seen moononournation in this forum yet, so you might get their attention by posting in https://github.com/moononournation/Arduino_GFX/discussions

Good Luck
-jz-

1 Like

Thank you ZinggJM, I will check it.

My display is not in the list of Arduino_GFX_display.h

This is the document of my display
6寸长条屏.pdf (636.1 KB)

This is the initial code I found on manufacturer website, but I don't know how to use it.


//ER-TFT050-9_Initial  

/* LCD  panel SPI interface define */
sbit	SPI_RES = P3^6;	 //reset
sbit	SPI_DI = P1^5;	//data input		 
sbit	SPI_CLK = P1^7;   //clock
sbit	SPI_CS = P3^4;  //chip select

//RGB+9b_SPI(rise)
 void SPI_SendData(unsigned char i)
{  
   unsigned char n;
   
   for(n=0; n<8; n++)			
   {       
			SPI_CLK=0;
			_nop_(); _nop_();_nop_();_nop_();
			SPI_DI=i&0x80;
			_nop_(); _nop_();_nop_();_nop_();
			SPI_CLK=1;
			i<<=1;
			_nop_(); _nop_();_nop_();_nop_();
	  
   }
}
void SPI_WriteComm(unsigned char i)
{
    SPI_CS=0;
	  	_nop_(); _nop_();_nop_();_nop_();
    SPI_DI=0 ;
	  	_nop_(); _nop_();_nop_();_nop_(); 
	SPI_CLK=0;
		_nop_(); _nop_();_nop_();_nop_();
	SPI_CLK=1;
		_nop_(); _nop_();_nop_();_nop_();
	SPI_SendData(i);
		
    SPI_CS=1;
}



void SPI_WriteData(unsigned char i)
{ 
    SPI_CS=0;
	  	_nop_(); _nop_();_nop_();_nop_();
    SPI_DI=1 ;
	  	_nop_(); _nop_();_nop_();_nop_(); 
	SPI_CLK=0;
		_nop_(); _nop_();_nop_();_nop_();
	SPI_CLK=1;
		_nop_(); _nop_();_nop_();_nop_();
	SPI_SendData(i);
		
    SPI_CS=1;
} 




void ST7701S_Initial(void)
{

	SPI_RES=1;
	delay_ms(10);
	SPI_RES=0;
	delay_ms(100);
	SPI_RES=1;
	delay_ms(10);  


   
	SPI_WriteComm(0xFF);
	SPI_WriteData(0x77);
	SPI_WriteData(0x01);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x10);
	
	SPI_WriteComm(0xC0);
	SPI_WriteData(0xE9);
	SPI_WriteData(0x03);
	SPI_WriteComm(0xC1);
	SPI_WriteData(0x11);
	SPI_WriteData(0x02);
	SPI_WriteComm(0xC2);
	SPI_WriteData(0x37);
	SPI_WriteData(0x08);
	
	SPI_WriteComm(0xC7);
	SPI_WriteData(0x00); 
	SPI_WriteComm(0xB0);
	SPI_WriteData(0x00);
	SPI_WriteData(0x0D);
	SPI_WriteData(0x14);
	SPI_WriteData(0x0D);
	SPI_WriteData(0x10);
	SPI_WriteData(0x05);
	SPI_WriteData(0x02);
	SPI_WriteData(0x08);
	SPI_WriteData(0x08);
	SPI_WriteData(0x1E);
	SPI_WriteData(0x05);
	SPI_WriteData(0x13);
	SPI_WriteData(0x11);
	SPI_WriteData(0xA3);
	SPI_WriteData(0x29);
	SPI_WriteData(0x18);
	SPI_WriteComm(0xB1);
	SPI_WriteData(0x00);
	SPI_WriteData(0x0C);
	SPI_WriteData(0x14);
	SPI_WriteData(0x0C);
	SPI_WriteData(0x10);
	SPI_WriteData(0x05);
	SPI_WriteData(0x03);
	SPI_WriteData(0x08);
	SPI_WriteData(0x07);
	SPI_WriteData(0x20);
	SPI_WriteData(0x05);
	SPI_WriteData(0x13);
	SPI_WriteData(0x11);
	SPI_WriteData(0xA4);
	SPI_WriteData(0x29);
	SPI_WriteData(0x18);
	
	SPI_WriteComm(0xFF);
	SPI_WriteData(0x77);
	SPI_WriteData(0x01);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x11);
	SPI_WriteComm(0xB0);
	SPI_WriteData(0x6C);
	
	SPI_WriteComm(0xB1);
	SPI_WriteData(0x43);
	
	SPI_WriteComm(0xB2);
	SPI_WriteData(0x07);
	SPI_WriteComm(0xB3);
	SPI_WriteData(0x80);
	SPI_WriteComm(0xB5);
	SPI_WriteData(0x47);
	SPI_WriteComm(0xB7);
	SPI_WriteData(0x8A);
	SPI_WriteComm(0xB8);
	SPI_WriteData(0x20);
	SPI_WriteComm(0xC1);
	SPI_WriteData(0x78);
	SPI_WriteComm(0xC2);
	SPI_WriteData(0x78);
	SPI_WriteComm(0xD0);
	SPI_WriteData(0x88);
	
	
	SPI_WriteComm(0xE0);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x02);
	SPI_WriteComm(0xE1);
	SPI_WriteData(0x08);
	SPI_WriteData(0x00);
	SPI_WriteData(0x0A);
	SPI_WriteData(0x00);
	SPI_WriteData(0x07);
	SPI_WriteData(0x00);
	SPI_WriteData(0x09);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x33);
	SPI_WriteData(0x33);
	SPI_WriteComm(0xE2);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteComm(0xE3);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x33);
	SPI_WriteData(0x33);
	SPI_WriteComm(0xE4);
	SPI_WriteData(0x44);
	SPI_WriteData(0x44);
	SPI_WriteComm(0xE5);
	SPI_WriteData(0x0E);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteData(0x10);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteData(0x0A);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteData(0x0C);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteComm(0xE6);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x33);
	SPI_WriteData(0x33);
	SPI_WriteComm(0xE7);
	SPI_WriteData(0x44);
	SPI_WriteData(0x44);
	SPI_WriteComm(0xE8);
	SPI_WriteData(0x0D);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteData(0x0F);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteData(0x09);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteData(0x0B);
	SPI_WriteData(0x60);
	SPI_WriteData(0xA0);
	SPI_WriteData(0xA0);
	SPI_WriteComm(0xEB);
	SPI_WriteData(0x02);
	SPI_WriteData(0x01);
	SPI_WriteData(0xE4);
	SPI_WriteData(0xE4);
	SPI_WriteData(0x44);
	SPI_WriteData(0x00);
	SPI_WriteData(0x40);
	SPI_WriteComm(0xEC);
	SPI_WriteData(0x02);
	SPI_WriteData(0x01);
	SPI_WriteComm(0xED);
	SPI_WriteData(0xAB);
	SPI_WriteData(0x89);
	SPI_WriteData(0x76);
	SPI_WriteData(0x54);
	SPI_WriteData(0x01);
	SPI_WriteData(0xFF);
	SPI_WriteData(0xFF);
	SPI_WriteData(0xFF);
	SPI_WriteData(0xFF);
	SPI_WriteData(0xFF);
	SPI_WriteData(0xFF);
	SPI_WriteData(0x10);
	SPI_WriteData(0x45);
	SPI_WriteData(0x67);
	SPI_WriteData(0x98);
	SPI_WriteData(0xBA);
	
	SPI_WriteComm(0xFF);
	SPI_WriteData(0x77);
	SPI_WriteData(0x01);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	SPI_WriteData(0x00);
	delay_ms(10);
	
	SPI_WriteComm(0x36);
	SPI_WriteData(0x00); //0x18
	
	SPI_WriteComm(0x3A);  //  RGB 24bits D[23:0]
	SPI_WriteData(0x77);
	
	SPI_WriteComm(0x11);   //Sleep-Out
	SPI_WriteData(0x00);
	delay_ms(120);
	
	SPI_WriteComm(0x29);   //Display On
	SPI_WriteData(0x00);
	delay_ms(10);	 


}



did you do this:

  • In lv_conf.h around line 15, enable config file:
  • #if 1 // Set it to "1" to enable content

Did you try the ST7701 library? It might be the same as 7701S

Yes of course. I enabled the lv_conf.h
4

And this is the library that I used.

OK. I must have misread your comment. I thought you said your device wasn't on the list.

I don't know the ST7701 controller. And I don't have time to look at controller specs.
I don't like to download unknown documents.

Your code looks like you use your display in "RGB mode", initializing it through SPI.
Some "RGB mode" capable controller need this to switch to "RGB mode".
But you don't tell where you got your code from. Do you know what code you display needs?
-jz-

I have used Arduino_GFX_Library 1.4.7(latest version), and tested type of st7701 for type1 to type9, none of them works for my display.
anythings else that I can try?


This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.