I2S (Inter-IC Sound) Protocol
2025. 2. 28. 01:29ㆍEmbedded 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를 활용하여 고품질 오디오 데이터를 처리할 수 있습니다. 🎶🚀
'Embedded Development' 카테고리의 다른 글
Using Git Bash: Clone, Modify, and Push Code to a Repository (0) | 2025.04.25 |
---|---|
I2C / UART / SPI / CAN 통신 프로토콜 비교 (0) | 2025.02.22 |
Linux debugging command (리눅스 디버깅 커맨드) (0) | 2025.02.22 |