I2S (Inter-IC Sound veya Integrated Interchip Sound), 1986 yılında Philips Semiconductors (günümüzde NXP) tarafından dijital ses verilerini entegre devreler arasında iletmek için geliştirilmiş senkron seri bir haberleşme standardıdır. I2C ile sıkça karıştırılsa da tamamen farklı bir amaca hizmet eder: I2C genel kontrol verileri taşırken, I2S yüksek kaliteli, kesintisiz ve gerçek zamanlı dijital ses (PCM) transferi için tasarlanmıştır. Mikrokontrolcüler, DSP'ler, DAC (Dijital-Analog Dönüştürücü), ADC (Analog-Dijital Dönüştürücü) ve dijital mikrofonlar (MEMS) arasında standart iletişim protokolüdür.

I2S protokolü, ses verilerini saat sinyallerinden ayırarak ilettiği için zamanlama sapmalarını (jitter) ve buna bağlı oluşan ses bozulmalarını minimuma indirir. Standart bir I2S veriyolu en az 3 temel sinyal hattından oluşur (opsiyonel olarak 4. bir ana saat hattı eklenebilir):
Örnekleme Hızı × Kanal Sayısı × Bit Derinliği formülüyle hesaplanır (Örn: 44.1 kHz × 2 × 16 bit = 1.4112 MHz).Aşağıdaki tablo, 16-bit çözünürlükteki stereo bir ses verisinin I2S hattından iletim mantığını özetlemektedir:
| Sinyal Hattı | Sol Kanal (Left Channel) | Sağ Kanal (Right Channel) |
|---|---|---|
| WS / LRCK Durumu | LOW (0) Seviyesinde |
HIGH (1) Seviyesinde |
| Data (SD) Sıralaması | MSB, Bit 14, ..., LSB (Sol Ses Örneği) | MSB, Bit 14, ..., LSB (Sağ Ses Örneği) |
| SCK Darbe Sayısı | 16 / 24 / 32 Saati Darbesi | 16 / 24 / 32 Saati Darbesi |

Aşağıdaki örnekte ESP32'nin dahili I2S donanımı kullanılarak dışarıdaki bir MAX98357A (I2S Class-D Amfi / DAC) modülüne 44.1 kHz örnekleme hızında 16-bit stereo sinüs dalgası üretilip basılmaktadır:
#include <Arduino.h>
#include "driver/i2s.h"
// I2S Pin Tanımlamaları
#define I2S_BCLK_PIN 26 // Bit Clock
#define I2S_LRCK_PIN 25 // Word Select / Left Right Clock
#define I2S_DOUT_PIN 22 // Serial Data Out
#define I2S_NUM I2S_NUM_0
#define SAMPLE_RATE 44100
#define WAVE_FREQ 440.0 // 440 Hz (La Notası)
#define PI_2 6.28318530718
void setupI2S() {
// 1. I2S Konfigürasyon Yapısı
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), // Master Verici Modu
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // Stereo (Sol/Sağ)
.communication_format = I2S_COMM_FORMAT_STAND_I2S, // Standart Philips I2S
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 8,
.dma_buf_len = 64,
.use_apll = false
};
// 2. I2S Pin Konfigürasyonu
i2s_pin_config_t pin_config = {
.bck_io_num = I2S_BCLK_PIN,
.ws_io_num = I2S_LRCK_PIN,
.data_out_num = I2S_DOUT_PIN,
.data_in_num = I2S_PIN_NO_CHANGE
};
// Sürücüyü Yükle ve Pinleri Atama
i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
i2s_set_pin(I2S_NUM, &pin_config);
}
void setup() {
Serial.begin(115200);
setupI2S();
Serial.println("I2S Ses Sürücüsü Başlatıldı. 440 Hz Ton Üretiliyor...");
}
void loop() {
// 440 Hz Sinüs Dalgası Örnekleri Oluştur ve DMA Üzerinden I2S'e Bas
int16_t sampleBuffer[128]; // Sol ve Sağ kanal örnekleri için tampon
static float phase = 0.0;
float phaseIncrement = (PI_2 * WAVE_FREQ) / SAMPLE_RATE;
for (int i = 0; i < 64; i++) {
int16_t val = (int16_t)(sin(phase) * 10000.0); // Ses seviyesi genliği
sampleBuffer[i * 2] = val; // Sol Kanal
sampleBuffer[i * 2 + 1] = val; // Sağ Kanal
phase += phaseIncrement;
if (phase >= PI_2) phase -= PI_2;
}
size_t bytesWritten;
// Kesintisiz veri iletimi için DMA Tamponuna Yaz
i2s_write(I2S_NUM, sampleBuffer, sizeof(sampleBuffer), &bytesWritten, portMAX_DELAY);
}
| Özellik | I2S | I2C | PDM (Pulse Density Mod.) | S/PDIF |
|---|---|---|---|---|
| Kullanım Amacı | Ham Dijital Ses Verisi Transferi | Komut ve Kontrol Verisi | Dijital Mikrofon Sinyali | Tüketici Ses Cihazları (Optik/Koaksiyel) |
| Hat Sayısı | 3 - 4 Tel | 2 Tel (SDA, SCL) | 2 Tel (CLK, DATA) | 1 Tel (Tek Yönlü) |
| Veri Formatı | PCM (Paralel Sözcük / Seri Bitten) | Bayt Odaklı Paketler | 1-bit Aşırı Örneklenmiş Akış | S/PDIF Kodlanmış Çerçeve |
| Mesafe | < 10-20 cm (Devre Kartı İçi) | < 1-2 Metre | < 10 cm | 10 Metreye kadar |
| İşlemci Yükü | Çok Düşük (DMA ile doğrudan beslenir) | Düşük | Orta (Decimation filtresi gerekir) | Düşük |
Henüz yorum yapılmamış. İlk yorumu siz yapın!