Help Needed: E-Paper Display Works on Arduino IDE but Not on PlatformIO with ESP32S3

Hello everyone,

I have a piece of code for refreshing a 7.3-inch seven-color e-paper display using an ESP32S3. The code works perfectly when using the Arduino IDE, but when I switch to PlatformIO, although there is output, the e-paper display does not respond at all. I have already tried using the same SDK version for both environments.

Below is my code:

    #include <Arduino.h>
    #include <SPI.h>
    #include <stdint.h>

    const int PIN_EPD_BUSY = 9; 
    const int PIN_EPD_RESET = 10; 
    const int PIN_EPD_DC = 11; 
    const int PIN_EPD_CS = 12; 
    const int PIN_EPD_SCK = 13; 
    const int PIN_EPD_MOSI = 14; 
    const int PIN_EPD_MISO = -1; 

    constexpr int display_width = 800;
    constexpr int display_height = 480;

    enum class Colour : uint8_t {
        BLACK   = 0x0,  // 000
        WHITE   = 0x1,  // 001
        GREEN   = 0x2,  // 010
        BLUE    = 0x3,  // 011
        RED     = 0x4,  // 100
        YELLOW  = 0x5,  // 101
        ORANGE  = 0x6,  // 110
        CLEAN   = 0x7   // 111 - unavailable
    };

    void epdreset() {
        digitalWrite(PIN_EPD_RESET, HIGH);
        delay(20);
        digitalWrite(PIN_EPD_RESET, LOW);
        delay(2);
        digitalWrite(PIN_EPD_RESET, HIGH);
        delay(20);
    }

    void busyHigh() {
        int count = 0;
        while (!digitalRead(PIN_EPD_BUSY)) {
            delay(10);
            count++;
            if (count > 5000) {
                return;
            }
        }
    }

    void sendCommand(unsigned char command) {
        digitalWrite(PIN_EPD_DC, LOW);
        digitalWrite(PIN_EPD_CS, LOW);
        SPI.transfer(command);
        digitalWrite(PIN_EPD_CS, HIGH);
    }

    void sendData(uint8_t data) {
        digitalWrite(PIN_EPD_DC, HIGH);
        digitalWrite(PIN_EPD_CS, LOW);
        SPI.transfer(data);
        digitalWrite(PIN_EPD_CS, HIGH);
    }

    void epdinit() {
        Serial.print("\treset\r\n");
        epdreset();
        Serial.print("\treset ok\r\n");
        busyHigh();
        Serial.print("\t buyshigh ok\r\n");
        delay(30);

        sendCommand(0xAA);  // CMDH
        sendData(0x49);
        sendData(0x55);
        sendData(0x20);
        sendData(0x08);
        sendData(0x09);
        sendData(0x18);

        sendCommand(0x01);
        sendData(0x3F);
        sendData(0x00);
        sendData(0x32);
        sendData(0x2A);
        sendData(0x0E);
        sendData(0x2A);

        sendCommand(0x00);
        sendData(0x5F);
        sendData(0x69);

        sendCommand(0x03);
        sendData(0x00);
        sendData(0x54);
        sendData(0x00);
        sendData(0x44);

        sendCommand(0x05);
        sendData(0x40);
        sendData(0x1F);
        sendData(0x1F);
        sendData(0x2C);

        sendCommand(0x06);
        sendData(0x6F);
        sendData(0x1F);
        sendData(0x1F);
        sendData(0x22);

        sendCommand(0x08);
        sendData(0x6F);
        sendData(0x1F);
        sendData(0x1F);
        sendData(0x22);

        sendCommand(0x13);  // IPC
        sendData(0x00);
        sendData(0x04);

        sendCommand(0x30);
        sendData(0x3C);

        sendCommand(0x41);  // TSE
        sendData(0x00);

        sendCommand(0x50);
        sendData(0x3F);

        sendCommand(0x60);
        sendData(0x02);
        sendData(0x00);

        sendCommand(0x61);
        sendData(0x03);
        sendData(0x20);
        sendData(0x01);
        sendData(0xE0);

        sendCommand(0x82);
        sendData(0x1E);

        sendCommand(0x84);
        sendData(0x00);

        sendCommand(0x86);  // AGID
        sendData(0x00);

        sendCommand(0xE3);
        sendData(0x2F);

        sendCommand(0xE0);  // CCSET
        sendData(0x00);

        sendCommand(0xE6);  // TSSET
        sendData(0x00);
        Serial.print("\t init ok\r\n");
        sendCommand(0x04);
        busyHigh();
    }

    void turnOnDisplay() {
        sendCommand(0x04);  // POWER_ON
        busyHigh();

        sendCommand(0x12);  // DISPLAY_REFRESH
        sendData(0x00);
        busyHigh();

        sendCommand(0x02);  // POWER_OFF
        sendData(0x00);
        busyHigh();
    }

    void clear(Colour colour) {
        uint16_t width = (display_width % 2 == 0) ? (display_width / 2) : (display_width / 2 + 1);
        uint8_t colourValue = static_cast<uint8_t>(colour);
        sendCommand(0x10);
        for (uint16_t j = 0; j < display_height; j++) {
            for (uint16_t i = 0; i < width; i++) {
                sendData((colourValue << 4) | colourValue);
            }
        }
        turnOnDisplay();
    }

    void setup() {
        Serial.begin(115200);
        pinMode(21, OUTPUT);
        digitalWrite(21, LOW);     
        Serial.print("\r\nGPIO21\nOk!\r\n");

        pinMode(PIN_EPD_RESET, OUTPUT);
        pinMode(PIN_EPD_DC, OUTPUT);
        pinMode(PIN_EPD_CS, OUTPUT);
        pinMode(PIN_EPD_BUSY, INPUT); 
            
        Serial.print("\r pin mode Ok!\r\n");

        SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
        SPI.begin(PIN_EPD_SCK, PIN_EPD_MISO, PIN_EPD_MOSI, PIN_EPD_CS);
        Serial.print("\rSPI init Ok!\r\n");
        epdinit();
        clear(Colour::WHITE);
    }

    void loop() {}

Here is my platformio.ini file:

    platform = espressif32
    board = esp32-s3-devkitm-1
    framework = arduino
    board_build.mcu = esp32s3
    monitor_speed = 115200
    build_flags =
        -DARDUINO_USB_CDC_ON_BOOT=1
        -DCORE_DEBUG_LEVEL=1
    board_build.flash_mode = qio
    board_upload.flash_size=16MB
    board_upload.maximum_size = 16777216
    board_build.partitions = large_spiffs_16MB.csv

    lib_deps = SPI
    lib_ldf_mode=deep

I would really appreciate it if anyone could help me figure out what might be causing the issue. Thanks in advance!

So what are your Arduino IDE → Tools settings? (Screenshot) and your esp32 board version in the Arduino IDE → Boards? (Screenshot).

I double-checked, and it seems to be an issue with the Arduino version. It only works correctly with versions 3.0 and above. Thank you, no more issues.