Valentinych
Member
Помогите запустить связку ESP32 S3 + пара INMP441.
Два MEMS микрофона сажаю на один I2S. L/R одного микрофона лежит на Gnd, второго - на Vcc.
С контроллера идет клок 1,024 МГц (GPIO12) и сигнал выбора микрофона WS - 16 кГц (GPIO13). Но на шине SD (GPIO8) - стабильные нули. Бьюсь несколько дней, результат нулевой. Подскажите, куда копать, где рыть, какие засады могут быть...
При этом, метео датчик BMP280+AHT20 (GPIO10,11) в этой же связке работает нормально.
Код инициализации I2S:
#include "i2s_mic.h"
#include <stdio.h>
#include "driver/i2s_std.h"
#include "driver/gpio.h"
#include "esp_check.h"
static i2s_chan_handle_t rx_chan = NULL;
void init_i2s(void) {
// 1. Конфигурация канала I2S (ESP-IDF 5.x)
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, NULL, &rx_chan));
// 2. Настройка стандарта Philips под тайминги INMP441
i2s_std_config_t std_cfg = {
.clk_cfg = {
.sample_rate_hz = 16000,
.clk_src = I2S_CLK_SRC_DEFAULT,
.mclk_multiple = I2S_MCLK_MULTIPLE_256, // Идеальные 1.024 МГц
},
.slot_cfg = {
.slot_mask = I2S_STD_SLOT_BOTH,
.data_bit_width = I2S_DATA_BIT_WIDTH_24BIT, // Читаем 24 бита звука
.slot_bit_width = I2S_SLOT_BIT_WIDTH_32BIT, // Физический слот — 32 бита
.slot_mode = I2S_SLOT_MODE_STEREO,
},
.gpio_cfg = {
.mclk = I2S_GPIO_UNUSED,
.bclk = I2S_SCK_GPIO,
.ws = I2S_WS_GPIO,
.dout = I2S_GPIO_UNUSED,
.din = I2S_SD_GPIO,
.invert_flags = {
.mclk_inv = false,
.bclk_inv = false,
.ws_inv = false,
},
},
};
// 3. Инициализация и включение режима I2S
ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_chan, &std_cfg));
ESP_ERROR_CHECK(i2s_channel_enable(rx_chan));
printf("I2S active (24-in-32 manual config): SCK=GPIO%d, WS=GPIO%d, SD=GPIO%d\n",
I2S_SCK_GPIO, I2S_WS_GPIO, I2S_SD_GPIO);
}
void read_i2s_samples(int32_t *buffer, size_t samples) {
size_t bytes_read = 0;
esp_err_t ret = i2s_channel_read(rx_chan, buffer, samples * sizeof(int32_t), &bytes_read, 1000);
if (ret != ESP_OK) {
printf("I2S read error: %d\n", ret);
}
}
Два MEMS микрофона сажаю на один I2S. L/R одного микрофона лежит на Gnd, второго - на Vcc.
С контроллера идет клок 1,024 МГц (GPIO12) и сигнал выбора микрофона WS - 16 кГц (GPIO13). Но на шине SD (GPIO8) - стабильные нули. Бьюсь несколько дней, результат нулевой. Подскажите, куда копать, где рыть, какие засады могут быть...
При этом, метео датчик BMP280+AHT20 (GPIO10,11) в этой же связке работает нормально.
Код инициализации I2S:
#include "i2s_mic.h"
#include <stdio.h>
#include "driver/i2s_std.h"
#include "driver/gpio.h"
#include "esp_check.h"
static i2s_chan_handle_t rx_chan = NULL;
void init_i2s(void) {
// 1. Конфигурация канала I2S (ESP-IDF 5.x)
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER);
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, NULL, &rx_chan));
// 2. Настройка стандарта Philips под тайминги INMP441
i2s_std_config_t std_cfg = {
.clk_cfg = {
.sample_rate_hz = 16000,
.clk_src = I2S_CLK_SRC_DEFAULT,
.mclk_multiple = I2S_MCLK_MULTIPLE_256, // Идеальные 1.024 МГц
},
.slot_cfg = {
.slot_mask = I2S_STD_SLOT_BOTH,
.data_bit_width = I2S_DATA_BIT_WIDTH_24BIT, // Читаем 24 бита звука
.slot_bit_width = I2S_SLOT_BIT_WIDTH_32BIT, // Физический слот — 32 бита
.slot_mode = I2S_SLOT_MODE_STEREO,
},
.gpio_cfg = {
.mclk = I2S_GPIO_UNUSED,
.bclk = I2S_SCK_GPIO,
.ws = I2S_WS_GPIO,
.dout = I2S_GPIO_UNUSED,
.din = I2S_SD_GPIO,
.invert_flags = {
.mclk_inv = false,
.bclk_inv = false,
.ws_inv = false,
},
},
};
// 3. Инициализация и включение режима I2S
ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_chan, &std_cfg));
ESP_ERROR_CHECK(i2s_channel_enable(rx_chan));
printf("I2S active (24-in-32 manual config): SCK=GPIO%d, WS=GPIO%d, SD=GPIO%d\n",
I2S_SCK_GPIO, I2S_WS_GPIO, I2S_SD_GPIO);
}
void read_i2s_samples(int32_t *buffer, size_t samples) {
size_t bytes_read = 0;
esp_err_t ret = i2s_channel_read(rx_chan, buffer, samples * sizeof(int32_t), &bytes_read, 1000);
if (ret != ESP_OK) {
printf("I2S read error: %d\n", ret);
}
}