Konfigurasi audio ESP32 dapat terlihat seperti sekumpulan definisi GPIO biasa:

const uint8_t I2S_MCLK = 0;
const uint8_t I2S_SCK = 5;
const uint8_t I2S_WS = 25;
const uint8_t I2S_SDOUT = 26;
const uint8_t I2S_SDIN = 35;

Kelima konstanta tersebut bukan lima kabel audio yang dapat saling dipertukarkan. Masing-masing mewakili bagian berbeda dari timing dan jalur data I2S. Amplifier speaker dapat tetap diam meskipun seluruh GPIO sudah tersambung secara elektrik jika BCLK dan WS tidak ada, arah data terbalik, atau format frame tidak sesuai dengan perangkat penerima.

Cara yang lebih tepat untuk membaca pin map I2S adalah sebagai diagram routing sinyal.

I2S memisahkan clock dari data audio

Pada I2S standar, sample audio berjalan melalui serial data line, sedangkan clock terpisah memberi tahu receiver kapan setiap bit dan channel dimulai.

Koneksi ESP32 sebagai master umumnya terlihat seperti ini:

                    BCLK
ESP32  --------------------------------> audio device

                     WS
ESP32  --------------------------------> audio device

                    DOUT
ESP32  --------------------------------> DAC / amplifier

                     DIN
ESP32  <-------------------------------- digital microphone

                    MCLK
ESP32  --------------------------------> codec, jika diperlukan

Arah panah penting. DOUT dan DIN dinamai dari sudut pandang ESP32. DOUT adalah data yang keluar dari ESP32. DIN adalah data yang masuk ke ESP32.

Artinya, amplifier digital MAX98357A berada pada jalur transmit, sedangkan mikrofon INMP441 berada pada jalur receive.

BCLK mengatur clock setiap bit audio

Definisi seperti:

const uint8_t I2S_SCK = 5;

biasanya berarti GPIO 5 membawa I2S bit clock. Library dan datasheet menggunakan beberapa nama untuk sinyal yang sama, antara lain BCLK, BCK, dan SCK.

Setiap edge BCLK memajukan serial audio stream sebanyak satu bit. Frekuensinya bergantung pada sample rate, jumlah slot dalam setiap frame, dan lebar slot.

Untuk frame stereo konvensional dengan dua slot 32-bit pada 48 kHz:

BCLK = 48,000 × 2 × 32
     = 3,072,000 Hz

Sample rate audio adalah 48 kHz, tetapi bit clock mencapai 3,072 MHz karena setiap frame berisi 64 posisi bit serial.

Perbedaan ini penting pada INMP441. Interface I2S-nya menghasilkan sample two’s-complement 24-bit, tetapi timing bus membutuhkan 32 siklus SCK per channel dan 64 siklus SCK per stereo frame. Mengatur receiver hanya berdasarkan 24 bit sample yang bermakna dapat menghasilkan timing frame yang salah.

WS menentukan slot audio

const uint8_t I2S_WS = 25;

menetapkan GPIO 25 sebagai word select. Sinyal yang sama sering disebut WS, LRCLK, LRCK, atau left/right clock.

Pada I2S stereo standar, WS memisahkan dua slot channel. Frekuensinya biasanya sama dengan sample rate audio:

sample rate = 48 kHz
WS frequency = 48 kHz

WS tidak membawa audio. Sinyal ini menentukan slot mana yang sedang dikirim.

Hal ini sangat relevan untuk mikrofon I2S mono seperti INMP441. Pin L/R menentukan apakah mikrofon mengirim data pada slot kiri atau kanan. Software harus membaca slot yang sesuai. Membaca slot yang berlawanan dapat membuat mikrofon terlihat mati walaupun BCLK, WS, dan mikrofon sebenarnya bekerja.

SDOUT mengirim sample PCM ke amplifier

const uint8_t I2S_SDOUT = 26;

berarti GPIO 26 menjadi serial audio output dari ESP32.

