本 demo 演示 I2S 录音回环播放, 使用的音频芯片 ES8388 编码与解码, 另外需要使用 I2C 对 ES8388 配置。 若使用其他音频解码芯片,请自行配置,本文档仅重点讲述 I2S 的使用,对音频芯片不做过多介绍。
硬件连接
本 demo 基于 BL706_AVB 开发板,需要用到 ES8388 音频子板,连接方式如下:
![](//file.elecfans.com/web2/M00/56/BE/pYYBAGLfqSmAeEHkAABLDj_veHs135.jpg)
如果使用的是BL706_AVB板,请确保FUN1 FUN2两个跳帽处于短接的状态,如下图所示
![](//file.elecfans.com/web2/M00/56/20/poYBAGLfqSmAe4qFAAID48gQrvA114.jpg)
本 demo 用到的内部外设资源如下:
![](//file.elecfans.com/web2/M00/56/20/poYBAGLfqSmAfTaPAACkrEYrmPM135.jpg)
软件实现
本文档不再详细介绍 I2C 与 DMA,主要介绍 I2S 相关配置,其他外设可以查看对应的文档。
软件代码见 examples/i2s/i2s_play_form_record
配置 I2S, I2C, CLK_OUT(MCLK) 相关复用引脚,见 bsp/board/bl706_iot/pinmux_config.h 中的宏定义选项:
![](//file.elecfans.com/web2/M00/56/20/poYBAGLfqSmAOMxFAAB9zOOl8Ek042.jpg)
配置 ES8388 的参数,初始化 ES8388 ,其中会用到 I2C 外设,具体过程可见 bsp/bsp_common/es8388/es8388.c
![](//file.elecfans.com/web2/M00/56/BE/pYYBAGLfqSmAIdUKAACaDz-tzG0556.jpg)
I2S 的配置与使能:
使能 BSP_USING_I2S0 并配置 I2S 设备配置,见 bsp/board/bl706_iot/peripheral_config.h 中:
![](//file.elecfans.com/web2/M00/56/BE/pYYBAGLfqSmAWnY2AABxlkd6SM0701.jpg)
先调用 i2s_register 函数注册 I2S 设备
然后通过 find 函数找到设备对应的句柄,保存于 i2s 中
最后填写配置参数后,使用 device_open 来打开 I2S 设备
如果不填写配置参数,会默认使用 bsp/board/bl706_iot/peripheral_config.h 中预设的参数
![](//file.elecfans.com/web2/M00/56/20/poYBAGLfqSmAAyAYAACf9TNOsro343.jpg)
DMA 的配置与使能
为了 I2S 更高效,减少对 CPU 的占用,需要配置 DMA 来搬运数据。本次会用到两个 DMA 通道,分别用于 I2S 的数据发送与接收。
启用其中一路 DMA 的完成中断,用以处理双缓存数据的切换,将获取的音频数据再发送出去,回环播放。具体配置可见 DMA 文档,配置代码如下:
![](//file.elecfans.com/web2/M00/56/BE/pYYBAGLfqSmAShsuAAJoT0BhHCo379.jpg)
![](//file.elecfans.com/web2/M00/56/BE/pYYBAGLfqSmAOsMSAADoPdjH4WI509.jpg)
DMA 中断回调函数
本例程使用双缓冲的方式处理数据,同时录音与播音,一个 buff 用以录音,另一个 buff 用以播音,在 DMA 完成中断里切换:
![](//file.elecfans.com/web2/M00/56/20/poYBAGLfqSmAVyIUAABT9B-UiSk828.jpg)
编译和烧录
CDK 编译
打开项目中提供的工程文件:i2s_play_form_record.cdkproj
参照 Windows 下使用 CDK (类 MDK Keil)开发指南 的步骤编译下载即可
命令行编译
![](//file.elecfans.com/web2/M00/56/20/poYBAGLfqSmAVaiwAAAhZcRTCQE913.jpg)
实验现象
录音与播音回环,类似于扩音器。
原作者:BL_MCU_SDK 开发指南