From 0b523c23007bc0c62de7524b80fbbd54775fb016 Mon Sep 17 00:00:00 2001 From: michael Date: Sat, 27 Apr 2019 01:29:48 +0800 Subject: [PATCH] spi_master: fix the dual/quad io issue introduced in f871cc5ffa951032adf435997ed7688e31afb3ba The issue is caused by 1. The hal didn't pass the io_mode to LL. 2. The setup_device function overwrite the trans-specific settings. --- components/driver/spi_master.c | 6 +++--- components/soc/src/hal/spi_hal_iram.c | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/components/driver/spi_master.c b/components/driver/spi_master.c index 23954a2a1..ca0267c23 100644 --- a/components/driver/spi_master.c +++ b/components/driver/spi_master.c @@ -647,7 +647,9 @@ static void SPI_MASTER_ISR_ATTR spi_new_trans(spi_device_t *dev, spi_trans_priv_ trans = trans_buf->trans; host->cur_cs = dev_id; - //We should be done with the transmission. + + //Reconfigure according to device settings, the function only has effect when the dev_id is changed. + spi_setup_device(host, dev_id); hal->tx_bitlen = trans->length; hal->rx_bitlen = trans->rxlength; @@ -683,8 +685,6 @@ static void SPI_MASTER_ISR_ATTR spi_new_trans(spi_device_t *dev, spi_trans_priv_ hal->dummy_bits = dev->cfg.dummy_bits; } - //Reconfigure according to device settings, the function only has effect when the dev_id is changed. - spi_setup_device(host, dev_id); spi_hal_setup_trans(hal); spi_hal_prepare_data(hal); diff --git a/components/soc/src/hal/spi_hal_iram.c b/components/soc/src/hal/spi_hal_iram.c index 00bd082bf..2bf0aadb8 100644 --- a/components/soc/src/hal/spi_hal_iram.c +++ b/components/soc/src/hal/spi_hal_iram.c @@ -41,11 +41,12 @@ void spi_hal_setup_trans(const spi_hal_context_t *hal) { spi_dev_t *hw = hal->hw; + //clear int bit spi_ll_clear_int_stat(hal->hw); + //We should be done with the transmission. assert(spi_ll_get_running_cmd(hw) == 0); - //clear int bit - spi_ll_master_set_io_mode(hw, SPI_LL_IO_MODE_NORMAL); + spi_ll_master_set_io_mode(hw, hal->io_mode); int extra_dummy = 0; //when no_dummy is not set and in half-duplex mode, sets the dummy bit if RX phase exist