Untuk MAX98357A, koneksinya secara konseptual adalah:

ESP32 I2S_SDOUT (GPIO 26) ---> MAX98357A DIN
ESP32 I2S_SCK   (GPIO 5)  ---> MAX98357A BCLK
ESP32 I2S_WS    (GPIO 25) ---> MAX98357A LRCLK

Penamaannya dapat membingungkan karena satu sisi menggunakan DOUT dan sisi lain DIN. Koneksi tersebut benar: output ESP32 masuk ke input amplifier.

MAX98357A menerima I2S standar melalui DIN, BCLK, dan LRCLK. Perangkat ini mendukung data I2S 16-, 24-, dan 32-bit dengan sample rate 8 kHz sampai 96 kHz. MAX98357A juga tidak membutuhkan MCLK eksternal.

Karakteristik terakhir penting saat mendiagnosis MAX98357A yang tidak bersuara. Menambahkan kabel MCLK bukan langkah pertama untuk perangkat ini; BCLK, LRCLK, data DIN, power, konfigurasi shutdown/channel, dan wiring speaker yang valid lebih relevan untuk diperiksa.

SDIN menerima sample dari mikrofon digital

const uint8_t I2S_SDIN = 35;

menetapkan GPIO 35 sebagai serial input pada konfigurasi board ini.

Untuk INMP441:

INMP441 SD  ---> ESP32 I2S_SDIN
ESP32 BCLK  ---> INMP441 SCK
ESP32 WS    ---> INMP441 WS

Mikrofon bertindak sebagai I2S slave. ESP32 menyediakan SCK dan WS, kemudian mikrofon menempatkan bit sample pada SD.

INMP441 mengirim sample two’s-complement 24-bit, MSB-first, dalam format I2S standar. Pada I2S standar, bit data paling signifikan tertunda satu clock setelah batas channel. Detail ini membuat pemilihan format Philips/I2S yang tepat pada driver ESP-IDF menjadi penting; konfigurasi MSB-justified menggunakan timing yang berbeda.

MCLK tidak selalu diperlukan

const uint8_t I2S_MCLK = 0;

berarti GPIO 0 dialokasikan sebagai master clock pada konfigurasi ini. Definisi tersebut tidak berarti semua perangkat I2S yang tersambung harus menggunakan sinyal itu.

MCLK adalah reference clock berfrekuensi lebih tinggi yang digunakan sebagian codec dan converter untuk menjalankan pemrosesan internal. ESP-IDF memperlakukan MCLK sebagai sinyal I2S opsional karena kebutuhannya ditentukan oleh peripheral yang terhubung.

Bus dapat bekerja dengan susunan seperti ini:

ESP32
  |
  +-- BCLK ----> MAX98357A
  +-- WS ------> MAX98357A
  +-- DOUT ----> MAX98357A
  |
  +-- BCLK ----> INMP441
  +-- WS ------> INMP441
  +<-- DIN ----- INMP441

tanpa koneksi MCLK ke kedua perangkat tersebut.

Aturannya bukan “I2S membutuhkan MCLK” atau “I2S tidak pernah membutuhkan MCLK.” Persyaratan clock harus mengikuti perangkat slave yang digunakan.

Pin I2C tidak membawa PCM stream

Project yang sama dapat memiliki konfigurasi berikut:

const uint8_t I2C_SCL = 23;
const uint8_t I2C_SDA = 18;
const uint32_t I2C_FREQ = 400000;

Definisi tersebut merupakan bus I2C, bukan jalur audio I2S.

SCL adalah I2C clock, SDA adalah bidirectional data line, dan 400000 menetapkan bus rate 400 kHz. Audio codec sering memakai I2C untuk control register sementara I2S membawa sample PCM, sehingga kedua interface sering muncul dalam project audio yang sama.

Fungsinya tetap terpisah:

I2C
SCL + SDA
    |
    +--> configuration, registers, control

