• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP32 S3 + INMP441 (нужна помощь)

Помогите запустить связку 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);
}
}
 
Сверху Снизу