I2S (Inter-IC Sound) Protocol

2025. 2. 28. 01:29Embedded Development

🎵 I2S (Inter-IC Sound) 통신 프로토콜

1️⃣ I2S란?

I2S(Inter-IC Sound)는 디지털 오디오 장치 간 직렬 통신을 위한 프로토콜입니다.
주로 DAC (Digital-to-Analog Converter), ADC (Analog-to-Digital Converter), DSP (Digital Signal Processor), 코덱, 마이크, 스피커 등의 오디오 장치에서 사용됩니다.

2️⃣ I2S의 특징

  • 디지털 오디오 전송에 특화
  • 마스터-슬레이브 구조
  • 3~4개의 신호선 사용 (간단한 하드웨어 구성)
  • 오디오 샘플링 주파수 및 데이터 폭 설정 가능 (16, 24, 32비트 등)
  • 동기식 (클럭 기반 통신, 데이터 손실 없음)

3️⃣ I2S 신호 라인

신호선 역할
BCLK (Bit Clock) 샘플 데이터를 클럭에 맞춰 전송
WS (Word Select, LRCLK) 좌/우 채널 전환 (0 = Left, 1 = Right)
SD (Serial Data) 오디오 데이터 전송
MCLK (Master Clock, 선택적) 고정 주파수의 클럭 (DAC/코덱에서 필요할 수도 있음)

📌 BCLK: 오디오 데이터의 비트 단위 전송 속도를 결정
📌 WS: 좌/우 채널 구분 (스테레오 오디오 지원)
📌 SD: 오디오 샘플 데이터 (PCM 방식)

4️⃣ I2S 데이터 프레임 구조

I2S는 일반적으로 16, 24, 32비트 오디오 샘플을 사용합니다.

📝 16비트 스테레오 오디오 (44100Hz) 예시

WS:  00000000000000001111111111111111 (L/R 채널 구분)
SD:  LLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRR (16-bit Left/Right 데이터)
  • WS가 0이면 왼쪽 채널
  • WS가 1이면 오른쪽 채널
  • SD에 오디오 데이터가 직렬 전송됨

5️⃣ I2S vs. 다른 오디오 인터페이스 비교

프로토콜 특징 데이터 전송 방식
I2S 디지털 오디오 전송 동기식 (클럭 기반)
I2C 저속 제어 인터페이스 직렬 (주소 기반)
SPI 빠른 직렬 통신 풀-이중 방식 지원
UART 범용 직렬 통신 비동기 방식 (스타트/스톱 비트)

6️⃣ I2S 예제 코드

🛠 ESP32에서 I2S 마이크 (INMP441) 데이터 수신

📜 I2S 설정 코드 (ESP32)

#include <driver/i2s.h>

#define I2S_WS  25  // Word Select (LRCLK)
#define I2S_SD  33  // Serial Data (DOUT)
#define I2S_SCK 32  // Bit Clock (BCLK)

void setup() {
    Serial.begin(115200);

    i2s_config_t i2s_config = {
        .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
        .sample_rate = 44100,   // 샘플링 레이트 (44.1kHz)
        .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, // 16비트 오디오 데이터
        .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, // 한쪽 채널만 사용
        .communication_format = I2S_COMM_FORMAT_I2S,
        .intr_alloc_flags = 0,
        .dma_buf_count = 8,
        .dma_buf_len = 512,
        .use_apll = false
    };

    i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);

    i2s_pin_config_t pin_config = {
        .bck_io_num = I2S_SCK,
        .ws_io_num = I2S_WS,
        .data_out_num = -1,
        .data_in_num = I2S_SD
    };

    i2s_set_pin(I2S_NUM_0, &pin_config);
}

void loop() {
    int16_t audio_data[256];
    size_t bytes_read;

    i2s_read(I2S_NUM_0, audio_data, sizeof(audio_data), &bytes_read, portMAX_DELAY);
    Serial.print("Audio Sample: ");
    Serial.println(audio_data[0]);
}

📜 I2S 데이터 읽기 (Raspberry Pi, Python)

import sounddevice as sd
import numpy as np

SAMPLE_RATE = 44100  # 샘플링 레이트
CHANNELS = 1  # 모노 채널
DURATION = 2  # 녹음 시간 (초)

def callback(indata, frames, time, status):
    if status:
        print(status)
    volume_norm = np.linalg.norm(indata) * 10
    print(f"Volume Level: {volume_norm}")

with sd.InputStream(samplerate=SAMPLE_RATE, channels=CHANNELS, callback=callback):
    sd.sleep(int(DURATION * 1000))

7️⃣ I2S 응용 분야

디지털 마이크 (MEMS, PDM to I2S 변환)
DAC (고품질 오디오 출력)
Bluetooth 스피커 (I2S 오디오 스트리밍)
FM/AM 라디오 튜너 (디지털 오디오 송수신)
헤드폰 및 오디오 앰프 (I2S 기반 오디오 처리)

🔥 결론

I2S는 디지털 오디오 전송에 최적화된 경량 프로토콜로, 오디오 장치 간 데이터를 저지연으로 교환할 수 있도록 설계되었습니다.
ESP32, Raspberry Pi, STM32 등에서 I2S를 활용하여 고품질 오디오 데이터를 처리할 수 있습니다. 🎶🚀