ironblock/ST7701S-SPI-Driver

Beaglebone outputs garbled image on TDO TL021WVC02-B1323B (2.1" round LCD)

Closed this issue · 4 comments

Problem: When running this driver on a Beaglebone Black and trying to display any image on the TDO 2.1" LCD, the image is garbled.

Using fim to render a pure white png produces this:
IMG_6400

The OS is Debian Stretch 9.5 IoT from the Beaglebone website.

The display is connected as per the 16-bit LCD pinmux.

The chosen resolution is 480x480@60Hz. I've also tried the CVT RB and CVT RBv2 variants of standard VGA (640x480@60Hz, which should be supported by the ST7701S), and the results are the same, just shifted on the display. All tested configurations are visible in the device tree overlay.

Using fim to display other test images produces similar results. My pure black png is dark, a color test pattern produces some green effects, etc.

Testing the signal lines with a logic analyzer shows the expected values when sampling the MSB for each color. An excellent example is using a test image like this:
image004

When zoomed to the level of a single frame, everything looks correct, like the datasheet. DE, VSYNC, and HSYNC polarity look good and correct. The VSYNC refresh rate tested at 59.97hz, which should be appropriate for the display.
image005

When I zoom in to look at the timings for each line, everything also looks correct, and you can see the white and black pattern for each line in the MSB values. My logic analyzer can only sample as fast as 24MS/s, which does not accurately capture the pixel clock (which is was set to 16.15MHz for this test).
image006

Relevant files:

Debug log for driver (human-readable intent in main.rs:

debian@beaglebone:~$ ./st7701s
Initializing SPI driver for ST7701S panel
Address:   0x01
Parameter: 00000001
--------------------
Address:   0x11
Parameter: 00010001
--------------------
Address:   0xFF
Parameter: 01110111
Parameter: 00000001
Parameter: 00000000
Parameter: 00000000
Parameter: 00010000
--------------------
Address:   0xB0
Parameter: 00000000
Parameter: 00001110
Parameter: 00010101
Parameter: 00001111
Parameter: 00010001
Parameter: 00001000
Parameter: 00001000
Parameter: 00001000
Parameter: 00001000
Parameter: 00100011
Parameter: 00000100
Parameter: 00010011
Parameter: 00010010
Parameter: 00101011
Parameter: 00110100
Parameter: 00011111
--------------------
Address:   0xB1
Parameter: 00000000
Parameter: 00001110
Parameter: 10010101
Parameter: 00001111
Parameter: 00010011
Parameter: 00000111
Parameter: 00001001
Parameter: 00001000
Parameter: 00001000
Parameter: 00100010
Parameter: 00000100
Parameter: 00010000
Parameter: 00001110
Parameter: 00101100
Parameter: 00110100
Parameter: 00011111
--------------------
Address:   0xC0
Parameter: 11101001
Parameter: 00000010
--------------------
Address:   0xC1
Parameter: 00001010
Parameter: 00010000
--------------------
Address:   0xC2
Parameter: 00110000
Parameter: 00000000
--------------------
Address:   0xC3
Parameter: 10000000
Parameter: 00010010
Parameter: 00010000
--------------------
Address:   0xFF
Parameter: 01110111
Parameter: 00000001
Parameter: 00000000
Parameter: 00000000
Parameter: 00010001
--------------------
Address:   0xB0
Parameter: 01000101
--------------------
Address:   0xB1
Parameter: 00010011
--------------------
Address:   0xB2
Parameter: 00000111
--------------------
Address:   0xB3
Parameter: 10000000
--------------------
Address:   0xB5
Parameter: 01000111
--------------------
Address:   0xB7
Parameter: 10000100
--------------------
Address:   0xB8
Parameter: 00100000
--------------------
Address:   0xC1
Parameter: 01110011
--------------------
Address:   0xC2
Parameter: 01110011
--------------------
Address:   0xE0
Parameter: 00000000
Parameter: 00000000
Parameter: 00000010
--------------------
Address:   0xE1
Parameter: 00001011
Parameter: 00000000
Parameter: 00001101
Parameter: 00000000
Parameter: 00001100
Parameter: 00000000
Parameter: 00001110
Parameter: 00000000
Parameter: 00000000
Parameter: 01000100
Parameter: 01000100
--------------------
Address:   0xE2
Parameter: 00110011
Parameter: 00110011
Parameter: 01000100
Parameter: 01000100
Parameter: 01100100
Parameter: 00000000
Parameter: 01100110
Parameter: 00000000
Parameter: 01100101
Parameter: 00000000
Parameter: 01100111
Parameter: 00000000
Parameter: 00000000
--------------------
Address:   0xE3
Parameter: 00000000
Parameter: 00000000
Parameter: 00110011
Parameter: 00110011
--------------------
Address:   0xE4
Parameter: 01000100
Parameter: 01000100
--------------------
Address:   0xE5
Parameter: 00001100
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
Parameter: 00001110
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
Parameter: 00010000
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
Parameter: 00010010
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
--------------------
Address:   0xE6
Parameter: 00000000
Parameter: 00000000
Parameter: 00110011
Parameter: 00110011
--------------------
Address:   0xE7
Parameter: 01000100
Parameter: 01000100
--------------------
Address:   0xE8
Parameter: 00001101
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
Parameter: 00001111
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
Parameter: 00010001
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
Parameter: 00010011
Parameter: 01111000
Parameter: 00111100
Parameter: 10100000
--------------------
Address:   0xEB
Parameter: 00000010
Parameter: 00000010
Parameter: 00111001
Parameter: 00111001
Parameter: 11101110
Parameter: 01000100
Parameter: 00000000
--------------------
Address:   0xEC
Parameter: 00000000
Parameter: 00000000
--------------------
Address:   0xED
Parameter: 11111111
Parameter: 11110001
Parameter: 00000100
Parameter: 01010110
Parameter: 01110010
Parameter: 00111111
Parameter: 11111111
Parameter: 11111111
Parameter: 11111111
Parameter: 11111111
Parameter: 11110011
Parameter: 00100111
Parameter: 01100101
Parameter: 01000000
Parameter: 00011111
Parameter: 11111111
--------------------
Address:   0xFF
Parameter: 01110111
Parameter: 00000001
Parameter: 00000000
Parameter: 00000000
Parameter: 00000000
--------------------
Address:   0x3A
Parameter: 01110000
--------------------
Address:   0x36
Parameter: 00000000
--------------------
Address:   0x35
Parameter: 00000000
--------------------
Address:   0x29
Parameter: 00101001
--------------------
Address:   0x51
Parameter: 00000000
--------------------

Here is the exact hardware setup I'm using:

IMG_6401
BeagleBone Black Pinout Diagram

Screen Shot 2020-03-30 at 10 46 23 AM

Function Name Pin Resistor Pin Name
LED ANODE +12.8v DC PSU + -- 1 LED A
LED CATHODE GND DC PSU - -- 2 LED K
LED CATHODE GND DC PSU - -- 3 LED K
Ground DGND P9.1 -- 4 GND
Power supply VDD 3.3V P9.3 -- 5 VCI
Reset Signal GPIO_60 P9.12 -- 6 RESET
Not Connected -- -- -- 7 NC
Not Connected -- -- -- 8 NC
SPI Data signal SPIO_D1 P9.18 -- 9 SDA
SPI Clock signal SPIO_SLCK P9.22 -- 10 SCK
SPI Chip select signal SPIO_CSO P9.17 -- 11 CS
RGB dot clock signal LCD_PCLK P8.28 33Ω 12 PCLK
RGB data enable signal LCD_AC_BIAS P8.30 33Ω 13 DE
RGB frame synchronizing signal LCD_VSYNC P8.27 33Ω 14 VSYNC
RGB line synchronizing signal LCD_HSYNC P8.29 33Ω 15 HSYNC
📘B[0] DGND P8.1 33Ω 16 DB0
📘B[1] LCD_DATA0 P8.45 33Ω 17 DB1
📘B[2] LCD_DATA1 P8.46 33Ω 18 DB2
📘B[3] LCD_DATA2 P8.43 33Ω 19 DB3
📘B[4] LCD_DATA3 P8.44 33Ω 20 DB4
📘B[5] LCD_DATA4 P8.41 33Ω 21 DB5
📗G[0] LCD_DATA5 P8.42 33Ω 22 DB
📗G[1] LCD_DATA6 P8.39 33Ω 23 DB
📗G[2] LCD_DATA7 P8.40 33Ω 24 DB
📗G[3] LCD_DATA8 P8.37 33Ω 25 DB
📗G[4] LCD_DATA9 P8.38 33Ω 26 DB
📗G[5] LCD_DATA10 P8.36 33Ω 27 DB
📕R[0] DGND P8.2 33Ω 28 DB
📕R[1] LCD_DATA11 P8.34 33Ω 29 DB
📕R[2] LCD_DATA12 P8.35 33Ω 30 DB
📕R[3] LCD_DATA13 P8.33 33Ω 31 DB
📕R[4] LCD_DATA14 P8.31 33Ω 32 DB
📕R[5] LCD_DATA15 P8.33 33Ω 33 DB

@ironblock have you made any progress on this? I seem to have the exact same issue with a 480x480 LCD controlled by an ST7701S.

@blazer82 Apologies for missing your comment until now.

I was eventually able to obtain a working command sequence from my display vendor. The good news is that it works, the bad news is that it's utterly undocumented in the ST7701S datasheet, so I have no idea what these commands actually do.

The updated sequence is here:
https://github.com/ironblock/ST7701S-SPI-Driver/blob/master/src/sequence_tdo.rs#L75-L139

The display is working well now:

camphoto_684387517
camphoto_1254324197

Thanks for replying. I was able to resolve my issue the same way: using an undocumented init sequence.

For future reference it's documented in this Google Groups thread and also in my open source library.