概述
DAI: Digital Audio Interface. 数字音频接口。古时候都是一堆芯片组成的音频电路,电路板上还得走模拟信号,对硬件工程师的要求是相当高。
但随着半导体的发展,一堆音频芯片被集成到了一颗音频芯片上。MPU直连codec芯片传输数字音频数据,codec输出模拟信号连接到硬件音频插孔就完啦。硬件工程师的九阳神功慢慢失传了。
主要讲解数字音频信号的传输标准,如I2S、PCM (Pulse Code Modulation) 和PDM (Pulse Density Modulation)主要用于同一块电路板上MPU芯片与音频codec芯片之间传输数字音频数据。
MPU芯片SAI/I2S外设引脚
通过MPU一端的SAI接口可以窥见,用于MPU与codec芯片之间传输信号的SAI/I2S接口一般就下面几类信号:
SAI_MCLK ------------用来为外部音频编解码芯片提供工作时钟
SAI_RX_BCLK ------------接收信道的位时钟
SAI_RX_DATA ------------接收信道的数据
SAI_RX_SYNC ------------用于接收信道的左右信道中的帧同步信号
SAI_TX_BCLK ------------传输信道的位时钟
SAI_TX_DATA ------------传输信道的数据
SAI_TX_SYNC ------------用于传输信道的左右信道中的帧同步信号
原文链接
其中不同的芯片 SAI_RX_DATA 与 SAI_TX_DATA 数据信号的根数不同,当然 SAI_RX_DATA 越多传输的数据越快是显而易见的,如nxp的SAI接口的SAI_TX_BCLK 一般由 I2Sx_TCR3[TCE] 决定,TCE的位数决定了支持数据信号的最大根数。
仔细看文档会发现,在SAI框架图中 SAI_RX_BCLK 信号与 SAI_TX_BCLK 这俩时钟信号可能共用,SAI_RX_SYNC 信号与 SAI_TX_SYNC 可能共用,所以硬件接线只需要接其中之一即可。
MPU芯片音频系统架构
通过上图可知,有一个提供时钟的设备,我们称为主设备,被提供时钟的设备为从设备,三种拓扑结构如下,一般我们选择MPU为主,codec为从。
上图中:
SCK 信号对应SAI_#X_BCLK。
WS 信号对应SAI_#X_SYNC。
SD 信号对应SAI_#X_DATA[0-n]。
为什么上来就说这个?
在调查音频数据接口协议的过程中快被概念搞晕了,一会儿TMD属于I2S,一会儿TDM又属于PCM,一会儿PCM数据通过I2S发送,这些概念在不同的博客和文档以及codec芯片中交叉重叠,在阅读的时候如果先入为主,认定了第一篇博客的对I2S.PCM,TDM的概念,就晕了,可能概念这玩意儿本来就不统一。
但我们的目的是用这个I2S接口实现音频传输。MPU芯片如此设计SAI/I2S接口就是为了与市场上的codec芯片匹配使用,所以这个I2S接口之所以有多跟数据线,就是因为codec可能有些模式就是需要多根DATA线工作在特定模式。
好了到现在你已经知道如何使用了。比如你拿到一个codec芯片,这个芯片说自己支持8通道(4对,每对儿有两个channel), 看codec芯片手册得知他在 PCM 某种模式需要 4 根 DATA 线,然后发现 MPU 的 SAI/I2S 外设也支持四根 DATA 线,那这个 codec 和 MPU 的音频接口就匹配,如果MPU的 SAI/I2S 外设不支持 4 根DATA线,那就看看codec能否换一个模式,仅使用两根或1根DATA线实现 8 channel。
一、I2S接口与PCM接口
I2S接口
I2S全称Inter-IC Sound, Integrated Interchip Sound,或简写IIS,飞利浦定义的。
I2S协议中规定:
- 有三根线,一个基础时钟SCK(Serial Clock),表示传输速率;一个WS(Word Select)信号,为0表示传输左通道,为1表示正传输右通道;一个串行数据信号线SD(Serial Data)。
- WS的频率为音频采样率
- 串行数据在I2S中以二进制补码的形式在数据线SD上传输。
- WS信号提前SD一个时钟周期发生电平改变。【详情参考AN12202】
- 为了使音频CODEC芯片与主控制器之间能够更好的同步,会引入另外一个叫做MCLK的信号,也叫做主时钟或系统时钟,一般是采样率的256倍或384倍。
- 特点:速度快,专门用于传音乐
不同芯片对他们的命名有区别容易搞混,重点在于自己理解信号的作用并分析哪个对应哪个。
1. I2S操作模式
关于左右对齐,【AN12202】应用手册说只有左对齐格式与右对齐格式两种,而这篇博客说还有一种I2S格式。到底有几种?咱特么看手册,实践出真知:
答案:很多种,具体看codec手册。
请看[AK4458]芯片手册模式部分,SDTI是其数据信号线,分为LSB justified,MSB justified,I2S compatible三种。
观察其三种不同模式下的时序图:
可见,AK4458芯片的I2S格式与左对齐的区别就是错开了一个时钟且LECK反相。
但是查看[WM8960]芯片手册,在”DIGITAL AUDIO INTERFACE“一节,会发现音频数据格式支持四种:Left justified,Right justified,I2S,DSP mode(也叫PCM mode),这个PCM mode就被各大博主博客归为了与I2S接口并列的PCM接口了,但人家codec芯片只是与上面三种格式并列的用时序图区分的格式罢了。搞得我看手册时都发懵。罢了罢了不白扯了,在PCM接口再讲解。
2. I2S数据时钟(SCK)频率计算
例如:I2S数据格式支持两通道,设声音的采样频率为44.1 kHz,即WS的频率必须也为44.1 kHz;左/右2个声道的量化深度均为16 bit,则I2S的SCK的频率为:44.1 kHz×16×2=1.4112 MHz
如果需要传输20 bit、24 bit或32 bit的左右声道的数据,可以提高SCK的频率,由上式可以计算出需要的SCK的频率。
PCM接口
我理解PCM接口一般在手册中描述,与I2S的区别就是时序图的区别,具体要看芯片手册的定义。我们在这单拎出来让PCM mode成为一个接口概念,当然你也可以认为他就是I2S的一个特例。一些网站将该接口定义为(PCM-clock、PCM-sync、PCM-in、PCM-out),我认为这与I2S的接口是对应的,之所以有这种定义可能是历史原因。
比如看[WM8960]芯片的PCM mode:
根据LRCLK的选择,modeA还是modeB, 主还是从来区分不同的时序图。不要只看博客的概念。
当然mode A 和 mode B的概念可以去参考【数字音频接口】,【AN12202】。
二、Codec模式选择
虽然上面说了一堆模式,看似是不同的维度没啥关系的定义,但观察codec文档就会发现,从code芯片的角度,上面的模式都在一个维度讨论,就是时序图(数据传输格式)不同。
插入一个概念TDM:分时复用。很多博客把这个单拎出来成为一个属于I2S或者PCM的概念,但这样造成了混淆,我们只要理解TDM模式可以传输多通道数据即可。
比如[WM8960]芯片:芯片手册说我支持下面几种数据传输格式:左对齐,右对齐,I2S格式,DSP/PCM mode 具体你去看我的时序图去。
比如[AK4458]芯片:芯片手册说我支持 PCM模式 和 DSD模式,其中PCM模式又分为25种数据传输格式,这25种数据归类为Normal mode,TDM128 Mode,TDM512 Mode,具体你去看我的时序图去。
如果你只看了上面的概念,实践的时候拿到 codec datasheet 一看就蒙了,我咋找不到I2S,诶?为啥I2S属于PCM,诶?为啥TDM与I2S为并列概念。。。
其实概念是概念,实践是实践。举例子[AK4458]codec芯片的两种模式:
L1-L4代表四个左通道,R1-R4同理,共8通道。
Normal Mode需要四个数据线,每个数据线传输一对左右声道的数据。
TDM128 Mode仅需要两根数据线,每个数据线传输两对左右声道的数据。
看似TDM128 Mode比Normal Mode走线更方便,更好,但是时钟信号的最大频率是固定的,单位时间信号线上传输的有效数据量也是固定的。最大采样率固定,线越少,每个通道能传输的信息越少。所以这个codec芯片需要选择一个支持4个数据信号线SAI接口的MPU可发挥出其最大性能。
三、时钟(BCLK)频率的计算
FSYNC的频率等于音频的采样率(例如44.1 kHz,48 kHz等)。Frame每次传输包括所有声道的数据。PCM采样音频数据量化深度一般在16-32bit(最常见为16/24bit)。那么对于8声道,每个声道32bit音频数据,采样率48kHz的系统,TDM的系统时钟速率为:8 × 32 × 48kHz = 12.288 MHz
在器件Datasheet中可以见到TDM128/TDM256/TDM384/TDM512模式等说法,数字的含义为单个TDM数据帧包含数据的比特数(即帧长)。如上例8声道(Channels)32bit的音频数据,亦称为TDM256(=8*32)。TDM系统时钟速率就可以简单地用采样率乘以TDM帧长计算得出。相同的例子,TDM系统时钟速率:48kHz × 256 = 12.288 MHz
四、一些疑问与解答
-
为何SAI往往有两组接口“TX_DATA,TX_BCLK,TX_SYNC” 和 “RX_DATA,RX_BCLK,RX_SYNC” 和一个MCLK, 但是网上的接线图直接了其中的一组BCLK,SYNC 和各自的DATA接口?
答:SAI为了完成接收和发送所以由两个SAI子模块组成,且分别有各自的时钟发生器,这两个模块可以设置为同步模式或异步模式,如果为同步模式,则“BCLK,SYNC”和 MCLK可以共用。 -
一般codec 芯片与主控MPU的接线需要几根?
答:继续上面的回答可知,如果为同步模式,且codec仅需要一组收发数据线,则需要SAI相关的线5根,一般外加两根I2C线,需要对codec进行配置。如果需要还需根据codec模式要求增加数据线,但MPU的SAI接口要支持多line才行。 -
槽slot与channle是什么关系?
答:使用与被使用的关系,一个channel占用一个slot传输数据,一个slot的宽度(slot size)为帧长度的1/N,其中N一般为要传输的通道的数量(四舍五入到最近的2次幂)。要传输的通道的数量也一定小于等于slot的个数,多余的slot会被闲置。一个channel的数据量肯定小于等于一个slot size。 -
ls1012A文档中的Word size与slot size的关系?
答:文档中描述的“Maximum frame size of 32 words, Word size between 8 bits and 32 bits” 。每个slot可以是多个words, words只是解析一个slots数据的最小单位。 -
(I2Sx_TCR3)[16 TCE]的宽度有长有短,请解释干啥用的?
参考多个文档的SAI寄存器。 我发现:
不同芯片的(I2Sx_TCR3)[16 TCE]宽度不同,LS1028,LS1021和LS1012芯片的该位为1bit, 且(I2Sx_TCR4)没CHMOD位。
S21K14, IMXRT1170, IMX93, IMX8MP等芯片的(I2Sx_TCR3)[16 TCE]宽度均不为1bit(不同SAI通道有区别),且(I2Sx_TCR4)都有CHMOD位,CHMOD用于切换输出模式或者TDM模式。
这个TCE位数决定了SAI接口有几根DATA信号线。输出线越多,同时传输的速度越快,也就支持与多channel(一个channel就是一个硬件data线)的codec芯片链接。
参考文章:
数字音频接口(I2S,PCM/TDM,PDM)-背包旅行码农
SAI接口-学海无涯
AN12202应用手册-在S32K148上使用SAI接口
咨询专家,说SAI/I2S外设虽然只有一根DATA线,但是依然支持一根数据线上传输多个声道,只需要改改设备树,仅做软件修改即可。
TDM4,TMD8就是一个数据线上传输4个声道,8个声道。根我理解的相同。我需要哪一个支持多通道的板子实验,看看现象,理解多通道的数据是如何传输到一根数据线上的,ws时钟同步信号是否会随着TDM模式还是I2S模式改变。
需要了解ALSA框架,可用参考内核文件:
Documentation/sound/kernel-api/alsa-driver-api.rst
Documentation/sound/alsa-configuration.rst
这是AN12202文档中的一张图,结合其中TDM的时序图理解,只要设置CR4[FRSZ]为1就表示一个Frame传输2个slot, 设置CR4[FRSZ]为7就表示每个Frame传输8个slot.