基于 STM32 I2S 的音频应用开发介绍
前言
在音频开发中,I2SInter-IC Sound)接口被广泛采用。大部分 STM32 集成了 I2S 接口。本文主要为了让 STM32 使用
者了解 I2S 音频接口,及快速实现 I2S 接口的音频应用开发。 首先,对 STM32 I2S 接口进行简单介绍,然后描述了几种常
I2S 音频应用架构及每种架构音频部分的电路图,最后围绕每种架构给出实现例,以便读者进行参考理解。其中,实现例
会围绕 STM32CubeMX 展开,以便开发者能够参考并快速、简便地实现软件开发。除此之外,在 Cube 软件包中有 I2S 外设
应用例程,提供了更完善的实现参考。
STM32 I2S 接口简介
I2S(Inter-IC Sound)是飞利浦公司针对数字音频设备之间的音频数据传输,制定的一种总线标准。
STM32 I2S 接口信号线构成如下表:
信号线名
功能
描述
主模式
从模式
MCK
主时钟(系统
时钟)
I2S 工作于主模式时,可用于为外部设备提供系统时
钟。工作于从模式时,不可用。
可选(建议采
用)
不可用
CK
串行时钟
位时钟,对于数字音频的每一位数据。
必须
必须
WS
字段选择
用于切换左右通道,或者作为帧时钟
必须
必须
SD
串行数据
发送或者接收数据
必须
必须
SD_Ext
串行数据
接收或者发送数据 (仅全双工 I2S 外设支持)
可选(全双工
时必须)
可选(全双工
时必须)
其中,SD SD_Ext 信号线可分别配置为发送或者接收。在 Cube 驱动库中已对其进行封装,例如当配置 SD 信号线为
发送端时,SD_Ext 自动被配置为接收端;配置 SD 为接收端时,SD_Ext 自动被配置为发送端。
全双工 I2S 是由两个 I2S 外设组成,如下图所示。
对于构成全双工 I2S 的每个 I2S 外设,都具有单独的寄存器组,如下表所示(以 STM32F413xG/H 为例)。在 Cube
动库中,全双工下的两个 I2S 外设操作已经被封装,用户只需像配置一个全双工 SPI 一样,对一个全双工 I2S API 进行
用即可。后续会以实例形式进行描述。
外设
寄存器地址空间
I2S3ext
0x4000 4000 - 0x4000 43FF
I2S3/SPI3
0x4000 3C00 - 0x4000 3FFF
I2S2/SPI2
0x4000 3800 - 0x4000 3BFF
I2S2ext
0x4000 3400 - 0x4000 37FF
STM32 I2S 支持四种接口标准和数据格式,如下表。更多内容请参考对应型号 STM32 的参考手册。
接口标准
I2S 标准(Philips 标准)、左对齐标准、右对齐标
准、PCM 标准
由表可看出,STM32 I2S 支持音频分辨率可为 16,24 32 位。I2S 时钟配置及数据格式选择决定了音频采样率,时钟产
生架构如下图所示。不同系列 STM32 I2S 接口能够支持的最大音频采样率有差异,更多采样率支持情况请参考对应型号
STM32 的参考手册。
图中 MCKCK 分别对应 I2S 总线上的主时钟和总线时钟。其中 I
2
SxCLK 获取路径如下图所示(对应于右侧的 I2S
clocks)。红色线路或者绿色线路可选,本文中以红色线路为例,利用 PLL 时钟源获取 I
2
SxCLK 时钟。
注:下图是 STM32F429 时钟配置图的部分。不同型号 STM32 的时钟树存在差异,具体以实际采用型号的时钟树为准。
在遵循 I2S 标准的实现方案中,采样率公式如下 (注:Fs 为采样率,得益于 Cube 驱动库中的良好 API 实现,可以直接
设置采样率,使用者不需要按照下述公式进行 I2SDIV IDD 的计算及配置。):