Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ESP32 SPI send data hangup #35978

Closed
lgl88911 opened this issue Jun 5, 2021 · 4 comments · Fixed by #37643
Closed

ESP32 SPI send data hangup #35978

lgl88911 opened this issue Jun 5, 2021 · 4 comments · Fixed by #37643
Assignees
Labels
area: SPI SPI bus bug The issue is a bug, or the PR is fixing a bug platform: ESP32 Espressif ESP32 priority: low Low impact/importance bug

Comments

@lgl88911
Copy link
Collaborator

lgl88911 commented Jun 5, 2021

Describe the bug
When using esp32 spi to drive st7789v, there will be hangup when sending data

To Reproduce
Steps to reproduce the behavior:

  1. config st7789v for eps32
    esp32.dts
&spi3 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";
	miso-pin = <19>;
	mosi-pin = <23>;
	sclk-pin = <18>;
	csel-pin = <5>;

	/* Sitronix ST7789V LCD */
	st7789v: st7789v@1 {
		compatible = "sitronix,st7789v";
		reg = <1>;
		spi-max-frequency = <80000>; /* 8MHz */
		label = "ST7789V";
		cmd-data-gpios = <&gpio0 22 GPIO_ACTIVE_LOW>;	/* DET */
		reset-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;	/* RESX reset */
		width = <240>;
		height = <240>;
		x-offset = <0>;
		y-offset = <0>;
		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];
	};
};

prj.conf

CONFIG_SPI=y
CONFIG_ST7789V=y
  1. west build -p -b esp32 zephyrproject/zephyr/samples/drivers/display/
  2. west flash
  3. After running, you will see that the spi will hangup when writing data

Expected behavior
SPI of ESP32 work normal.

Logs and console output

▒▒*** Booting Zephyr OS build v2.6.0-rc1-300-g6ce0f2ee6606  ***
[00:00:00.448,210] <dbg> display_st7789v: st7789v_reset_display: Resetting display
[00:00:00.479,707] <inf> esp32_spi: CS control inhibited (no GPIO device)
[00:00:00.479,971] <dbg> esp32_spi: transceive: CONFIG First
[00:00:00.481,856] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5250 - rx_bufs (nil) - 1
[00:00:00.491,502] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5258 (1), current_rx (nil) (0), tx buf/len 0x3ffe5260/1, rx buf/len (nil)/0
[00:00:00.506,001] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.518,406] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.523,018] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.537,357] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.550,005] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.554,554] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffb0253/4, rx buf/len (nil)/0
[00:00:00.568,893] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.581,506] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.586,089] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.600,428] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.613,005] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.617,625] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffb0257/5, rx buf/len (nil)/0
[00:00:00.631,964] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.644,610] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.649,161] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.663,500] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.676,105] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.680,696] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:00.695,035] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.707,606] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.712,232] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.726,571] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.739,205] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.743,768] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:00.758,106] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.770,710] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.775,303] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.789,642] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.802,205] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.806,839] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:00.821,178] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.833,805] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.838,375] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.852,713] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.865,305] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.869,910] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:00.884,249] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.896,909] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.901,446] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.915,785] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.928,405] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.932,982] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:00.947,320] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.959,906] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.964,517] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:00.978,856] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:00.991,506] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:00.996,053] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:01.010,392] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.023,010] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.027,588] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.041,927] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.054,505] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.059,124] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:01.073,463] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.086,105] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.090,660] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.104,999] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.117,605] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.122,195] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffb0251/2, rx buf/len (nil)/0
[00:00:01.136,534] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.149,110] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.153,731] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.168,070] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.180,706] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.185,267] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:01.199,606] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.212,205] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.216,802] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.231,141] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.243,705] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.248,338] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:01.262,677] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.275,309] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.279,874] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.294,212] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.306,805] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.311,409] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:01.325,748] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.338,406] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.342,945] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.357,284] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.369,906] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.374,481] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe52b0/1, rx buf/len (nil)/0
[00:00:01.388,819] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.401,410] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.406,016] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.420,355] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.433,005] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.437,552] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.451,891] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.464,505] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.469,088] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffb0243/14, rx buf/len (nil)/0
[00:00:01.483,514] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.496,105] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.500,710] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.515,048] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.527,705] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.532,245] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffb0235/14, rx buf/len (nil)/0
[00:00:01.546,673] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.559,309] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.563,867] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.578,206] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.590,805] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.595,403] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffb0233/2, rx buf/len (nil)/0
[00:00:01.609,742] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.622,306] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.626,939] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.641,278] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.653,906] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.658,474] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffb0230/3, rx buf/len (nil)/0
[00:00:01.672,813] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.685,405] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5270 - rx_bufs (nil) - 1
[00:00:01.690,010] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5278 (1), current_rx (nil) (0), tx buf/len 0x3ffe5280/1, rx buf/len (nil)/0
[00:00:01.704,349] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.837,203] <inf> sample: Display sample for ST7789V
[00:00:01.837,367] <dbg> display_st7789v: st7789v_write: Writing 240x1 (w,h) @ 0x0 (x,y)
[00:00:01.840,560] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5210 - rx_bufs (nil) - 1
[00:00:01.850,195] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5218 (1), current_rx (nil) (0), tx buf/len 0x3ffe5220/1, rx buf/len (nil)/0
[00:00:01.864,533] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.877,106] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5210 - rx_bufs (nil) - 1
[00:00:01.881,730] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5218 (1), current_rx (nil) (0), tx buf/len 0x3ffe5250/4, rx buf/len (nil)/0
[00:00:01.896,069] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.908,710] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5210 - rx_bufs (nil) - 1
[00:00:01.913,266] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5218 (1), current_rx (nil) (0), tx buf/len 0x3ffe5220/1, rx buf/len (nil)/0
[00:00:01.927,605] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.940,205] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5210 - rx_bufs (nil) - 1
[00:00:01.944,802] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5218 (1), current_rx (nil) (0), tx buf/len 0x3ffe5250/4, rx buf/len (nil)/0
[00:00:01.959,140] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:01.971,709] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5210 - rx_bufs (nil) - 1
[00:00:01.976,337] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5218 (1), current_rx (nil) (0), tx buf/len 0x3ffe5220/1, rx buf/len (nil)/0
[00:00:01.990,676] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:02.003,305] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5210 - rx_bufs (nil) - 1
[00:00:02.007,873] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5218 (1), current_rx (nil) (0), tx buf/len 0x3ffb0d7c/480, rx buf/len (nil)/0
[00:00:02.022,419] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0
[00:00:02.035,010] <dbg> display_st7789v: st7789v_write: Writing 240x1 (w,h) @ 0x1 (x,y)
[00:00:02.038,453] <dbg> esp32_spi: spi_context_buffers_setup: tx_bufs 0x3ffe5210 - rx_bufs (nil) - 1
[00:00:02.048,096] <dbg> esp32_spi: spi_context_buffers_setup: current_tx 0x3ffe5218 (1), current_rx (nil) (0), tx buf/len 0x3ffe5220/1, rx buf/len (nil)/0
[00:00:02.062,435] <dbg> esp32_spi: spi_context_update_tx: tx buf/len (nil)/0

