I2S总线简介

I2S(Inter-IC Sound,集成电路内置音频总线)是由飞利浦公司(现 NXP 半导体)于 1986 年制定的同步串行通信协议,专门用于在集成电路之间高效传输PCM(脉冲编码调制)数字音频数据 ,现已成为音频设备间的工业标准。

只传输PCM的音频数据,不进行控制传输

核心组成:三线制信号架构

信号线 英文全称 中文名称 核心功能
SCK/BCLK Serial Clock/Bit Clock 串行时钟 / 位时钟 每一位数据对应一个时钟脉冲,频率 = 采样率 × 位深 × 声道数
WS/LRCLK Word Select/Left-Right Clock 字选择 / 左右声道时钟 指示当前传输声道(左 / 右),频率等于采样率(如 44.1kHz)
SD/DATA Serial Data 串行数据 传输 PCM 音频数据,高位优先(MSB first)传输
部分扩展配置还会增加 MCLK(主时钟)、SDIN/SDOUT(双向数据)等引脚。

二、工作原理:精准同步的音频传输机制

1. 主从架构

  • 主设备:提供 BCLK 和 LRCLK 时钟信号,通常为 MCU、DSP 或 CODEC
  • 从设备 :被动接收时钟并同步传输 / 接收数据,如 DAC、ADC 或数字麦克风
    主从设备可以是发送端也可以是接收端。当复杂系统中同时存在多个发送端和多个接收端时,则可以引入第三方主控制IC间的数据流向,如图所示

2. 数据传输时序

  1. LRCLK 信号上升沿 / 下降沿(依设备而定)切换声道
  2. 声道切换后,第一个 BCLK 脉冲 开始传输该声道数据的最高位(MSB)
  3. 每个 BCLK 脉冲传输 1 位数据,依次从高位到低位传输
  4. 一帧数据包含左声道完整数据 + 右声道完整数据
  5. 发射机发送的串行数据可以在时钟信号的下降沿(高到低)或者上升沿(低到高)进行同步。然而,串行数据必须在时钟的上升沿被接收机锁定接收,因此,在时钟上升沿传输的数据被同步时有一些限制

3. 数据格式特点

  • 支持多种位深:16 位、24 位、32 位等标准音频格式
  • 数据以高位优先方式传输,确保音频数据的完整性和时序准确性
  • 标准 I2S 采用 "左对齐""飞利浦格式",数据在 LRCLK 切换后延迟一个 BCLK 传输
1. 初始状态:左声道数据传输阶段
  • SCK:持续输出串行位时钟,每个周期对应一位数据的传输。
  • WS:保持低电平(假设低电平代表左声道),告知接收端当前传输的是左声道数据。
  • WSD:经两级 D 触发器同步后的 WS 信号,与 WS 同相位,但延迟了 2 个 SCK 周期。
  • WSP :由两级触发器输出异或得到,仅在 WS 边沿后产生一个窄脉冲,触发移位寄存器并行加载。
  • SD :在反相 SCK 驱动下,从移位寄存器中从 MSB 到 LSB逐位输出左声道音频数据,每一位都在 SCK 的指定边沿(通常是下降沿)稳定变化。

2. WS 边沿切换:声道切换触发
  • WS:电平由低变高(切换到右声道),这个跳变是异步的,可能出现在 SCK 的任意位置。
  • 第一级 D 触发器:在 SCK 的下一个上升沿,采样 WS 的新电平,输出延迟 1 个 SCK 周期的同步信号。
  • 第二级 D 触发器 :在再下一个 SCK 上升沿,采样第一级的输出,得到延迟 2 个 SCK 周期的WSD,彻底消除亚稳态。
  • WSP :两级触发器输出不同,异或门输出高电平,产生一个窄脉冲,这个脉冲会触发移位寄存器的并行加载(PL)。

3. 并行加载:载入右声道数据
  • PL(并行加载)WSP 脉冲到达后,移位寄存器停止移位,将右声道的并行数据完整载入。
  • DATA RIGHT 输出使能WSD 变为高电平,打开 DATA RIGHT 的输出使能(OE),右声道数据被送入移位寄存器输入端。
  • SD:在当前左声道数据的最后一位(LSB)传输完成前,保持左声道数据的输出,直到并行加载完成。

4. 右声道数据传输阶段
  • SCK:继续输出串行位时钟。
  • WS:保持高电平,告知接收端当前传输的是右声道数据。
  • SD :从下一个 SCK 周期开始,输出右声道数据的MSB,随后逐位输出到 LSB,传输顺序与左声道完全一致(MSB 优先)。
  • WSP :脉冲结束,回到低电平,移位寄存器恢复串行移位模式。
    对应上图I2S Transmitter FPGA 数据缓冲部分Verilog实现如下(豆包生成的,不确定能运行,但是了解Verilog思路就行了,也就那)
