ESP32C3何时发布支持I2S的版本?

henryli
Posts: 11
Joined: Wed Jun 23, 2021 6:53 am

ESP32C3何时发布支持I2S的版本?

Postby henryli » Tue Jul 06, 2021 8:06 am

目前使用ESP32-C3芯片开发音频产品,但目前V4.3版本不支持I2S接口. 预计什么时候可以发布支持I2S的版本?

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: ESP32C3何时发布支持I2S的版本?

Postby ESP_Gargamel » Tue Jul 06, 2021 11:49 am

4.4 版会支持,预计 8 月底之前,会先合入到 master 分支。

henryli
Posts: 11
Joined: Wed Jun 23, 2021 6:53 am

Re: ESP32C3何时发布支持I2S的版本?

Postby henryli » Thu Aug 12, 2021 9:17 am

最新master分支支持了i2s。但是在使用中发现以下两个问题:
1. 不支持SLAVE模式下的全双工
2. 不支持SLAVE模式下的MONO格式,只能STETEO

L-KAYA
Posts: 22
Joined: Thu Aug 12, 2021 3:44 am

Re: ESP32C3何时发布支持I2S的版本?

Postby L-KAYA » Thu Aug 12, 2021 11:22 am

henryli wrote:
Thu Aug 12, 2021 9:17 am
最新master分支支持了i2s。但是在使用中发现以下两个问题:
1. 不支持SLAVE模式下的全双工
2. 不支持SLAVE模式下的MONO格式,只能STETEO
相关BUG正在修复中
关于第一个BUG解决方案是把i2s.c的line 197~203替换为:
  1.         if (p_i2s[i2s_num]->mode & I2S_MODE_RX) {
  2.             gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].rx_ws_sig, 0);
  3.             gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].rx_bck_sig, 0);
  4.         } else {
  5.             gpio_matrix_in_check_and_set(pin->ws_io_num, i2s_periph_signal[i2s_num].tx_ws_sig, 0);
  6.             gpio_matrix_in_check_and_set(pin->bck_io_num, i2s_periph_signal[i2s_num].tx_bck_sig, 0);
  7.         }
上面能解决无法通信问题,但是仍有可能出现SLAVE发送的数据延迟较大导致接收端数据出现移位,需要将mclk_div和bck_div设为1

henryli
Posts: 11
Joined: Wed Jun 23, 2021 6:53 am

Re: ESP32C3何时发布支持I2S的版本?

Postby henryli » Fri Aug 13, 2021 6:42 am

”上面能解决无法通信问题,但是仍有可能出现SLAVE发送的数据延迟较大导致接收端数据出现移位,需要将mclk_div和bck_div设为1“

上面这个如何设置?

L-KAYA
Posts: 22
Joined: Thu Aug 12, 2021 3:44 am

Re: ESP32C3何时发布支持I2S的版本?

Postby L-KAYA » Mon Aug 16, 2021 7:36 am

临时性的办法是在'i2s_hal.c'的'i2s_hal_tx_clock_config'和'i2s_hal_rx_clock_config'中,把'i2s_hal_clk_cal'删掉,直接初始化'i2s_ll_clk_cal_t'变量,代码如下:

Code: Select all

void i2s_hal_tx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor)
{
    i2s_ll_clk_cal_t clk_set = {
    	.mclk_div = 1,
        .bck_div  = 1,
        .a            = 1,
        .b            = 0
    };
    i2s_ll_tx_set_clk(hal->dev, &clk_set);
}

void i2s_hal_rx_clock_config(i2s_hal_context_t *hal, uint32_t sclk, uint32_t fbck, int factor)
{
    i2s_ll_clk_cal_t clk_set = {
    	.mclk_div = 1,
        .bck_div  = 1,
        .a            = 1,
        .b            = 0
    };
    i2s_ll_rx_set_clk(hal->dev, &clk_set);
}
解释:SLAVE mode 下mclk和bclk由外部codec提供,自身不需要产生相同频率的时钟,但是如果自身模块时钟太慢,就会导致对输入的时钟采样时出现延迟,所以最后发送的数据会出现移位现象,因此需要把模块时钟分频设得尽可能小一些,以一个较高的频率采样输入时钟,才能保证输出数据比较小的延迟
注意:这样改的前提是使用的是SLAVE mode,如果是MATER mode需要改回来,或者可以在进这个函数前加个判断是否是slave之类的。

L-KAYA
Posts: 22
Joined: Thu Aug 12, 2021 3:44 am

Re: ESP32C3何时发布支持I2S的版本?

Postby L-KAYA » Mon Aug 16, 2021 7:54 am

henryli wrote:
Thu Aug 12, 2021 9:17 am
最新master分支支持了i2s。但是在使用中发现以下两个问题:
1. 不支持SLAVE模式下的全双工
2. 不支持SLAVE模式下的MONO格式,只能STETEO
至于第二个问题,mono模式还在确认用法中,后面版本会解决该问题

Who is online

Users browsing this forum: No registered users and 77 guests