跳转至

I2S 示例*

提示

警告

  • 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 初始化流程*

  1. 使能 AUDPCLKI2S 时钟
  2. 配置引脚复用为 I2S 功能
  3. 调用 gx_i2s_init() 初始化 I2S 硬件
  4. 根据所选模式调用对应的 i2s_config_xxx() 配置 TX/RX
  5. 配置 SDM/ADC 时钟源用于回采

5.2 TX 发送机制*

  1. 初始化时 i2s_tx_push_mic_frame() 将首帧入队
  2. 后续帧由 _i2s_tx_cb() 回调处理
  3. 回调遍历麦克风环形缓冲区,按帧大小推进读地址,必要时回绕

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. 注意事项*

  1. 外部 Codec 必需:该 App 需要连接外部 I2S 音频编解码器,不能独立运行
  2. 主从匹配:模式选择需与外部 Codec 的主从配置匹配,时钟方向不一致会导致无输出
  3. 引脚冲突:I2S 引脚(PAD 5/PAD 7/PAD 8/PAD 9/PAD 10)不可与其他功能复用
  4. 缓存一致性:TX DMA 直接访问内存,需确保数据已写入物理内存
  5. 休眠/唤醒未实现:当前 SDK 不支持休眠功能,app_suspend()app_resume() 保持空实现即可