Explorar el Código

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.
michael hace 6 años
padre
commit
0b523c2300
Se han modificado 2 ficheros con 6 adiciones y 5 borrados
  1. 3 3
      components/driver/spi_master.c
  2. 3 2
      components/soc/src/hal/spi_hal_iram.c

+ 3 - 3
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);
 

+ 3 - 2
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