置顶

番摊机器人 连接片内 DAC/ADC、外接音频 Codec、或与其他主控芯片进行音频数据交互

作者:admin | 分类:番摊机器人 | 浏览:3 | 日期:2026年09月07日

 杰理(Jieli)系列芯片(如 AC696N、AD15N、AC63xx 等)的 **I2S(Inter-IC Sound)外设** 是

专门用于高速串行数字音频传输的硬件模块,常用于连接片内 DAC/ADC、外接音频 Codec、或与其

他主控芯片进行音频数据交互。


以下从硬件架构、时钟系统、数据流和软件配置四个维度说明其工作原理:


---


### 1. 硬件架构与信号线

杰理芯片的 I2S 外设通常包含 **2~3 组独立接口**(如 `IIS0`、`IIS1`、`IIS2`),每组至少包含以下信号:


| 信号 | 说明 |

|------|------|

| **BCLK** (SCK) | 位时钟,每个数据位对应一个时钟周期 |

| **LRCLK** (WS) | 帧时钟(字选择),区分左右声道,频率 = 采样率 Fs |

| **DATA_OUT** (SDO) | 发送数据线(TX) |

| **DATA_IN** (SDI) | 接收数据线(RX) |

| **MCLK** | 主时钟(部分型号支持),通常为 256×Fs 或 512×Fs,供外接 Codec 使用 |


> **注意**:部分杰理芯片的 I2S 与内置 DAC/ADC 有硬连线映射,也可通过 IO 映射(MUX)功能将 

I2S 引脚复用到任意 GPIO。


---


### 2. 工作模式(Master / Slave)

杰理 I2S 支持两种工作模式,由寄存器位 `MS`(Master/Slave)控制:


- **Master 模式(常用)**:  

  芯片内部的音频 PLL 产生 BCLK 和 LRCLK,外接 Codec 或功放作为 Slave 接收时钟。杰理 SDK 中播放

/录音通常采用此模式。


- **Slave 模式**:  

  I2S 外设接收外部提供的 BCLK 和 LRCLK,仅同步收发数据。适用于杰理芯片作为蓝牙从设备接收外部

主控音频流的场景。


---


### 3. 时钟系统与采样率

时钟路径通常为:

```

Audio PLL → 时钟分频器 → MCLK / BCLK / LRCLK

```


关键参数关系:

- **LRCLK** = 采样率 Fs(如 44.1kHz、48kHz)

- **BCLK** = 2 × Fs × 采样位宽(如 16bit 立体声时,BCLK = 32×Fs;24bit 时 BCLK = 48×Fs)

- **MCLK**(若输出)= 256×Fs 或 384×Fs 等,需匹配外接 Codec 要求


在杰理 SDK 中,你通常只需设置目标采样率(如 `44100`)和数据格式,时钟分频由底层驱动自动计算并配置 PLL。


---


### 4. 数据格式与帧结构

杰理 I2S 一般支持以下标准格式(通过 `FMT` 字段配置):


1. **I2S Philips 标准**(默认):  

   LRCLK 翻转后,数据在 BCLK 第二个边沿开始,有 1 位延迟。

2. **MSB/左对齐(Left Justified)**:  

   数据与 LRCLK 边沿对齐,无延迟。

3. **LSB/右对齐(Right Justified)**:  

   数据靠 BCLK 帧末尾对齐,常见于日韩系 Codec。

4. **DSP/PCM 模式**:  

   短帧同步(1 个 BCLK 周期)或长帧同步,适合蓝牙通话等场景。


数据位宽支持 **16bit、20bit、24bit、32bit**,实际存储时通常按 16bit 或 32bit 对齐放入 FIFO。


---


### 5. 数据缓冲与 DMA 传输

这是杰理 I2S 高效工作的核心:


#### 5.1 FIFO

每组 I2S 内置 **TX FIFO** 和 **RX FIFO**(深度通常为 16~32 级)。  

- **发送**:CPU 或 DMA 向 TX FIFO 填数,I2S 控制器按 BCLK 串行移出。  

