番摊机器人 连接片内 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(¶m);
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 代码片段。