Transparent SPI OLED - TP15MC01F - Help

Hi.

Recently I found some really nice transparent OLED displays on AliExpress:
https://www.aliexpress.com/item/1005004207889866.html

Datasheet:

However, I cannot get them to work. I am on my third display now and cannot see what I am doing wrong. The displays draw a large amount of current (eg. 100+mA) at the recommended VCC of 16V (I have it current limited to 20mA as per expected current draw of 13mA in the datasheet), and does not show any response when running the example code provided by the manufacturer.

The display is connected to a breadboard through a 15-pin FPC to pin-header breakout board (connections have been checked to the LCD itself by measuring between the common ground pins). I have followed the schematic from the datasheet, and made sure that every component is exactly the value that is recommended:

Yes, I know it is not that easy to see the connections from the photo above, but you will just have to trust me.

Further on, I have programmed my Pi Pico (since it has 3.3V I/O which is within the recommended values on the datasheet and the controller datasheet) using the following initialization sequence that is specified in the datasheet of the display:

#include <SPI.h>

#define RST 21    // Reset pin
#define CS 17     // Chip select pin
#define DC 20     // Data/Command pin

void setup() {
  // Initialize the SPI communication and OLED control pins
  pinMode(CS, OUTPUT);
  pinMode(RST, OUTPUT);
  pinMode(DC, OUTPUT);

  SPI.setCS(17);
  SPI.setTX(19);
  SPI.setSCK(18);

  digitalWrite(DC, LOW);     // Set DC low for command
  digitalWrite(RST, LOW);     // Set DC low for command
  digitalWrite(CS, HIGH);     // Select the OLED controller


  // Start SPI and set parameters
  SPI.begin();
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));

  // Reset the OLED
  digitalWrite(RST, LOW); // Set RST low to reset
  delay(1);
  digitalWrite(RST, HIGH); // Set RST high for normal operation
  delay(100);

  OLED_SetInitCode();  // Call the setup function for the OLED display
  OLED_Disp_Draw();  // Call the draw function in the loop to keep displaying
}

void loop() {
  OLED_Disp_Draw();  // Call the draw function in the loop to keep displaying
  delay(1000);       // Add a delay for demonstration
}

// Function to send a command to the OLED display
void Command(uint8_t command) {
  digitalWrite(DC, LOW);     // Set DC low for command
  digitalWrite(CS, LOW);     // Select the OLED controller
  SPI.transfer(command);     // Send the command via SPI
  digitalWrite(CS, HIGH);    // Deselect the OLED controller
  digitalWrite(DC, HIGH);    // Set DC high
}

// Function to send a parameter to the OLED display
void Parameter(uint8_t data) {
  digitalWrite(DC, HIGH);    // Set DC high for data
  digitalWrite(CS, LOW);     // Select the OLED controller
  SPI.transfer(data);        // Send the data via SPI
  digitalWrite(CS, HIGH);    // Deselect the OLED controller
}

// OLED initialization code
void OLED_SetInitCode() {  // 150cd/m2
  Command(0x01);

  Command(0x04);
  Parameter(0x04);

  Command(0x05);
  Parameter(0x09);

  Command(0x06);
  Parameter(0x00);

  Command(0x07);
  Parameter(0x00);
  Parameter(0x00);
  Parameter(0x07);
  Parameter(0x0F);
  Parameter(0x00);
  Parameter(0x00);
  Parameter(0x03);
  Parameter(0x0F);

  Command(0x08);
  Parameter(0x01);

  Command(0x09);
  Parameter(0x07);
  
  Command(0x0A);
  Parameter(0x00);
  Parameter(0x00);
  Parameter(0x07);
  Parameter(0x0F);
  Parameter(0x00);
  Parameter(0x00);
  Parameter(0x03);
  Parameter(0x0F);

  Command(0x0B);
  Parameter(0x00);
  Parameter(0x00);
  Parameter(0x00);
  Parameter(0x00);

  Command(0x0E);
  Parameter(0x02);
  Parameter(0x03);
  Parameter(0x01);
  Parameter(0x02);
  Parameter(0x01);
  Parameter(0x0C);

  Command(0x0F);
  Parameter(0x00);
  Parameter(0x00);
  Parameter(0x00);

  Command(0x10);
  Parameter(0x01);

  Command(0x1C);
  Parameter(0x01);

  Command(0x1D);
  Parameter(0x01);
  Parameter(0x01);
  Parameter(0x01);

  Command(0x1E);
  Parameter(0x00);

  Command(0x1F);
  Parameter(0x00);

  Command(0x30);
  Parameter(0x10);

  Command(0x34);
  Parameter(0x00);

  Command(0x03);
  Parameter(0x00);

  Command(0x02);
  Parameter(0x01);
}

// OLED draw function to fill display with red
void OLED_Disp_Draw() {  // Example: Full RED Draw
  int iX, iY;
  Command(0x0C);
  for (iY = 0; iY < 128; iY++) {
    for (iX = 0; iX < 128; iX++) {
      Parameter(0xF8);
      Parameter(0x00);
    }
  }
}

When I connect everything, I make sure that VCC > VDD > VSS at all times. Powering up the Pi Pico it sends the SPI initialization sequence, but then the display just draws 10 times the specified current, and I cannot figure out why.

I have triple-checked the connections based on the schematic and have measured every connection, and I cannot figure out what the issue is. The zener diode I am using is the 1N5221BCT-ND, which should be equivalent to the one mentioned in the datasheet, and I have confirmed that it is connected the correct way towards the "PRE"-pin.

The displays are 100% new and does not seem to have any signs of use. I know that it should possible to make them work, as I found this image in the listing:

I have contacted the seller on AliExpress but as you might have guessed they have no interest in giving support or guidance in any way (not that I expected that).

I cannot see the display pin numbers being flipped as as soon the SPI initialization sequence from the Pi Pico has been sent the current on VCC increases (it seems the display driver circuitry is enabled) but nothing shows up on the screen. The A0-pin is the same as DC (data/command).

Could someone please tell me what I am missing? Thank you!

Image of your setup presents rear side of the display. Are you sure it's connected to the module correct way?

I recently bought a few of these myself, and I've run into the exact same problem. Did anyone ever figure out a solution? Any help would be greatly appreciated. Thanks!

Hi. Sorry for the very late reply. Yes, connections were the correct way. I put the project on hold for a while, and tried it again with a new display a month later. The same results, with all connections quadruple-checked.

Hi. Good I am not the only one with the issues, bad that you have the same problem :confused:

I have tried the same connections and disconnected everything and connected it up again with a new display as well, still the same results. I am thinking there must be something really wrong in the datasheet, or these displays never really worked to begin with...

What really annoys me is that there is a photo like I have shown above of the display working. But I have talked with the seller on AliExpress and they said they did not take the picture and they do not offer support...

I don't know which device these were produced for originally, but if someone knows, please say!

Hi ! Have you managed to make it work?

Have you managed to make it work?

Hi. Unfortunately I could not make it work and I put the project aside. Might try it again some other time.

Looking at the initialization code, I think you’re supposed to hold CSB low while sending the command and data. This is how the write sequence looks in the datasheet:

Hi @POT82ES

As others have said, the datasheet may have errors.

I guess that the 20 V spec is the wrong part.

I suggest picking a brand new display and powering the 20 V pin with an adjustable power supply, starting from 0 V and incrementing gradually 0.5 V at a time, and watching when the current starts rising fast.

That's probably the max voltage the pin has to be powered with.

Cheers!

See if this helps, from upir_upir...

That seems to be a very different display, with a different controller IC.