From 6aba908086bc1231e430c010194484d3347b3804 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Mon, 6 Sep 2021 14:43:41 +0800 Subject: [PATCH] i2s: fix write failure issue in slave mode (backport v4.1) --- components/driver/i2s.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/driver/i2s.c b/components/driver/i2s.c index be1ea0efaa..c6117d4c95 100644 --- a/components/driver/i2s.c +++ b/components/driver/i2s.c @@ -314,6 +314,14 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_bits_per_sample_t b return ESP_ERR_INVALID_ARG; } p_i2s_obj[i2s_num]->sample_rate = rate; + + /** + * Due to hardware issue, bck division on ESP32/ESP32-S2 should be greater than 8 in slave mode + * So the factor need to be an appropriate value + */ + if (p_i2s_obj[i2s_num]->mode & I2S_MODE_SLAVE) { + factor = 16 * bits; + } double clkmdiv = (double)I2S_BASE_CLK / (rate * factor); if (clkmdiv > 256) { @@ -485,7 +493,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) //Avoid spurious interrupt return; } - + i2s_event_t i2s_event; int dummy; @@ -883,7 +891,7 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, } memset(p_i2s_obj[i2s_num], 0, sizeof(i2s_obj_t)); - portMUX_TYPE i2s_spinlock_unlocked[1] = {portMUX_INITIALIZER_UNLOCKED}; + portMUX_TYPE i2s_spinlock_unlocked[1] = {portMUX_INITIALIZER_UNLOCKED}; for (int x = 0; x < I2S_NUM_MAX; x++) { i2s_spinlock[x] = i2s_spinlock_unlocked[0]; }