Browse Source

Merge branch 'bugfix/fix_i2s_reset_issue_v4.0' into 'release/v4.0'

Bugfix/fix i2s reset issue v4.0

See merge request espressif/esp-idf!9585
Michael (XIAO Xufeng) 5 years ago
parent
commit
3f96604fda
1 changed files with 15 additions and 7 deletions
  1. 15 7
      components/driver/i2s.c

+ 15 - 7
components/driver/i2s.c

@@ -489,6 +489,15 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_bits_per_sample_t b
             rate, real_rate, bits, clkmInteger, bck, (double)I2S_BASE_CLK / mclk, real_rate*bits*channel, 64, clkmDecimals);
             rate, real_rate, bits, clkmInteger, bck, (double)I2S_BASE_CLK / mclk, real_rate*bits*channel, 64, clkmDecimals);
     }
     }
 
 
+    if (p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) {
+        p_i2s_obj[i2s_num]->tx->curr_ptr = NULL;
+        p_i2s_obj[i2s_num]->tx->rw_pos = 0;
+    }
+    if (p_i2s_obj[i2s_num]->mode & I2S_MODE_RX) {
+        p_i2s_obj[i2s_num]->rx->curr_ptr = NULL;
+        p_i2s_obj[i2s_num]->rx->rw_pos = 0;
+    }
+
     I2S[i2s_num]->sample_rate_conf.tx_bits_mod = bits;
     I2S[i2s_num]->sample_rate_conf.tx_bits_mod = bits;
     I2S[i2s_num]->sample_rate_conf.rx_bits_mod = bits;
     I2S[i2s_num]->sample_rate_conf.rx_bits_mod = bits;
 
 
@@ -670,17 +679,17 @@ esp_err_t i2s_start(i2s_port_t i2s_num)
     I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
     I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
     //start DMA link
     //start DMA link
     I2S_ENTER_CRITICAL();
     I2S_ENTER_CRITICAL();
-    i2s_reset_fifo(i2s_num);
+    I2S[i2s_num]->conf.tx_reset = 1;
+    I2S[i2s_num]->conf.tx_reset = 0;
+    I2S[i2s_num]->conf.rx_reset = 1;
+    I2S[i2s_num]->conf.rx_reset = 0;
     //reset dma
     //reset dma
     I2S[i2s_num]->lc_conf.in_rst = 1;
     I2S[i2s_num]->lc_conf.in_rst = 1;
     I2S[i2s_num]->lc_conf.in_rst = 0;
     I2S[i2s_num]->lc_conf.in_rst = 0;
     I2S[i2s_num]->lc_conf.out_rst = 1;
     I2S[i2s_num]->lc_conf.out_rst = 1;
     I2S[i2s_num]->lc_conf.out_rst = 0;
     I2S[i2s_num]->lc_conf.out_rst = 0;
 
 
-    I2S[i2s_num]->conf.tx_reset = 1;
-    I2S[i2s_num]->conf.tx_reset = 0;
-    I2S[i2s_num]->conf.rx_reset = 1;
-    I2S[i2s_num]->conf.rx_reset = 0;
+    i2s_reset_fifo(i2s_num);
 
 
     esp_intr_disable(p_i2s_obj[i2s_num]->i2s_isr_handle);
     esp_intr_disable(p_i2s_obj[i2s_num]->i2s_isr_handle);
     I2S[i2s_num]->int_clr.val = 0xFFFFFFFF;
     I2S[i2s_num]->int_clr.val = 0xFFFFFFFF;
@@ -895,19 +904,18 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_t *i2s_co
         adc_power_always_on();
         adc_power_always_on();
     }
     }
     // configure I2S data port interface.
     // configure I2S data port interface.
-    i2s_reset_fifo(i2s_num);
     //reset i2s
     //reset i2s
     I2S[i2s_num]->conf.tx_reset = 1;
     I2S[i2s_num]->conf.tx_reset = 1;
     I2S[i2s_num]->conf.tx_reset = 0;
     I2S[i2s_num]->conf.tx_reset = 0;
     I2S[i2s_num]->conf.rx_reset = 1;
     I2S[i2s_num]->conf.rx_reset = 1;
     I2S[i2s_num]->conf.rx_reset = 0;
     I2S[i2s_num]->conf.rx_reset = 0;
-
     //reset dma
     //reset dma
     I2S[i2s_num]->lc_conf.in_rst = 1;
     I2S[i2s_num]->lc_conf.in_rst = 1;
     I2S[i2s_num]->lc_conf.in_rst = 0;
     I2S[i2s_num]->lc_conf.in_rst = 0;
     I2S[i2s_num]->lc_conf.out_rst = 1;
     I2S[i2s_num]->lc_conf.out_rst = 1;
     I2S[i2s_num]->lc_conf.out_rst = 0;
     I2S[i2s_num]->lc_conf.out_rst = 0;
 
 
+    i2s_reset_fifo(i2s_num);
     //Enable and configure DMA
     //Enable and configure DMA
     I2S[i2s_num]->lc_conf.check_owner = 0;
     I2S[i2s_num]->lc_conf.check_owner = 0;
     I2S[i2s_num]->lc_conf.out_loop_test = 0;
     I2S[i2s_num]->lc_conf.out_loop_test = 0;