I2S
MCLK/BCLK/WS + DIN/DOUT
    |
    +--> digital audio samples

MAX98357A maupun INMP441 tidak membutuhkan koneksi kontrol I2C untuk jalur data audio dasarnya.

Full-duplex I2S membutuhkan timing frame yang sama

ESP-IDF dapat mengalokasikan channel TX dan RX bersama-sama pada satu I2S controller. Ketika kedua channel bekerja full duplex dan berbagi BCLK serta WS, timing frame keduanya harus sama.

Syarat ini lebih ketat daripada sekadar menggunakan sample rate yang sama. Jumlah total bit per frame menentukan BCLK.

Sebagai contoh:

RX: 48 kHz × 2 slots × 32 bits = 3.072 MHz BCLK
TX: 48 kHz × 2 slots × 16 bits = 1.536 MHz BCLK

Keduanya bukan timing bus yang sama.

Loopback mikrofon-ke-speaker karena itu dapat gagal ketika RX dikonfigurasi sebagai stereo 32-bit dan TX sebagai stereo 16-bit, tetapi keduanya diharapkan bekerja sebagai satu bus full-duplex sinkron. Salah satu solusinya adalah menggunakan timing slot yang kompatibel pada bus bersama, kemudian mengubah presisi sample melalui software. Pilihan lain adalah menggunakan I2S controller atau clock terpisah ketika arsitektur hardware memang membutuhkan timing berbeda.

Representasi sample di memori dan jumlah periode clock pada kabel saling berkaitan, tetapi keduanya tidak seharusnya diubah secara terpisah tanpa memeriksa frame yang dihasilkan.

Debug speaker diam dari jalur output terlebih dahulu

Saat menguji MAX98357A, meneruskan data mikrofon melalui seluruh pipeline menciptakan terlalu banyak kemungkinan sumber masalah. Sinyal PCM deterministik merupakan pengujian awal yang lebih baik.

Jalur diagnosisnya:

known PCM samples
      |
      v
ESP32 TX buffer
      |
      v
I2S DOUT + BCLK + WS
      |
      v
MAX98357A
      |
      v
speaker

Sine wave yang dibuat langsung di ESP32 menghilangkan Wi-Fi, HTTP streaming, decoding MP3/AAC, pemilihan slot mikrofon, gain mikrofon, dan konversi RX dari pengujian.

Setelah sinyal tersebut menghasilkan suara, barulah jalur receive ditambahkan:

INMP441
   |
   v
I2S RX
   |
24/32-bit sample conversion
   |
   v
I2S TX
   |
   v
MAX98357A

Radio online berada pada tahap berikutnya. Radio stream menambahkan networking, buffering, penanganan container, dan biasanya decoding audio terkompresi sebelum PCM mencapai I2S. Kondisi diam pada tahap itu tidak cukup untuk mengisolasi masalah amplifier.

Nomor pin adalah konfigurasi board, peran sinyal adalah perilaku protokol

Perbedaan terpenting dalam tabel pin audio ESP32 adalah nomor GPIO fisik dan sinyal I2S yang ditempatkan pada GPIO tersebut.

GPIO 5  -> BCLK
GPIO 25 -> WS
GPIO 26 -> DOUT
GPIO 35 -> DIN
GPIO 0  -> MCLK, jika digunakan

Nomor GPIO tersebut menjelaskan satu desain hardware. Arti BCLK, WS, DOUT, DIN, dan MCLK menjelaskan bus.

Ketika jalur audio tidak menghasilkan suara, memeriksa peran sinyal terlebih dahulu lebih efektif daripada mengganti sample rate atau gain secara acak. Pastikan ESP32 menghasilkan clock yang diharapkan, data bergerak ke arah yang benar, format I2S dan slot sesuai dengan peripheral, serta timing frame TX dan RX kompatibel. Setelah kondisi tersebut terpenuhi, pemrosesan audio di lapisan atas memiliki transport yang dapat diandalkan.