22.6.6. DAO_I2S_DMA

22.6.6.1. 概述

该示例工程展示了使用DAO(Digital Audio Output)+ I2S外设配合DMA传输音频数据进行播放的功能。 DAO是数字音频输出模块,可以直接输出差分PWM信号,直接驱动CLASSD功放芯片,实现音频播放。 该例程还支持通过GPIO按键控制播放的暂停和恢复功能。

22.6.6.2. 工作流程

  1. 根据音频采样率,配置系统音频时钟MCLK

  2. 初始化I2S外设和DAO外设:

    • 配置I2S外设,包括音频数据格式(位宽、通道数、采样率)

    • 使能I2S DMA发送请求

    • 配置DAO外设

  3. 配置GPIO按键中断,用于控制音频播放的暂停和恢复:

    • 设置按键中断触发条件

    • 配置按键防抖处理

    • 使能GPIO中断

  4. 配置DMA搬运音频数据:

    • 配置DMAMUX,选择I2S作为DMA请求源

    • 使能DMA中断

    • 设置源地址为音频数据存放地址

    • 设置目标地址为I2S发送FIFO

    • 配置传输大小和传输宽度

    • 配置突发传输模式(单声道:DMA_NUM_TRANSFER_PER_BURST_1T;立体声:DMA_NUM_TRANSFER_PER_BURST_2T)

  5. 启动I2S外设和DAO外设:

    • 软件重置I2S外设和DAO外设

    • 启动I2S外设和DAO外设

  6. DMA自动将音频数据传输到I2S的TX FIFO,DAO将I2S数据转换后输出

  7. DMA完成后停止I2S外设和DAO外设

  8. 重复4-7步骤,实现音频循环播放

  9. 音频播放时支持通过按键暂停/恢复播放

22.6.6.3. 音频配置

  1. 音频格式配置

    • 支持多种音频采样率

    • 支持16位和32位音频深度

    • 支持单声道(须支持HPM_IP_FEATURE_DAO_AUDIO_MONO_FIX)和立体声模式

    • 根据编译选项选择音频数据源:

      • 单声道模式:audio_mono.h

      • 立体声模式:audio_stereo.h

  2. 声道配置

    • channel_slot_mask参数值

      • 左声道:0x1

      • 右声道:0x2

      • 立体声:0x3

    • DAO声道参数必须配置为双声道模式(channel_slot_mask = 3)

    • DAO实现播放单声道音频源,可通过设置I2S的channel_slot_mask参数值实现

      • 需要支持HPM_IP_FEATURE_DAO_AUDIO_MONO_FIX

      • 需要将I2S的channel_slot_mask设置为单声道, channel_slot_mask = 0x1, DAO的左声道播放声音, channel_slot_mask = 0x2, DAO的右声道播放声音。

      • 如果不支持HPM_IP_FEATURE_DAO_AUDIO_MONO_FIX,可以单声道音频数据复制后形成立体声音频源,使用播放立体声音频方式播放。

    • DAO实现播放立体声音频源,设置I2S的channel_slot_mask = 0x3, DAO的左右声道同时播放声音。

22.6.6.4. 硬件设置

  • 连接喇叭到开发板的 DAO接口 用于播放音频

  • 使用开发板上的按键 按键接口 用于控制播放暂停/恢复

22.6.6.5. 已知问题

  • 使用DAO播放某些音频时可能产生噪声

  • 板上按键,受机械抖动影响,可能出现多次触发GPIO中断的情况

22.6.6.6. 运行现象

当工程正确运行后,可以观察到以下现象:

  1. 串口终端输出信息:

    DAO_I2S with DMA example
    DAO_I2S with DMA play test start, press button can pause/resume audio play.
    DAO_I2S with DMA play one cycle finished
    DAO_I2S with DMA play one cycle finished
    DAO_I2S with DMA play one cycle finished
    DAO_I2S with DMA play one cycle finished
    Test DAO_I2S DMA play success
    
  2. 音频设备会循环播放示例音频(共4次)

  3. 音频播放时按下按键可以暂停播放,再次按下按键可以恢复播放

  4. 串口会显示相应的控制信息:

    • “dao_i2s pause” - 暂停播放

    • “dao_i2s resume” - 恢复播放