前言

学习stm32 I2S接口使用,学会用I2S接口收发数据,学习I2S总线相关知识,

 

I2S(Inter—IC Sound)总线, 又称 集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。

 

I2S总线接口有3个主要信号,但只能实现数据半双工传输,后来为实现全双工传输有些设备增加了扩展数据引脚。STM32f42x系列控制器支持扩展的I2S总线接口。

(1)    SD(Serial Data):串行数据线,用于发送或接收两个时分复用的数据通道上的数据(仅半双工模式),如果是全双工模式,该信号仅用于发送数据。

(2)    WS(Word Select):字段选择线,也称帧时钟(LRC)线,表明当前传输数据的声道,不同标准有不同的定义。WS线的频率等于采样频率(FS)。

(3)    CK(Serial Clock):串行时钟线,也称位时钟(BCLK),数字音频的每一位数据都对应有一个CK脉冲,它的频率为:2*采样频率*量化位数,2代表左右两个通道数据。

(4)    ext_SD(extend Serial Data):扩展串行数据线,用于全双工传输的数据接收。

另外,有时为使系统间更好地同步,还要传输一个主时钟(MCK),

 

随着技术的发展,在统一的I2S硬件接口下,出现了多种不同的数据格式,可分为左对齐(MSB)标准、右对齐(LSB)标准、I2S Philips标准。STM32支持的I2S是一种3引脚的同步串行接口通讯协议。它支持四种音频标准,包括飞利浦I2S标准, MSB和LSB对齐标准,以及PCM标准。它在半双工通讯中,可以工作在主和从2种模式下。当它作为主设备时,通过接口向外部的从设备提供时钟信号。

 

1.    I2S Philips标准

使用WS信号来指示当前正在发送的数据所属的通道,为0时表示左通道数据。该信号从当前通道数据的第一个位(MSB)之前的一个时钟开始有效。发送方在时钟信号(CK)的下降沿改变数据,接收方在上升沿读取数据。WS信号也在SCK的下降沿变化。参考图 383,为24bit数据封装在32bit帧传输波形。正如之前所说,WS线频率对于采样频率FS,一个WS线周期包括发送左声道和右声道数据,在图中实际需要64个CK周期来完成一次传输。

 

esp32的I2S_数据

I2S Philips标准24bit传输

2.    左对齐标准

在WS发生翻转同时开始传输数据,参考图 384,为24bit数据封装在32bit帧传输波形。该标准较少使用。注意此时WS为1时,传输的是左声道数据,这刚好与I2S Philips标准相反。

 

esp32的I2S_esp32的I2S_02

左对齐标准24bit传输

 

3.    右对齐标准

与左对齐标准类似,参考图 385,为24bit数据封装在32bit帧传输波形。

 

esp32的I2S_esp32的I2S_03

右对齐标准24bit传输

 

4.    PCM标准

PCM即脉冲编码调制,模拟语音信号经过采样量化以及一定数据排列就是PCM了。WS不再作为声道数据选择。它有两种模式,短帧模式和长帧模式,以WS信号高电平保持时间为判别依据,长帧模式保持13个CK周期,短帧模式只保持1个CK周期,可以通过相关寄存器位选择。如果有多通道数据是在一个WS周期内传输完成的,传完左声道数据就紧跟发送右声道数据。图 386为单声道数据16bit扩展到32bit数据帧发送波形。

 

esp32的I2S_数据_04

PCM标准16bit传输

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

示例详解

STM32系列处理器芯片中,不是所有的芯片都支持I2S硬件接口,如在大容量产品和互联型产品上, SPI接口可以配置为支持SPI协议或者支持I2S音频协议。 SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。在小容量和中容量产品上,不支持I2S音频协议。

STM32支持的I2S是一种3引脚的同步串行接口通讯协议。它支持四种音频标准,包括飞利浦I2S标准, MSB和LSB对齐标准,以及PCM标准。它在半双工通讯中,可以工作在主和从2种模式下。当它作为主设备时,通过接口向外部的从设备提供时钟信号。

 

STM32f42x系列控制器I2S的数据寄存器只有16bit,并且左右声道数据一般是紧邻传输,为正确得到左右两个声道数据,需要软件控制数据对应通道数据写入或读取。另外,音频数据的量化位数可能不同,控制器支持16bit、24bit和32bit三种数据长度,因为数据寄存器是16bit的,所以对于24bit和32bit数据长度需要发送两个。为此,可以产生四种数据和帧格式组合:

 

    将16位数据封装在16位帧中

    将16位数据封装在32位帧中

    将24位数据封装在32位帧中

    将32位数据封装在32位帧中

 

当使用32位数据包中的16位数据时,前16位(MSB)为有效位,16位LSB被强制清零,无需任何软件操作或DMA请求(只需一个读/写操作)。如果程序使用DMA传输(一般都会用),则24位和32位数据帧需要对数据寄存器执行两次DMA操作。24位的数据帧,硬件会将8位非有效位扩展到带有0位的32位。对于所有数据格式和通信标准而言,始终会先发送最高有效位(MSB优先)。

 

基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。

因本实验平台不支持硬件I2S接口,这一节我们将用SPI接口来模拟一个双通道16位的I2S接 I2S Philips标准8KHZ通信过程,SPI通信波特率大于 8*16*2 = 256K 即可。

 

esp32的I2S_数据_05

 

 

本示例所用的最小系统板原理图:

esp32的I2S_引脚_06

 

从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:

 

 

  1. 系统时钟树

esp32的I2S_数据_07

  1. SPI器配置

esp32的I2S_引脚_08

  1. 引脚配置

esp32的I2S_数据封装_09

esp32的I2S_esp32的I2S_10

 

  1. 中断配置(保持默认即可)

 

  1. 工程代码
  1. 在main.c 中加入如下图所示代码:

esp32的I2S_数据封装_11

 

 

 

 

  1. 到此,用我们就完成了用SPI模拟I2S的功能,虽然可能这样模拟在真正使用可能还会有问题,但是对我们学习II2来说目的基本上可以实现。看看对应波形!

 

esp32的I2S_数据封装_12

esp32的I2S_数据封装_13