Waveshare RP2350 Touch 1.43" AMOLED

I bought a Waveshare RP2350 Touch 1.43" AMOLED from Core Electronics recently.

Unfortunately, I am unable to get the Arduino examples (available here: https://www.waveshare.com/wiki/RP2350-Touch-AMOLED-1.43) to work. Further, it appears (but is not clearly articulate anywhere) that there are two versions of the board - V1, with ‘normal’ SPI, and V2, with QSPI (quad SPI).

I determined, through trial and error, that I have a V1 board (by downloading different .uf2 files from the Waveshare wiki). Unfortunately, none of the V1 example sketches for Arduino IDE appear to work (although the V1 .uf2 files do work, proving my particular device is functional).

Unfortunately, the only Arduino sketches I can find elsewhere appear to be for the V2 board, meaning this particular purchase isn’t very useful…

Has anyone else had any success getting a V1 board to work with their own Arduino code?

Hey there, @Ewan106490, and welcome to the forum. Glad to have you here.

I’m sorry to hear the code from the Waveshare wiki is not interacting well with your board.

So we can get to the bottom of this issue, could you please reply to this message with your Arduino Output logs and any Serial Monitor logs that were generated. That should give you a good grounding on what exactly is not working between the code and the RP2350.

The display simply does not work.

I contacted Waveshare, who advised, based on my feedback and investigation, that there are actually two variants:

Hardware Version Notes

This product has two hardware versions, V1.0 and V2.0, with different display interfaces:

  • V1.0: Uses SPI interface
  • V2.0: Uses QSPI interface

Version Note: Development boards shipped from August 2025 onward are primarily V2.0 (QSPI). It is recommended to use the V2.0 examples from the Resources section first; if the AMOLED does not display properly, try the V1.0 examples for verification.

They have updated the website https://www.waveshare.com/wiki/RP2350-Touch-AMOLED-1.43 accordingly.

Why do I have a V1 board when I just bought it from Core Electronics?

Ewan, this is more a side comment for thought as I have not used those bits.

In theory QSPI and SPI really should be about speed by using 4 wires for data (i.e. 4 bits at a time). So at a low level, if you have a SPI which will have a single data pin, then that should be the only difference to get running (outside of any other command changes in the version ??? (need to read the datasheets).

To be fair, that is low level and if your using prebuilt libraries, then a lot of that may be abstracted away.

Can you just use the V1 libraries for your project? or are they no longer/not supplied ? It would assume lots of V1 boards would have shipped.

I will let Jane follow up as they may know of some tweaks that may work.

Good Luck

Hey there, @Ewan106490,

The V1 units have not been discontinued, they’re still being supplied and supported by the manufacturer. While Waveshare advises that shipments are “primarily V2.0,” that does not mean that every unit will be.

While @Michael99645 is right that the QSPI and SPI modes aren’t that different, the change between the two can also involve different pin mappings and initialisation sequences, so the V2 library not working is not surprising.

That being said said, the V1 SPI codes, which can be found on here are still available and should work with the board. If they’re not, something is up, hence why I have asked for serial logs so we can get to the bottom of this.

**Michael99645

yes, the QSPI and SPI are abstracted - in the same way that brain surgery is simply putting a hole in someone’s head and removing bits that shouldn’t be there.

The demo files from Waveshare do not work as provided - to get them to work requires editing some config files, rolling back lvgl to 8.x, then changing the location of other library files. Noting the zip file is called ‘Arduino V1’ it’s a huge disappointment. As it stands, they don’t work ‘properly’ after all that fiddling around is done.**

The supplied demo files from Waveshare do not work.

I can find other demonstration files, however appear to be for V2 - meaning they do not work at all. I have made it clear that I have a V1 board, through trial and error (and my contact with Waveshare has seen them update their website to clarify the difference).

As it stands, the poor support by Waveshare for this board is really disappointing - I have wasted over 50 hours on this stupid thing and all I can do is change the colour of the screen (using Python, not Arduino, as none of my Arduino code has allowed for any response from the screen whatsoever).

There are other examples (such as from Jblanked) which really inspired me to get this device - but they appear to be for V2 (and nobody seemed to know there was a difference).

@Michael99645@Jane

here’s some working code - I’m happy for you to put it up on the Core Electronics page for the Waveshare RP2350 Touch AMOLED 1.43" board, if it helps any other poor soul…

/**********************************************************************************************************
Arduino_CO5300 *gfx = new Arduino_CO5300(bus, TFT_RST); // This is the actual screen (but note that it can't do rotation)

Arduino_GFX *canvas = new Arduino_Canvas_Indexed(466, 466, gfx); /* Although the RP2350 Touch 1.43" screen is 466x466, the standard CO5300 driver is 480x480.

The CO5300 driver instance (called 'gfx' here) is kept unmodified (defaulting to 480x480). Instead, the canvas is set to 466x466, meaning the Arduino_CO5300

driver can be used without any modification (attempting to modify the Arduino_CO5300 to 466x466 caused issues). Using the canvas also effectively enables

screen rotation, which Arduino_CO5300 does not seem to support.*/

static uint8_t conv2d(const char *p)
{
  uint8_t v = 0;
  return (10 * (*p - '0')) + (*++p - '0');
}

static int16_t hh, mm, ss;
static unsigned long targetTime; // next action time

void setup(void)
{
  Serial.begin(115200);

  while (!Serial)
  {
  }

  Serial.println("Arduino_GFX Clock example");

  // Initialise the AMOLED Display
  if (!gfx->begin())
  {
    Serial.println("gfx->begin() failed!");
  }

  if (gfx->begin())
  {
    Serial.println("gfx->begin() completed.");
  }

  // Initialise the Canvas
  if (!canvas->begin())
  {
    Serial.println("canvas->begin() failed!");
  }

  if (canvas->begin())
  {
    Serial.println("canvas->begin() completed.");
  }

  gfx->fillScreen(RGB565_BLACK); // Fill the gfx screen with black

  // initialise LCD constant
  hh = conv2d(_TIME_);
  mm = conv2d(_TIME_ + 3);
  ss = conv2d(_TIME_ + 6);

  targetTime = ((millis() / 1000) + 1) * 1000;
}

void loop()
{
  unsigned long cur_millis = millis();

  canvas->setTextSize(TEXTSIZE, TEXTSIZE, 2); // Set the text size, and 'pixel spacing'
  canvas->setTextColor(RGB565_RED, RGB565_BLACK); // Set colour to red text on black background
  canvas->fillScreen(RGB565_BLACK); // Clear the canvas (set everything to black)
  canvas->setRotation(1); //CO5300 appears to not have rotation; use canvas rotation instead (so USB connector is at bottom)

  if (cur_millis >= targetTime)
  {
    targetTime += 1000;
    ss++; // Advance second

    if (ss == 60)
    {
      ss = 0;
      mm++; // Advance minute

      if (mm > 59)
      {
        mm = 0;
        hh++; // Advance hour

        if (hh > 23)
        {
          hh = 0;
        }
      }
    }
  }

  // draw time
  canvas->setCursor(10, 180); // Set the starting point for text to be drawn on the canvas

  if (hh < 10)
  {
    canvas->print('0'); // Print to canvas
  }

  canvas->print(hh);
  canvas->print(':');

  if (mm < 10)
  {
    canvas->print('0');
  }

  canvas->print(mm);
  canvas->flush(); // Send the canvas to the gfx screen to be displayed

  for (int i = 0; i < 255; i++) // Provide an every-increasing brightness using gfx (display)
  {
    gfx->setBrightness(i);
    delay(200);
  }
}

Great work getting this running, @Ewan106490,

And thanks for sharing a complete and functioning example after such a frustrating debugging process. This should help any one else who finds themselves in the same position.