ST7735R TFT display stays white on nRF7002DK with NCS v2.6.0

Hi,

I am working on a smartwatch PoC using the nRF7002 DK (nRF5340), and I am trying to interface a 1.8" ST7735 SPI TFT display (128x160).

Hardware:
- Board: nRF7002DK (nrf7002dk_nrf5340_cpuapp)
- Display: 1.8" ST7735R TFT SPI 128x160
- NCS version: v2.6.0
- Zephyr version: 3.5.99
- Level shifter: BSS138 4-channel bidirectional (1.8V LV side, 3.3V HV side)

Problem:
Display stays completely white. SPI transactions complete successfully
with status 0. Driver initialises and sends all init commands without errors.

What I have confirmed:
1. Build compiles cleanly
2. Flash succeeds
3. st7735r driver initialises — "st7735r_reset_display: Resetting display" appears in logs
4. All SPI transactions finish with status 0 — no errors
5. display_write() returns 0 (success) for every row
6. Level shifter LV_VCC = 1.8V (measured), HV_VCC = 3.3V
7. Wiring confirmed correct multiple times

SPI log sample (everything succeeds):
[00:00:00.252] <dbg> display_st7735r: st7735r_reset_display: Resetting display
[00:00:09.927] <dbg> display_st7735r: st7735r_write: Writing 128x1 (w,h) @ 0x6 (x,y)
[00:00:09.902] <dbg> spi_nrfx_spim: finish_transaction: Transaction finished with status 0

Current wiring (spi3, Arduino header):
- SCK → Level shifter LV1→HV1 → TFT SCK (P1.15, Arduino D13)
- MOSI → Level shifter LV2→HV2 → TFT SDA (P1.13, Arduino D11)
- CS → Level shifter LV3→HV3 → TFT CS (P1.12, Arduino D10)
- DC → Level shifter LV4→HV4 → TFT A0 (P1.11, Arduino D9)
- RST → Level shifter LV5→HV5 → TFT RES (P1.10, Arduino D8)
- LV_VCC = 1.8V from nRF7002DK VDD pin
- HV_VCC = 3.3V from nRF7002DK 3.3V pin
- TFT VCC = 3.3V, TFT GND = GND

prj.conf:
CONFIG_GPIO=y
CONFIG_SPI=y
CONFIG_DISPLAY=y
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_ST7735R=y
CONFIG_SPI_NRFX=y
CONFIG_SPI_NRFX_RAM_BUFFER_SIZE=256
CONFIG_HEAP_MEM_POOL_SIZE=65536

overlay (nrf7002dk_nrf5340_cpuapp.overlay):
/ {
chosen {
zephyr,display = &st7735r;
};
};

&spi3 {
status = "okay";
cs-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
st7735r: st7735r@0 {
compatible = "sitronix,st7735r";
reg = <0>;
spi-max-frequency = <1000000>;
cmd-data-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
width = <128>;
height = <160>;
x-offset = <0>;
y-offset = <0>;
madctl = <0x00>;
colmod = <0x05>;
vmctr1 = <0x0e>;
pwctr1 = [a2 02 84];
pwctr2 = [c5];
pwctr3 = [0a 00];
pwctr4 = [8a 2a];
pwctr5 = [8a ee];
frmctr1 = [01 2c 2d];
frmctr2 = [01 2c 2d];
frmctr3 = [01 2c 2d 01 2c 2d];
gamctrp1 = [02 1c 07 12 37 32 29 2d 29 25 2b 39 00 01 03 10];
gamctrn1 = [03 1d 07 06 2e 2c 29 2d 2e 2e 37 3f 00 00 02 10];
};
};

Questions:
1. Is the 4 channel (blue board) logic level shifter suitable for SPI signals between
1.8V (nRF5340 Arduino header) and 3.3V (ST7735S)?
2. Are there pull-up resistors required on the HV side of the  level shifter
for SPI to work correctly?
3. Is there a known working example of driving an SPI display from
the nRF7002DK Arduino header with a level shifter?
4. Should I use spi4 instead of spi3, and if so what is the correct
pinctrl overlay for NCS v2.6.0?

!

  • Hi Monisa, 
    I don't think we have any known issue with the SPI on the nRF7002 DK. My suggestion is to try capture a logic analyzer trace on the SPI line to see if you have configured it correctly and that it has send the right command to the screen. 

    I would suggest to do some search for ST7735R on our devzone forum, I have seen people managed to use it with our chip. 

Related