verilog 复制代码
// I²S 发送模块 - 对应你看到的电路图
module i2s_transmitter #(
    parameter DATA_WIDTH = 16  // 音频数据位宽(16/24/32)
)(
    input  wire         clk,        // 系统时钟(比如 100MHz)
    input  wire         sck,        // I²S 串行时钟(位时钟)
    input  wire         rst_n,      // 低电平复位
    input  wire         ws_in,      // 外部输入的 WS 信号(字选择)
    input  wire [DATA_WIDTH-1:0] left_data,  // 左声道并行数据(来自左FIFO)
    input  wire [DATA_WIDTH-1:0] right_data, // 右声道并行数据(来自右FIFO)
    output reg          sd_out,     // I²S 串行数据输出
    output reg          ws_out,     // 同步后的 WS 输出(WSD)
    output wire         wsp_pulse   // 并行加载脉冲(WSP)
);

// ----------------------
// 1. 两级 D 触发器同步 WS(消除亚稳态)
// ----------------------
reg ws_sync1, ws_sync2;
always @(posedge sck or negedge rst_n) begin
    if(!rst_n) begin
        ws_sync1 <= 1'b0;
        ws_sync2 <= 1'b0;
    end else begin
        ws_sync1 <= ws_in;    // 第一级同步
        ws_sync2 <= ws_sync1; // 第二级同步
    end
end
assign ws_out = ws_sync2;  // 同步后的 WSD 信号

// ----------------------
// 2. 生成 WSP 并行加载脉冲(异或两级同步输出)
// ----------------------
assign wsp_pulse = ws_sync1 ^ ws_sync2;

// ----------------------
// 3. 并行寄存器 + 多路选择器(选择左右声道)
// ----------------------
reg [DATA_WIDTH-1:0] parallel_reg;  // 并行寄存器(存当前帧数据)
always @(posedge sck or negedge rst_n) begin
    if(!rst_n) begin
        parallel_reg <= {DATA_WIDTH{1'b0}};
    end else if(wsp_pulse) begin  // WSP 脉冲触发并行加载
        // 根据同步后的 WS 选择左/右声道数据
        parallel_reg <= ws_out ? right_data : left_data;
    end
end

// ----------------------
// 4. 移位寄存器(并转串,MSB 优先)
// ----------------------
reg [DATA_WIDTH-1:0] shift_reg;    // 移位寄存器
always @(negedge sck or negedge rst_n) begin  // 反相 SCK 驱动移位
    if(!rst_n) begin
        shift_reg <= {DATA_WIDTH{1'b0}};
        sd_out    <= 1'b0;
    end else if(wsp_pulse) begin  // 并行加载时,把数据载入移位寄存器
        shift_reg <= parallel_reg;
        sd_out    <= parallel_reg[DATA_WIDTH-1]; // 先输出最高位 MSB
    end else begin  // 正常移位,一位一位输出
        shift_reg <= {shift_reg[DATA_WIDTH-2:0], 1'b0};
        sd_out    <= shift_reg[DATA_WIDTH-1];
    end
end

endmodule

同时,对应的I2S Transmitter FPGA 数据缓冲部分逻辑图如下

相关推荐
运维自动化&云计算2 个月前
修复chrome把mp4视频识别为音频、firefox不能加载mp4问题
服务器·前端·iis·mp4播放
net3m333 个月前
mic声音怎么才不容易卡顿 : 环形队列缓存要足够大
esp32·i2s
net3m333 个月前
24位INMP441的相关配置,原本是16位mic数据,麦克风音质不高
esp32·i2s
π同学3 个月前
ESP-IDF+vscode开发ESP32第八讲——音频信号全解
vscode·esp32·i2s·音频信号
余衫马4 个月前
在 IIS 部署 .NET6 WebApi 应用
运维·c#·iis·.net·发布
Terasic友晶科技4 个月前
2-DE10-Nano的HDMI音频传输案例——基于FPGA的I2S控制模块设计
fpga开发·音视频·i2s·de10-nano·hdmi音频传输
林鸿群5 个月前
Windows IIS 发布 ASP.NET 网站完整教程
iis·网站发布
一叶星殇6 个月前
IIS 部署 .NET 6 WebApi 实战指南(附优缺点分析)
iis·.net
未来之窗软件服务6 个月前
服务器运维(二十六)终端安全证书管控与IIS 服务器—东方仙盟练气期
运维·服务器·安全·iis·仙盟创梦ide·东方仙盟