STM32 基础系列教程 16 - I2S(模拟)

前言

学习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周期来完成一次传输。

 

https://i-blog.csdnimg.cn/blog_migrate/b204881d3f753cfb6717305ee301da9f.png

I2S Philips标准24bit传输

2.    左对齐标准

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

 

https://i-blog.csdnimg.cn/blog_migrate/98af7f75854b4a308232a2fc37c9d240.png

左对齐标准24bit传输

 

3.    右对齐标准

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

 

https://i-blog.csdnimg.cn/blog_migrate/ec33457d8861bafdd6a09d69b645f434.png

右对齐标准24bit传输

 

4.    PCM标准

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

 

https://i-blog.csdnimg.cn/blog_migrate/16bfb3e6e50f1cdf1f7476c2839feea7.png

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 即可。

 

 

 

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

 

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

 

 

      1. 系统时钟树

      1. SPI器配置

      1. 引脚配置

 

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

 

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

 

 

 

 

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

 

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,每天都会有技术干货推出!!

 

文中资料下载,在公众号里给十三发消息:

下载|STM32基础系列教程16

 

关注十三公众号

 

 

<think>好的,我现在需要回答用户关于如何模拟I2S接口的问题。首先,我要确认I2S的基本概念,确保理解正确。I2S是用于音频数据传输的协议,主要涉及三个信号线:时钟SCK、帧同步WS和数据SD。用户提到的是模拟实现,可能需要通过软件控制GPIO来生成这些信号。 接下来,我需要考虑用户提供的引用内容。引用[1]和[2]都是关于I2C的模拟,但可能有一些通用的方法可以借鉴,比如使用GPIO模拟时序,或者使用硬件扩展器。不过I2S和I2C在协议上差异较大,需要特别注意时序和信号的不同。 用户需要示例代码,所以我要想一个简单的例子,可能用单片机比如STM32或者Arduino来演示。需要配置GPIO引脚,模拟时钟信号,帧同步信号,以及数据输出。可能还需要考虑主从模式,这里假设用户需要主模式发送音频数据。 然后,要确保代码结构清晰,比如初始化函数、发送函数。发送函数需要根据I2S的时序,在正确的时钟边沿改变数据。需要注意数据对齐方式,比如左对齐或右对齐,这里以左对齐为例。 另外,用户可能关心如何优化时序,减少抖动,或者如何处理中断等问题。但示例代码可能只需基础实现,高级优化可以作为相关问题提出。 还需要验证代码的正确性,比如时钟频率是否符合I2S标准,数据在WS变化前后的正确位置。可能需要示波器或逻辑分析仪来验证波形,但用户可能没有这些工具,所以代码需要尽可能精确地控制时序。 最后,生成相关问题,考虑用户可能进一步想了解的内容,比如如何接收数据、如何处理不同数据格式、如何与外部编解码器连接等。确保问题覆盖实现中的关键点和扩展应用。</think>### I2S接口模拟实现方法 I2S(Inter-IC Sound)是飞利浦公司提出的数字音频传输协议,主要通过3个信号线实现: - SCK(串行时钟):$f_{SCK}=2 \times 位宽 \times 采样率$ - WS(字选择):采样率频率,左/右声道标识 - SD(串行数据):音频数据流 #### 软件模拟实现步骤 1. **GPIO配置** ```c // STM32示例 #define SCK_PIN GPIO_PIN_5 #define WS_PIN GPIO_PIN_6 #define SD_PIN GPIO_PIN_7 void I2S_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 配置为推挽输出模式 GPIO_InitStruct.Pin = SCK_PIN | WS_PIN | SD_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` 2. **时序生成逻辑** ```c void I2S_SendFrame(uint32_t data, uint8_t channel) { // 左声道WS=0,右声道WS=1 HAL_GPIO_WritePin(GPIOB, WS_PIN, channel ? GPIO_PIN_SET : GPIO_PIN_RESET); for(int i=31; i>=0; i--) { // 32位数据 HAL_GPIO_WritePin(GPIOB, SCK_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, SD_PIN, (data & (1<<i)) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, SCK_PIN, GPIO_PIN_SET); // 此处需插入精确延时控制频率 } } ``` 3. **时钟同步优化** - 使用定时器中断生成精确时钟 - 采用DMA传输降低CPU负载 - 通过硬件PLL锁相环稳定时钟[^2] #### 硬件辅助方案 1. 使用FPGA实现I2S控制器 2. 选用内置I2S接口的MCU(如STM32F4系列) 3. 外接I2S编解码芯片(如VS1053)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值