I²S 协议详解
I2S
I²S 核心原理(把位流变成样本)
1) 三根关键线
-
WS / LRCLK(“字选择”/左右声道时钟)
频率 = 采样率 $f_s$。WS 低=Left、高=Right(标准 I²S 约定)。每个 WS 半周期称为一个“槽位/slot”(一个声道的样本)。 -
BCLK / SCK(位时钟)
每个 bit 的节拍。频率$$
f_{\text{BCLK}} = f_s \times \text{slot_bits} \times \text{channels}
$$例:48 kHz、32 bit 槽、立体声 → 3.072 MHz。
-
SD(数据线)
MSB 先行;在 WS 翻转后的第 1 个 BCLK 才输出 MSB(I²S 特有“1 位延迟”)。未被选中的声道时,很多数字麦 SD 三态(Hi-Z)。
一帧(frame)= Left 槽 + Right 槽 = 1 个采样时刻;帧时长 $T_{\text{frame}} = 1/f_s$。
2) “有效位数” vs “槽位宽度”
- 有效位数:器件实际的样本精度(例如数字麦 24 bit PCM)。
- 槽位宽度 slot_bits:总线为每个声道传输的位数(常设 32 bit,便于对齐/DMA)。
- 常见做法:24 bit 有效数据放在 32 bit 槽的高 24 位,低 8 位补 0。接收后取高 24 位并符号扩展即可。
与采样率的关系(算清楚“时钟/时延/吞吐”)
- WS 频率:$f_{\text{WS}} = f_s$
- BCLK 频率:$f_{\text{BCLK}} = f_s \times \text{slot_bits} \times \text{channels}$
- 一帧时长:$T_{\text{frame}} = 1/f_s$
- 一次读取 N 个样本的窗口时长:$T_{\text{buffer}} = N/f_s$
例:$f_s=48\text{kHz}, N=256 \Rightarrow 5.33\text{ms}$