Перейти к содержанию

Как подключить I²S-микрофон к ESP32?

Обновлено Редакция GAW

Цифровой MEMS-микрофон с выходом I²S сам оцифровывает звук и отдаёт 24-битные отсчёты. Микроконтроллер для него — ведущий: выдаёт такт SCK и сигнал выбора канала WS и читает данные с линии SD. Разберём на примере TDK ICS-43434 и драйвера I2S из ESP-IDF v6.1.

Подключение

Вывод микрофонаКудаЗачем
VDD3,3 Вдопустимо 1,65–3,63 В
GNDGND
SCKлюбой свободный GPIO ESP32, выходтакт битов, 64 такта на кадр
WSGPIO, выходвыбор канала, частота = fs
SDGPIO, вход, подтяжка 100 кОм к GNDданные, в третьем состоянии вне своего слота
LRGNDданные в левом слоте; на VDD — в правом

MCLK микрофону не нужен, в настройке его оставляют I2S_GPIO_UNUSED (зачем MCLK кодекам — в термине «MCLK в I²S»).

Настройка в ESP-IDF

#include "driver/i2s_std.h"

i2s_chan_handle_t rx;
i2s_chan_config_t chan = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER);
i2s_new_channel(&chan, NULL, &rx);

i2s_std_config_t std = {
  .clk_cfg  = I2S_STD_CLK_DEFAULT_CONFIG(48000),
  // Philips format, 32-bit slots -> 64 SCK per frame, left slot only (LR = GND)
  .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_MONO),
  .gpio_cfg = { .mclk = I2S_GPIO_UNUSED, .bclk = GPIO_NUM_26, .ws = GPIO_NUM_25,
                .dout = I2S_GPIO_UNUSED, .din = GPIO_NUM_33 },
};
std.slot_cfg.slot_mask = I2S_STD_SLOT_LEFT;
i2s_channel_init_std_mode(rx, &std);
i2s_channel_enable(rx);

int32_t buf[256];
size_t got;
i2s_channel_read(rx, buf, sizeof(buf), &got, portMAX_DELAY);
for (size_t i = 0; i < got / 4; i++) {
  int32_t sample = buf[i] >> 8;   // 24-bit two's complement in the top bits
}

Формат Philips выбран потому, что у ICS-43434 старший бит задержан на один такт SCK от начала полукадра — это и есть стандартный I²S. Сдвиг следует из формата самого микрофона: в полукадре 32 такта SCK (64 на кадр), а слово данных — 24 бита в дополнительном коде, старшим вперёд, сразу после этой задержки. После младшего бита SD переходит в третье состояние, и подтяжка 100 кОм к земле, которую рекомендует TDK, даёт в оставшихся тактах нули. При 32-битном слоте 24 бита данных оказываются выровнены к старшим разрядам, а младшие 8 бит — нули, поэтому отсчёт получают арифметическим сдвигом на 8, сохраняющим знак дополнительного кода. Примечание ESP-IDF о выравнивании 24-битных данных по старшим разрядам этому соответствует.

Первые 20 мс после включения микрофон по даташиту ещё не вышел на чувствительность — их отбрасывают. Как перевести отсчёты в децибелы звукового давления и почему микрофон может молчать, разобрано в статье «Микрофоны для микроконтроллера».

Похожие вопросы

Почему отсчёты огромные или скачут на ±8 миллионов?

Это 24-битное число в дополнительном коде, лежащее в старших битах 32-битного слова. Если взять слово как есть, значения будут в 256 раз больше; если сдвинуть беззнаково — потеряется знак. Используйте int32_t и арифметический сдвиг: sample = word >> 8.

Какую частоту дискретизации выбрать?

Для качества ICS-43434 работает в режиме высокого качества при 23–51,6 кГц, например 44,1 или 48 кГц. Ниже 18,75 кГц он переходит в режим малого потребления, а ниже 3,125 кГц засыпает и молчит. Тактовая SCK = 64 · fs: при 48 кГц это 3,072 МГц, период 326 нс — в пределах 303–2500 нс из даташита (наш расчёт).

Можно ли подключить два микрофона для стерео?

Да: у одного LR на землю, у другого на питание, выводы SD соединяют вместе. Микрофон выдаёт данные только в своём слоте, а в остальное время его SD в третьем состоянии. В ESP-IDF тогда выбирают стерео-режим слота.

Источники

  1. TDK InvenSense. ICS-43434 Multi-Mode Microphone with I²S Digital Output, DS-000069 Rev 1.2 — питание 1,65–3,63 В; чувствительность −26 дБFS ±1 дБ при 94 дБ SPL; режимы: сон при fS ниже 3,125 кГц, малое потребление 6,25–18,75 кГц, высокое качество 23–51,6 кГц; период SCK 303–2500 нс; выход в пределах 1 дБ через 20 мс после включения или выхода из сна; вывод LR: 0 — левый канал, 1 — правый; формат — I²S, 24 бита, дополнительный код, старшим вперёд, MSB задержан на один такт SCK; в кадре WS должно быть 64 такта SCK; SD переходит в третье состояние сразу после младшего бита, два микрофона можно соединить по SD для стерео; на линии SD рекомендуется резистор 100 кОм к земле, чтобы разряжать её, пока все микрофоны в третьем состоянии
  2. Espressif. ESP-IDF Programming Guide v6.1 (ESP32): Inter-IC Sound (I2S) — режим STD: форматы Philips, MSB и PCM, вспомогательные макросы I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG, I2S_STD_CLK_DEFAULT_CONFIG; пример приёма: i2s_new_channel, i2s_channel_init_std_mode, i2s_channel_enable, i2s_channel_read; slot_mode — моно или стерео, slot_mask — левый или правый слот; примечание для ESP32: при 8- и 24-битных данных принятые отсчёты выровнены по 2 или 4 байта, полезные биты — старшие 8 или 24, в моно 8 и 16 бит пары отсчётов переставлены

Нашли ошибку?