I2S 示例*
提示
- SDK 路径: http://gitlab.nationalchip.com/nationalchip/voice-wifi-solution/ovp_aiot
- App 路径: SDK 路径下 app/i2s_app/
- 适用芯片 8006
警告
- 8006 做 I2S Slave 时,使用 Aout 播放来自 Master 的音频仍存在问题。若有需求请联系国芯微支持调频功能。
- 目前仅推荐做主设备(Master)使用。
1. 概述*
I2S 音频收发示例 App,演示如何通过 I2S 总线与外部音频编解码器(Codec)通信。支持多种主/从模式组合,可独立配置 TX(发送)和 RX(接收)方向。麦克风音频通过 I2S TX 发送到外部 Codec,同时可通过 I2S RX 接收外部音频并播放。
2. 功能特性*
- 5 种工作模式可选择(TX Master、RX Slave、RX Master + TX Master、RX Slave + TX Slave、RX Slave + TX Slave Lite)
- TX 通路:自动将麦克风音频帧推送到 I2S DMA 发送
- RX 通路:接收 I2S 音频帧并路由到扬声器播放
- 可配置 RX 缓存(缓冲时长 × 帧数)
- 自动配置 SDM/ADC 时钟,支持回采
3. 目录结构*
app/i2s_app/
├── i2s_app.c # 主程序
├── app.mk # 编译配置
├── app.name # Kconfig 选项
├── Kconfig # 子配置(模式选择)
├── i2s/
│ ├── i2s.c # I2S 配置与初始化
│ ├── i2s.h
│ ├── i2s_rx.c # I2S 接收
│ ├── i2s_rx.h
│ ├── i2s_tx.c # I2S 发送
│ ├── i2s_tx.h
│ ├── i2s_types.h # 类型定义
│ ├── spk.c # 扬声器播放
│ └── spk.h
└── spk/
├── spk.c
└── spk.h
| 文件 | 作用 |
|---|---|
i2s_app.c |
主程序,根据 Kconfig 选择模式完成 I2S 初始化 |
i2s/i2s.c |
I2S 核心配置(时钟、引脚、格式) |
i2s/i2s_tx.c |
TX 发送逻辑,从麦克风环形缓冲区取数据发送 |
i2s/i2s_rx.c |
RX 接收逻辑,接收数据送入播放通路 |
i2s/i2s_types.h |
I2S 配置结构体 I2S_Config |
i2s/spk.c |
扬声器播放封装 |
4. 配置说明*
4.1 Kconfig 模式选择*
| 配置项 | 说明 |
|---|---|
APP_I2S_TX_M |
仅 TX,主模式 |
APP_I2S_RX_S |
仅 RX,从模式 |
APP_I2S_RX_M_TX_M |
RX 主 + TX 主 |
APP_I2S_RX_S_TX_S |
RX 从 + TX 从 |
APP_I2S_RX_S_TX_S_LITE |
RX 从 + TX 从(Lite 模式) |
4.2 宏定义*
#define I2S_RX_CACHE_MS 40 // RX 缓存时长(ms)
#define I2S_RX_FREME_NUM 4 // RX 缓存帧数
4.3 I2S 引脚映射*
| 信号 | 引脚 | 方向 | 说明 |
|---|---|---|---|
| MCLK | PAD 7 | 输出 | 主时钟 |
| BCLK | PAD 8 | 输出/输入 | 位时钟 |
| LRCLK | PAD 10 | 输出/输入 | 左右声道时钟 |
| DATA IN | PAD 5 | 输入 | I2S 数据接收 |
| DATA OUT | PAD 9 | 输出 | I2S 数据发送 |
4.4 I2S 参数*
- 采样率:16kHz
- BCLK:64FS(64 × 16kHz = 1.024MHz)
- 数据格式:I2S 标准格式
- PCM 位宽:16bit
- 存储位宽:16bit
5. 工作原理*
5.1 初始化流程*
- 使能
AUDPCLK、I2S时钟 - 配置引脚复用为 I2S 功能
- 调用
gx_i2s_init()初始化 I2S 硬件 - 根据所选模式调用对应的
i2s_config_xxx()配置 TX/RX - 配置 SDM/ADC 时钟源用于回采
5.2 TX 发送机制*
- 初始化时
i2s_tx_push_mic_frame()将首帧入队 - 后续帧由
_i2s_tx_cb()回调处理 - 回调遍历麦克风环形缓冲区,按帧大小推进读地址,必要时回绕
5.3 RX 接收机制*
_i2s_rx_cb() 接收 I2S 帧后通过 spk_put_frame() 送入扬声器播放通路。
5.4 事件处理*
app_event_response() 为空实现,所有数据传输由 DMA 中断驱动。
5.5 主循环*
app_task_loop() 为空实现。
6. 使用方法*
6.1 编译*
cp configs/example/app/8006_i2s_sample_app.config .config
make defconfig
make clean; make
或通过 menuconfig 选择模式和参数:
make menuconfig
# OVP Application Settings → Applications Selection → I2S Sample
# Application Settings → 选择 I2S 工作模式
6.2 烧录运行*
cd tools/bootx/
./flash_nor.sh 0 -r 1000000
7. 预期输出*
- TX 模式:外部 Codec 收到麦克风音频数据
- RX 模式:扬声器播放来自外部 Codec 的音频
8. 注意事项*
- 外部 Codec 必需:该 App 需要连接外部 I2S 音频编解码器,不能独立运行
- 主从匹配:模式选择需与外部 Codec 的主从配置匹配,时钟方向不一致会导致无输出
- 引脚冲突:I2S 引脚(
PAD 5/PAD 7/PAD 8/PAD 9/PAD 10)不可与其他功能复用 - 缓存一致性:TX DMA 直接访问内存,需确保数据已写入物理内存
- 休眠/唤醒未实现:当前 SDK 不支持休眠功能,
app_suspend()和app_resume()保持空实现即可