Additional context
The last few data sent by SPI are:
send 1
send 4
send 1
send 4
send 1
send 480
send 1
--> hangup

Check the code at this time and you will find waiting in spi_esp32_transfer

while (!spi_hal_usr_is_done(hal)) {
/* nop */
}

As far as I understand it, spi_hal_usr_is_done checks hardware registers. Does this mean that the hardware working status of ESP32 is abnormal?

static inline bool spi_ll_usr_is_done(spi_dev_t *hw)
{
     return hw->slave.trans_done;
}

When I simply use the following sending process to simulate below bug, but there will be no hangup

while(1){
send 1
send 4
send 1
send 4
send 1
send 480
}

Has anyone encountered a similar problem, or can give some debugging suggestions? Thank you!

@lgl88911 lgl88911 added the bug The issue is a bug, or the PR is fixing a bug label Jun 5, 2021
@galak galak added area: SPI SPI bus platform: ESP32 Espressif ESP32 labels Jun 5, 2021
@galak galak added the priority: low Low impact/importance bug label Jun 15, 2021
@sylvioalves
Copy link
Collaborator

@lgl88911 Hi, are you able to re-test this with latest main branch?

@JonasNorling
Copy link

I ran into a similar case while trying to drive a ST7735S display with ESP32, and found this bug report.
For me, it appears that SPI often locks up while or after trying to send more than 64 bytes in a transaction. That doesn't always happen, but once it happens it's repeatable with the same software build. In any case, only zeros get transmitted after the first 64 bytes.

A hacky workaround that makes it work for me is to limit the transfer size in the SPI driver:

diff --git a/drivers/spi/spi_esp32_spim.c b/drivers/spi/spi_esp32_spim.c
index e848136758..360192716e 100644
--- a/drivers/spi/spi_esp32_spim.c
+++ b/drivers/spi/spi_esp32_spim.c
@@ -63,6 +63,7 @@ static int IRAM_ATTR spi_esp32_transfer(const struct device *dev)
        spi_hal_dev_config_t *hal_dev = &data->dev_config;
        spi_hal_trans_config_t *hal_trans = &data->trans_config;
        size_t chunk_len = spi_context_max_continuous_chunk(&data->ctx);
+       chunk_len = MIN(chunk_len, 64);
 
        /* clean up and prepare SPI hal */
        memset((uint32_t *) hal->hw->data_buf, 0, sizeof(hal->hw->data_buf));

This happens on 2.6.0 and on today's main (zephyr-v2.6.0-1955-ga42890fb39).

@sylvioalves
Copy link
Collaborator

I ran into a similar case while trying to drive a ST7735S display with ESP32, and found this bug report.
For me, it appears that SPI often locks up while or after trying to send more than 64 bytes in a transaction. That doesn't always happen, but once it happens it's repeatable with the same software build. In any case, only zeros get transmitted after the first 64 bytes.

A hacky workaround that makes it work for me is to limit the transfer size in the SPI driver:

diff --git a/drivers/spi/spi_esp32_spim.c b/drivers/spi/spi_esp32_spim.c
index e848136758..360192716e 100644
--- a/drivers/spi/spi_esp32_spim.c
+++ b/drivers/spi/spi_esp32_spim.c
@@ -63,6 +63,7 @@ static int IRAM_ATTR spi_esp32_transfer(const struct device *dev)
        spi_hal_dev_config_t *hal_dev = &data->dev_config;
        spi_hal_trans_config_t *hal_trans = &data->trans_config;
        size_t chunk_len = spi_context_max_continuous_chunk(&data->ctx);
+       chunk_len = MIN(chunk_len, 64);
 
        /* clean up and prepare SPI hal */
        memset((uint32_t *) hal->hw->data_buf, 0, sizeof(hal->hw->data_buf));

This happens on 2.6.0 and on today's main (zephyr-v2.6.0-1955-ga42890fb39).

@JonasNorling, thanks for pointing that out!

@sylvioalves
Copy link
Collaborator

sylvioalves commented Aug 12, 2021

Editing: The max size is 64.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: SPI SPI bus bug The issue is a bug, or the PR is fixing a bug platform: ESP32 Espressif ESP32 priority: low Low impact/importance bug
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants