'cst816s: failed reading chip id' with Waveshare 1.69" Touch LCD

I am getting an error message when trying to use a nRF5340 DK with a Waveshare 1.69inch Touch LCD Module on the Zephyr sample code with minimal modifications. When I flash/reset I get:

[00:00:01.159,332] <err> cst816s: failed reading chip id
*** Booting nRF Connect SDK v3.5.99-ncs1-1 ***
[00:00:01.163,635] <inf> app: Starting...

and when I touch the screen I get:

[00:00:42.109,527] <err> cst816s: Could not read x data

The pin settings are as follows:

Module Pin
nRF5340 Pin
VCC
VDD (3.3)
GND GND
LCD_DIN
P0.25
LCD_CLK
P0.06
LCD_CS
P0.11
LCD_DC
P1.11
LCS_RST
P1.10
LCS_BL
VDD (3.3)
TP_SDA
P1.02
TP_SCL
P1.03
TP_RST
P0.20
TP_IRQ
P1.01
The nrf5340dk_nrf5340_cpuapp.overlay is:
&pinctrl {

    spi4_default: spi4_default {
        group1 {
            psels = <NRF_PSEL(SPIM_SCK, 0, 6)>,
                <NRF_PSEL(SPIM_MOSI, 0, 25)>;
        };
    };

    spi4_sleep: spi4_sleep {
        group1 {
            psels = <NRF_PSEL(SPIM_SCK, 0, 6)>,
                <NRF_PSEL(SPIM_MOSI, 0, 25)>;
            low-power-enable;
        };
    };

    // Set to I2C pins that the touch screen is connected to
    i2c2_default: i2c2_default {
        group1 {
            psels = <NRF_PSEL(TWIM_SDA, 1, 2)>,
                <NRF_PSEL(TWIM_SCL, 1, 3)>;
        };
    };

    i2c2_sleep: i2c2_sleep {
        group1 {
            psels = <NRF_PSEL(TWIM_SDA, 1, 2)>,
                <NRF_PSEL(TWIM_SCL, 1, 3)>;
            low-power-enable;
        };
    };
};

&spi4 {
	compatible = "nordic,nrf-spim";
	status = "okay";
	pinctrl-0 = <&spi4_default>;
	pinctrl-1 = <&spi4_sleep>;
    pinctrl-names = "default", "sleep";
	cs-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;

    st7789v_st7789v_tl019fqv01: st7789v@0 {
        compatible = "sitronix,st7789v";
        spi-max-frequency = <20000000>;
        reg = <0>;
        cmd-data-gpios = < &gpio1 11 GPIO_ACTIVE_LOW>;
        reset-gpios = < &gpio1 10 GPIO_ACTIVE_LOW>;
        width = <240>;
        height = <280>;
        x-offset = <0>;
        y-offset = <20>;
        vcom = <0x19>;
        gctrl = <0x35>;
        vrhs = <0x12>;
        vdvs = <0x20>;
        mdac = <0x00>;
        gamma = <0x01>;
        colmod = <0x05>;
        lcm = <0x2c>;
        porch-param = [0c 0c 00 33 33];
        cmd2en-param = [5a 69 02 01];
        pwctrl1-param = [a4 a1];
        pvgam-param = [D0 04 0D 11 13 2B 3F 54 4C 18 0D 0B 1F 23];
        nvgam-param = [D0 04 0C 11 13 2C 3F 44 51 2F 1F 1F 20 23];
        ram-param = [00 F0];
        rgb-param = [CD 08 14];
	};
};


&i2c2 {
    compatible = "nordic,nrf-twim";
    status = "okay";
    clock-frequency = <I2C_BITRATE_FAST>;
    pinctrl-0 = <&i2c2_default>;
    pinctrl-1 = <&i2c2_sleep>;
    pinctrl-names = "default", "sleep";

    cst816s: cst816s@15 {
        compatible = "hynitron,cst816s";
        reg = <0x15>;
        irq-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
        rst-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
    };
};

/ {
	fstab {
		compatible = "zephyr,fstab";
		lfs: lfs {
			compatible = "zephyr,fstab,littlefs";
			mount-point = "/lfs";
			partition = <&littlefs_storage>;
			automount;
            read-size = <16>;
			prog-size = <16>;
			cache-size = <64>;
			lookahead-size = <32>;
			block-cycles = <512>;
		};
	};
};

/delete-node/ &storage_partition;

&mx25r64 {
	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		littlefs_storage: partition@0 {
			label = "littlefs_storage";
			reg = <0x00000000 0x00200000>;
		};
		lvgl_raw_partition: partition@200000 {
			label = "lvgl_raw_partition";
			reg = <0x00200000 0x00200000>;
		};
        settings_partition: partition@400000 {
            label = "settings_partition";
            reg = <0x400000 0x100000 >;
        };
	};
};

/ {
    chosen {
        nordic,pm-ext-flash = &mx25r64;
        zephyr,display = &st7789v_st7789v_tl019fqv01;
        zephyr,keyboard-scan = &cst816s;
    };

    /* 
    aliases {
        vibrator_pwm = &led0;
    };
    */
    lvgl_pointer_input: lvgl_pointer {
        compatible = "zephyr,lvgl-pointer-input";
        input = <&cst816s>;
        swap-xy;
        invert-x;
    };

    aliases {
        input = &cst816s;
    };

    vib_pwr: vib-pwr-ctrl {
        compatible = "regulator-fixed";
        regulator-name = "vib-pwr-ctrl";
        enable-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
    };
};
The prj.conf is:
CONFIG_LV_Z_MEM_POOL_SIZE=16384
CONFIG_LV_Z_SHELL=y
CONFIG_MAIN_STACK_SIZE=2048

CONFIG_DISPLAY=y
CONFIG_DISPLAY_LOG_LEVEL_ERR=y
CONFIG_DISPLAY_LOG_LEVEL_INF=y

CONFIG_LOG=y
CONFIG_SHELL=y


CONFIG_LVGL=y
CONFIG_LV_MEM_CUSTOM=y
CONFIG_LV_USE_LOG=y
CONFIG_LV_USE_LABEL=y
CONFIG_LV_USE_BTN=y
CONFIG_LV_USE_ARC=y
CONFIG_LV_USE_IMG=y
CONFIG_LV_USE_MONKEY=y
CONFIG_LV_FONT_MONTSERRAT_16=y


#added to get touch working
CONFIG_INPUT=y
CONFIG_LV_Z_POINTER_INPUT=y
#CONFIG_LV_Z_ENCODER_INPUT=y
and the main.c is:
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/display.h>
#include <zephyr/drivers/gpio.h>
#include <lvgl.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <lvgl_input_device.h>

#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(app);

static uint32_t count;

#ifdef CONFIG_GPIO
static struct gpio_dt_spec button_gpio = GPIO_DT_SPEC_GET_OR(
		DT_ALIAS(sw0), gpios, {0});
static struct gpio_callback button_callback;

static void button_isr_callback(const struct device *port,
				struct gpio_callback *cb,
				uint32_t pins)
{
	ARG_UNUSED(port);
	ARG_UNUSED(cb);
	ARG_UNUSED(pins);

	count = 0;
}
#endif /* CONFIG_GPIO */

#ifdef CONFIG_LV_Z_ENCODER_INPUT
static const struct device *lvgl_encoder =
	DEVICE_DT_GET(DT_COMPAT_GET_ANY_STATUS_OKAY(zephyr_lvgl_encoder_input));
#endif /* CONFIG_LV_Z_ENCODER_INPUT */

static void lv_btn_click_callback(lv_event_t *e)
{
	LOG_INF("lv_btn_click_callback called");
	ARG_UNUSED(e);

	count = 0;
}

int main(void)
{
	char count_str[11] = {0};
	const struct device *display_dev;
	lv_obj_t *hello_world_label;
	lv_obj_t *count_label;

	LOG_INF("Starting...");

	display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
	if (!device_is_ready(display_dev)) {
		LOG_ERR("Device not ready, aborting test");
		return 0;
	}


	lv_obj_set_style_bg_color(lv_scr_act(), lv_color_black(), LV_PART_MAIN);
	lv_obj_set_style_text_color(lv_scr_act(), lv_color_white(), LV_PART_MAIN);

#ifdef CONFIG_GPIO
	if (gpio_is_ready_dt(&button_gpio)) {
		int err;

		err = gpio_pin_configure_dt(&button_gpio, GPIO_INPUT);
		if (err) {
			LOG_ERR("failed to configure button gpio: %d", err);
			return 0;
		}

		gpio_init_callback(&button_callback, button_isr_callback,
				   BIT(button_gpio.pin));

		err = gpio_add_callback(button_gpio.port, &button_callback);
		if (err) {
			LOG_ERR("failed to add button callback: %d", err);
			return 0;
		}

		err = gpio_pin_interrupt_configure_dt(&button_gpio,
						      GPIO_INT_EDGE_TO_ACTIVE);
		if (err) {
			LOG_ERR("failed to enable button callback: %d", err);
			return 0;
		}
	}
#endif /* CONFIG_GPIO */

#ifdef CONFIG_LV_Z_ENCODER_INPUT
	lv_obj_t *arc;
	lv_group_t *arc_group;

	arc = lv_arc_create(lv_scr_act());
	lv_obj_align(arc, LV_ALIGN_CENTER, 0, 0);
	lv_obj_set_size(arc, 150, 150);

	arc_group = lv_group_create();
	lv_group_add_obj(arc_group, arc);
	lv_indev_set_group(lvgl_input_get_indev(lvgl_encoder), arc_group);
#endif /* CONFIG_LV_Z_ENCODER_INPUT */

	if (IS_ENABLED(CONFIG_LV_Z_POINTER_KSCAN) || IS_ENABLED(CONFIG_LV_Z_POINTER_INPUT)) {
		lv_obj_t *hello_world_button;

		hello_world_button = lv_btn_create(lv_scr_act());
		lv_obj_align(hello_world_button, LV_ALIGN_CENTER, 0, 0);
		lv_obj_add_event_cb(hello_world_button, lv_btn_click_callback, LV_EVENT_CLICKED,
						NULL);
		hello_world_label = lv_label_create(hello_world_button);
	} else {
		hello_world_label = lv_label_create(lv_scr_act());
	}

	lv_label_set_text(hello_world_label, "Hello world!");
	lv_obj_align(hello_world_label, LV_ALIGN_CENTER, 0, 0);
	lv_obj_set_style_text_font(hello_world_label, &lv_font_montserrat_16, LV_PART_MAIN);

	count_label = lv_label_create(lv_scr_act());
	lv_obj_align(count_label, LV_ALIGN_BOTTOM_MID, 0, 0);
	lv_obj_set_style_text_font(count_label, &lv_font_montserrat_16, LV_PART_MAIN);

	lv_task_handler();
	display_blanking_off(display_dev);

	while (1) {
		if ((count % 100) == 0U) {
			sprintf(count_str, "%d", count/100U);
			lv_label_set_text(count_label, count_str);
		}
		lv_task_handler();
		++count;
		k_sleep(K_MSEC(10));
	}
}
Parents Reply Children
  • LOG_INF("lv_btn_click_callback called");

    and 

    CONFIG_LV_Z_POINTER_INPUT=y

  • Try to increase CONFIG_DISPLAY_LOG_LEVEL and see if you get any logs from the display init driver.


  • [00:00:00.441,375] <dbg> display_st7789v: st7789v_reset_display: Resetting display
    [00:00:01.145,263] <err> cst816s: failed reading chip id
    *** Booting nRF Connect SDK v3.5.99-ncs1-1 ***
    [00:00:01.149,597] <inf> app: Starting...
    [00:00:01.159,210] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x0 (x,y)
    [00:00:01.166,717] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x28 (x,y)
    [00:00:01.174,224] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x56 (x,y)
    [00:00:01.181,732] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x84 (x,y)
    [00:00:01.192,291] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x112 (x,y)
    [00:00:01.203,063] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x140 (x,y)
    [00:00:01.210,571] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x168 (x,y)
    [00:00:01.218,139] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x196 (x,y)
    [00:00:01.225,708] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x224 (x,y)
    [00:00:01.234,344] <dbg> display_st7789v: st7789v_write: Writing 240x28 (w,h) @ 0x252 (x,y)
    [00:00:01.243,804] <dbg> display_st7789v: st7789v_write: Writing 53x27 (w,h) @ 94x253 (x,y)
    [00:00:02.257,110] <dbg> display_st7789v: st7789v_write: Writing 29x27 (w,h) @ 106x253 (x,y)
    [00:00:03.269,714] <dbg> display_st7789v: st7789v_write: Writing 28x27 (w,h) @ 107x253 (x,y)
    [00:00:04.281,463] <dbg> display_st7789v: st7789v_write: Writing 27x27 (w,h) @ 107x253 (x,y)
    [00:00:05.294,006] <dbg> display_st7789v: st7789v_write: Writing 30x27 (w,h) @ 106x253 (x,y)
    [00:00:06.306,610] <dbg> display_st7789v: st7789v_write: Writing 29x27 (w,h) @ 106x253 (x,y)
    [00:00:07.319,244] <dbg> display_st7789v: st7789v_write: Writing 29x27 (w,h) @ 106x253 (x,y)
    [00:00:08.330,902] <dbg> display_st7789v: st7789v_write: Writing 28x27 (w,h) @ 106x253 (x,y)
    [00:00:09.342,651] <dbg> display_st7789v: st7789v_write: Writing 28x27 (w,h) @ 106x253 (x,y)

  • Something seems off with the I2C.
    Can you probe your I2C lines with a logic analyzer or oscilloscope and see if there is any activity?

  • I've never done that before. I might be able to try it, but I do get this error:

    [00:37:04.562,744] <err> cst816s: Could not read x data

    When I touch the screen so I would assume the lines are working, right?

Related