I2S是什么通信协议?它如何传输音频数据?它和I2C是什么关系?

首先我们先明确一点,I2S和I2C没有什么关系,如果非要扯点共同点的话那就是它们都是由飞利浦制定的。

I2C我们用的比较多,我们用的大多数的传感器模块用的通信协议就是I2C,SPI,UART这些。

而I2S应用领域比较单一,就是来传输音频数据的。

所以简单来说,I2C是传输数据的,I2S是传输音频数据的。

我个人是认为在部分情况下也是可以使用I2C来传输音频数据的,只要我们把数据包装包装一下就行,但是人家别的模块传输音频的通信协议都是I2S,你用个I2C对接不上。

不过就算模块的协议也是我们自己写的I2C,我就是要用I2C来代替I2S传输数据,那其实也没必要,斧子也可以来切菜,但是我们切菜用的不是斧子而是菜刀。

所谓术业有专攻,I2S就是为了传输音频而生的,所以用它来传输音频数据是再合适不过了,包括我们正常买到的麦克风模块之类的用的也是I2S协议。

接下来我们就来聊聊I2S,看看它到底为什么适合传输音频数据。

I2S需要三根线,时钟线,数据线,还要一根声道选择线。

我们平时打吃鸡可以听声辨位,最主要的原因就是有左右声道,我们左右耳机的声音其实是不一样的,而我们的大脑可以同时处理这两个声道的声音,从而根据声音来判断敌人的位置。

什么?你说你不玩吃鸡?那你总可以在你爸妈敲开你房门的一瞬间把电脑切到桌面吧。

顺带一提,返回桌面的快键键是win+D,别问我为什么知道

我都是光明正大在父母面前看片的(bushi

当声道选择线为低电平的时候,表示当前正在传输左声道的音频数据,高电平就是右声道的音频数据(在I2S标准模式下)。

下面这个是官方手册的框图,可以看出在接线上I2S有三种接法,一个是发送端->接收端,一个是接收端->发送端,还有一个是在发送端和接收端之间加个控制器,由控制器当中转站。

数据线上的数据永远是发送端发给接收端,但是时钟线的流向可不一定,即可以由发送端来控制,也可以由接收端来控制,WS声道选择线也是一样的。

既然谈到了时钟线,那么I2S的传输速率是多少呢?

在官方手册里举例是2.5MHz,也就是说它至少是可以支持2.5MHz的速率,这可比I2C快多了,甚至在框图里我们可以看到I2S并不像I2C一样要有应答位,这又能进一步提升传输的效率(因为原本用来应答的bit被拿来传输数据了)。

一般我们声音采集的频率是44.1k,I2S可以采集双声道,所以乘2,采样的精度一般是16或者24位,这样一算就是44.1k*2*24=2.1158MHz。

所以I2S的传输速率是根据我们自己的需求而调整的,就算你速率是2.5MHz,但是我每秒采集的音频数据就那么多,你再快也没用。

这也是I2C难以替代I2S的原因之一,速率不够,基本上我们用的I2C是100k和400k,虽然I2C超高速模式也能上MHz级别,但用的还是比较少的。

我们知道,SPI根据时钟相位的不同可以有四种工作模式,而I2S也是有着多种不同的工作模式。

I2S有三种,一种是飞利浦的标准I2S模式,另外两种分别是左对齐模式和右对齐模式。

所有模式都是MSB高位先行,并且发送的是二进制补码。

先看看标准的I2S模式。

时钟线SCK下降沿的时候,发送端控制数据线SD切换数据bit,当SCK上升沿的时候,接收端可以从SD读取数据。

我们刚刚说了WS是声道选择线,而WS同时也是帧同步线,它一个周期就表示一帧,而一帧的数据里包含左声道和右声道的数据,所以WS的频率就等于音频的采样率。

当WS下降沿的时候表示一帧新的数据开始传输,在标准I2S模式下,WS跳变后的第一个bit无效,从第二个bit开始读取。

而下面的左对齐模式则不需要跳过第一个bit。

左对齐模式的WS声道选择线和标准I2S模式是反过来的,WS高电平的时候表示左声道,而低电平的时候表示右声道。

并且数据是左对齐的。

这个可以参考ADC来理解,我们的ADC也是有左对齐和右对齐的,假设我们的数据是12位的,而传输数据是按照16bit传输的,这时候12bit填不满16bit,我们就需要选择是将数据左对齐还是右对齐了。

右对齐模式的WS逻辑和左对齐模式一样。不一样的地方是它是将数据右对齐来传输的。

所以简单总结一下标准模式和左右对齐模式的不同之处就是标准模式会把WS跳变后的第一个bit忽略,而左右对齐模式不会;并且WS对于左右声道的逻辑是反过来的。

左右对齐模式的不同之处就是数据的对齐方式。

标准模式要忽略一个bit的原因是为了数据的稳定,数据的稳定、时钟同步、从设备的处理时间和信号完整性。

至于左右对齐模式不需要忽略一个时钟周期的原因我不太清楚,AI的回答是下面这样的。

这AI也不太行啊(谁家的AI我就不说了)。

知道了I2S的时序之后,我们应该如何使用I2S来通信呢?

一般我们拿主控芯片去接收麦克风模块的声音,所以我们是接收端,而麦克风模块是发送端。

根据官方文档里的框图,由我们接收端来控制时钟线和声道选择线(帧同步线)

所以我们只需要去控制SCK和WS就可以来进行通信了。

以标准模式为例,我们只需要让WS进行一个下降沿的跳变,就表示了一帧数据开始发送,我们同时再控制SCK和读取SD就可以获取到数据了。

因为是一对一的,所以不需要像I2C那样有从机地址,并且为了数据的连续性,也不需要ack应答。

当然了,一般情况下我们不会使用GPIO引脚来模拟I2S(引脚电平翻转的频率跟不上),我们都是直接使用硬件I2S的,因此对于底层的细节我们不需要很在意。

以上就是今天的全部内容了,因为要用到麦克风模块了,所以临时突击了一下I2S,查了一天的资料,累死我了,I2S的资料真难找,网上一堆废话和互相搬运来搬运去的

要是本文有什么说的不对的地方欢迎大家指出,毕竟我对I2S也不是特别的了解。

好不容易找来的资料也不浪费,私信回复"I2S"免费下载I2S的官方手册,不过是英文的,想要研究研究的小伙伴可以下载下来看看。

相关推荐
ye1501277745530 分钟前
DC6v-36V转3.2V1A恒流驱动芯片WT7017
单片机·嵌入式硬件·其他
时序数据说3 小时前
时序数据库市场前景分析
大数据·数据库·物联网·开源·时序数据库
FreeDw资源库4 小时前
功能强大!开源免费的视频翻译、音视频转录工具
音视频·音视频翻译
scilwb11 小时前
RoboCon考核题——scilwb
单片机
点灯小铭11 小时前
基于STM32单片机智能RFID刷卡汽车位锁桩设计
stm32·单片机·汽车·毕业设计·课程设计
TDengine (老段)12 小时前
TDengine IDMP 高级功能(4. 元素引用)
大数据·数据库·人工智能·物联网·数据分析·时序数据库·tdengine
bai54593613 小时前
STM32 软件I2C读写MPU6050
stm32·单片机·嵌入式硬件
逼子格15 小时前
AT89C52单片机介绍
单片机·嵌入式硬件·51单片机·硬件工程师·硬件工程师真题·at89c52·器件手册
生涯にわたる学び17 小时前
ARM 实操 流水灯 按键控制 day53
arm开发·嵌入式硬件
whaosoft-14317 小时前
w嵌入式分享合集68
嵌入式硬件