From 29792561cad26b275cacff3800b3d5e05ef596b5 Mon Sep 17 00:00:00 2001 From: Vilem Zavodny Date: Tue, 29 Mar 2022 08:43:16 +0200 Subject: [PATCH] examples/spi_master: Fixed SPI read (keeping CS active) in SPI master example Closes https://github.com/espressif/esp-idf/issues/8652 --- .../spi_master/lcd/main/spi_master_example_main.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c b/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c index c3fdc8e336..f46e4b0a28 100644 --- a/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c +++ b/examples/peripherals/spi_master/lcd/main/spi_master_example_main.c @@ -184,7 +184,7 @@ DRAM_ATTR static const lcd_init_cmd_t ili_init_cmds[]={ * mode for higher speed. The overhead of interrupt transactions is more than * just waiting for the transaction to complete. */ -void lcd_cmd(spi_device_handle_t spi, const uint8_t cmd) +void lcd_cmd(spi_device_handle_t spi, const uint8_t cmd, bool keep_cs_active) { esp_err_t ret; spi_transaction_t t; @@ -192,6 +192,9 @@ void lcd_cmd(spi_device_handle_t spi, const uint8_t cmd) t.length=8; //Command is 8 bits t.tx_buffer=&cmd; //The data is the cmd itself t.user=(void*)0; //D/C needs to be set to 0 + if (keep_cs_active) { + t.flags = SPI_TRANS_CS_KEEP_ACTIVE; //Keep CS active after data transfer + } ret=spi_device_polling_transmit(spi, &t); //Transmit! assert(ret==ESP_OK); //Should have had no issues. } @@ -226,8 +229,11 @@ void lcd_spi_pre_transfer_callback(spi_transaction_t *t) uint32_t lcd_get_id(spi_device_handle_t spi) { + // When using SPI_TRANS_CS_KEEP_ACTIVE, bus must be locked/acquired + spi_device_acquire_bus(spi, portMAX_DELAY); + //get_id cmd - lcd_cmd(spi, 0x04); + lcd_cmd(spi, 0x04, true); spi_transaction_t t; memset(&t, 0, sizeof(t)); @@ -238,6 +244,9 @@ uint32_t lcd_get_id(spi_device_handle_t spi) esp_err_t ret = spi_device_polling_transmit(spi, &t); assert( ret == ESP_OK ); + // Release bus + spi_device_release_bus(spi); + return *(uint32_t*)t.rx_data; } @@ -293,7 +302,7 @@ void lcd_init(spi_device_handle_t spi) //Send all the commands while (lcd_init_cmds[cmd].databytes!=0xff) { - lcd_cmd(spi, lcd_init_cmds[cmd].cmd); + lcd_cmd(spi, lcd_init_cmds[cmd].cmd, false); lcd_data(spi, lcd_init_cmds[cmd].data, lcd_init_cmds[cmd].databytes&0x1F); if (lcd_init_cmds[cmd].databytes&0x80) { vTaskDelay(100 / portTICK_PERIOD_MS);