- **接收**:串行数据逐位组装成并行字,压入 RX FIFO,触发 CPU 中断或 DMA 请求。


#### 5.2 DMA(推荐方式)

杰理芯片的 DMA 控制器通常支持 **链式 DMA(Linked List)** 或 **环形缓冲区(Circle Buf)**:

- 播放时:DMA 自动从 RAM 中的音频缓冲区搬运数据到 I2S TX FIFO,FIFO 低于阈值时自动请求 DMA。

- 录音时:DMA 将 RX FIFO 数据搬运到指定 RAM 区域,半满/全满时产生中断通知 CPU 处理。


这种方式下,CPU 仅在 DMA 中断时处理缓冲区切换,无需频繁介入每个采样点。


---


### 6. 杰理 SDK 中的典型软件流程

以杰理通用 SDK(如 AC696N)为例,I2S 的使用通常封装在 `iis.h` / `audio_dev.c` 中,典型初始化流程如下:


```c

// 1. 开启 I2S 模块时钟

clk_enable(CLK_IIS);


// 2. 配置 I2S 参数结构体

iis_param_t param = {

    .channel     = IIS_CHANNEL_0,    // 选择 IIS0

    .mode        = IIS_MODE_MASTER,  // 主机模式

    .fmt         = IIS_FMT_STANDARD, // Philips I2S 标准

    .sample_rate = 44100,            // 44.1kHz

    .bit_width   = 16,               // 16bit 采样

    .dma_enable  = true,             // 使能 DMA

};


// 3. 初始化并打开 I2S 接口

iis_init(&param);

iis_open(IIS_CHANNEL_0);


// 4. 配置 DMA 缓冲区

dma_cfg_t dma_cfg = {

    .src_addr = audio_buffer,        // 音频数据源(RAM)

    .dst_addr = IIS0_TX_FIFO_ADDR,   // I2S TX FIFO 地址

    .len      = BUFFER_SIZE,

    .callback = iis_dma_isr,         // 半满/全满中断回调

};

dma_start(DMA_CHANNEL_IIS_TX, &dma_cfg);


// 5. 启动传输

iis_start(IIS_CHANNEL_0);

```


**录音流程**类似,只需将 DMA 方向设为 `PERIPH_TO_MEM`,源地址设为 `IIS0_RX_FIFO_ADDR`。


---


### 7. 内置 DAC/ADC 与 I2S 的关系

在杰理蓝牙音频芯片中,有一个常见概念:**内置音频通路** vs **I2S 外接通路**。


- 如果使用芯片 **内置 DAC**,SDK 通常会将 I2S 内部环回(Loopback)到片内 DAC,你听到的声音

实际上经过 `RAM → DMA → I2S → 内置 DAC`,此时 I2S 引脚可以不引出。

- 如果 **外接 Codec**(如 ES8388、AC107),则需要将 I2S 引脚映射到 GPIO,并额外通过 I2C 配置

外接 Codec 的寄存器。


---


### 8. 调试要点与常见坑

1. **时钟抖动(Jitter)**:如果外接高品质 DAC,注意杰理芯片的 Audio PLL 配置,确保 MCLK 低抖动,

否则影响信噪比。

2. **位宽对齐**:24bit 音频在 32bit FIFO 中通常需要左对齐(高 24 位有效,低 8 位补 0),否则会出现

爆音。

3. **DMA 缓冲区大小**:蓝牙音频建议 DMA 缓冲区至少覆盖 10~20ms 音频(如 44100/16bit/立体声 

≈ 1.76KB/10ms),防止蓝牙跳频导致的中断延迟引起断音。

4. **主从切换时序**:Slave 模式下,务必确保外部 BCLK/LRCLK 已稳定后再使能 I2S 接收,否则帧同步

错误会导致左右声道反转或噪声。


---


### 后续建议

你现在是在调试杰理芯片的 **内置音频播放**,还是要 **通过 I2S 外接独立的音频 Codec**?  

如果是后者,你目前遇到的是时钟配置问题(MCLK 出不来),还是 DMA 数据流异常(爆音、无声音)?

我可以针对具体场景给出寄存器排查思路或 SDK 代码片段。