S/PDIF 与 I2S 数字音频接口:biphase 编码、子码与时钟恢复
更新时间:2026-09-19。前置:PWM/PDM 低成本 DAC、DDS 相位累加器、数字 PLL。芯片内部/板间传数字音频常见 I2S(多线、有独立时钟);设备之间(光纤/同轴)常用只靠一根线、时钟自嵌入的 S/PDIF。
本文要回答的问题
- S/PDIF 只有一根线,接收端怎么知道采样时钟?
- biphase mark 编码怎样把时钟和数据放一起?
- 192 帧音频块、B/M/W 前导码和 V/U/C 位是什么?
- 接收端为什么要 PLL,和 I2S 多线时钟有何区别?
一、I2S 与 S/PDIF 的定位
- I2S/TDM(板内):至少 BCLK(位时钟)、LRCK/FS(左右声道/帧)、DATA 三根线,时钟由主机单独提供,接收端不需自己恢复时钟,简单。
- S/PDIF(设备间,IEC 60958):单根线(同轴电或 TOSLINK 光纤),没有独立时钟线,时钟信息嵌入数据流,接收端从跳变中恢复。AES/EBU 是专业版(平衡、不同电平和子码语义),编码同源。
二、Biphase Mark 编码(核心)
普通串口直接发 0/1 电平,长串 0 或 1 会没有跳变,接收端无法恢复时钟。S/PDIF 用双相标记编码(BMC/Biphase Mark Code):
- 把 1 位时间(unit interval)分成两半。
- 每个位单元边界总有一次跳变。
- 若该数据位是 1:位单元中间再跳变一次;是 0:中间不跳变。
bash
数据: 0 0 1 1
┌───┐ ┌───┐ ┌─
电平 │ │ │ │ │
──┘ └─────┘ └───┘
边界跳 │边界│边界│边界
中间无(0) 中间有(1)这样无论数据是什么,每一位至少有一次跳变,接收端可以持续恢复时钟(类似 8b/10b 保证跳变密度,但 BMC 是固定 2 倍码率)。直流平衡也好(适合变压器耦合/光纤)。代价是线路符号率是数据率的 2 倍。
三、帧结构与前导码
- 每个音频采样构成一帧:左(A/通道 1)和右(B/通道 2)两个子帧(subframe)。
- 一帧 64 个时隙(两个 32 时隙子帧);192 帧 = 一个音频块(audio block)。
- 每个子帧结构:
bash
[前导码 4bit][辅助/音频 24bit][V][U][C][P]
4 24 位音频(高位对齐,前面可为辅助位) 4 个状态位- 前导码(preamble):故意违反 biphase 规则的特殊图案,用于子帧同步,三种:
- B(或 X):标识通道 A 左声道,且是一个 192 帧块的开始(块起始最重要,接收靠它对齐块、定位通道状态)。
- M(或 Y):标识通道 A(非块首)。
- W(或 Z):标识通道 B(右声道)。 因为它们不遵循正常 biphase 编码,接收端能在码流里唯一识别并对齐帧。
- 四个状态位(每子帧 1 位,累积 192 帧成块字段):
- V(Validity):该样本是否有效(0=PCM 有效;如置 1 表示非音频/无效,接收可静音,常见于压缩数据流标记)。
- U(User):用户数据位。
- C(Channel Status):通道状态,192 位成一块,携带采样率、量化位数、消费者/专业、版权、音频/数据(如 AC3/DTS 的 IEC 61937 压缩标记)等关键信息。
- P(Parity):偶校验,使子帧含偶数个 1,供检错。
四、发送器与接收器
发送器:
- 接收/内部生成 PCM 样本(通常来自 I2S),按块插入前导码、附加 V/U/C/P,做 biphase mark 编码后从单引脚输出(同轴经驱动/变压器,光纤经 LED 驱动)。
- 输出码率 = 采样率 × 64(时隙/帧)× 2 声道 × 2(biphase);48kHz 时约 6.144MHz 跳变率。
接收器(关键是时钟恢复):
bash
单路 BMC 码流
→ 过采样/边沿检测识别 biphase 单元
→ 数字/模拟 PLL 锁定码率、恢复位时钟(见全数字 PLL)
→ 检测违例前导码(B/M/W)做子帧/块/左右对齐
→ 解码音频、读 V/U/C/P、校验 parity
→ 重建成 I2S 风格输出(BCLK/LRCK/DATA)或送入内部音频- 必须有 PLL 从跳变中恢复与发送端同频同相的时钟,因为 S/PDIF 没有独立时钟(对比 全数字 PLL、时钟监控)。接收时钟质量(jitter)直接影响音质和重采样。
- 锁相丢失(静音/拔线)要有状态标志并静音输出(防噪声);通道状态块对齐前不能正确解读采样率/格式。
五、应用与压缩流
- 普通 PCM:V=0,通道状态标明 PCM、采样率(44.1/48/96k)、字长。
- IEC 61937 透传:把 AC3/DTS 等压缩帧塞进 S/PDIF,通道状态标记「非 PCM/数据」且 V 位按规范使用,接收端不解成音频而送解码器。
六、常见的坑
- 当普通串口用:忽略 biphase,直接读电平;必须 BMC 解码。
- 极性反接:BMC 某些极性反相仍可解,但实现若固定极性会乱码;应靠前导码和跳变自动识别。
- 不做时钟恢复/PLL:用本地固定时钟采样,两端采样率微小差异导致爆音/漂移;必须 PLL 锁定。
- 前导码识别错:把正常 biphase 误判或漏检块首 B,左右声道颠倒、块对齐失败。
- 忽略通道状态:不读 C 位,采样率/字长/PCM 与压缩流判断错(把压缩数据当 PCM 放噪声)。
- V 位不看:无效样本仍播放,产生杂音。
- parity 不校验:线路错误样本被当作有效音频。
- 失锁不静音:拔线/锁定丢失瞬间输出垃圾样本,应有软静音/淡变。
- 过采样率太低:恢复位时钟需要数倍于码率的本地时钟(常用 10× 以上)才能判决半单元。
- 光纤与同轴电平差异:同轴 75Ω/0.5Vpp、TOSLINK 光调制,直接混接电平不当。
- 左右/块索引错:192 帧块的 C/U 位累积错位,通道状态解读错位。
- 收发同时钟域假设:接收恢复时钟和系统时钟异步,要正确跨时钟域交接(见 CDC)。
相关与延伸
板内多线音频见 PWM/PDM DAC;自同步编码对比见 SerDes/8b10b;接收时钟恢复见 全数字 PLL;恢复时钟跨域见 CDC 基础。
总结
S/PDIF 用单线传输数字音频并靠 biphase mark 编码把时钟嵌入数据——每位单元边界必有跳变、数据 1 时中间再跳一次,使接收端从跳变密度经 PLL 恢复位时钟;数据以「带 B/M/W 三种违例前导码的 32 时隙子帧、左右两子帧成一帧、192 帧成一块」组织,每子帧含 24 位样本和 V(有效性)/U(用户)/C(192 位累积的通道状态,标明采样率、字长、PCM 或压缩流)/P(偶校验);接收器在过采样解码后靠违例前导码对齐块和左右声道、校验 P、读 C/V,再重建成 I2S 输出并在失锁时静音——它与有独立 BCLK/LRCK 的 I2S 的根本区别是必须做时钟恢复,极性、前导码块对齐、通道状态和失爆静音是四大常见坑。