I2S(Inter-IC Sound)采用了独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。标准的I2S总线电缆是由3根串行导线组成的:1根是时分多路复用(简称TDM)数据线;1根是字选择线;1根是时钟线。
音响数据的采集、处理和传输是多媒体技术的重要组成部分。众多的数字音频系统已经进入消费市场,例如数字音频录音带、数字声音处理器。对于设备和生产厂家来说,标准化的信息传输结构可以提高系统的适应性。I2S(Inter—IC Sound)总线是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。
在飞利浦公司的I2S标准中,既规定了硬件接口规范,也规定了数字音频数据的格式。
I2S有3个主要信号
1.串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲。SCLK的频率=2×采样频率×采样位数。
2. 帧时钟LRCK,(也称WS),用于切换左右声道的数据。LRCK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCK的频率等于采样频率。
3.串行数据SDATA,就是用二进制补码表示的音频数据。
有时为了使系统间能够更好地同步,还需要另外传输一个信号MCLK,称为主时钟,也叫系统时钟(Sys Clock),是采样频率的256倍或384倍。
串行数据(SD)
I2S格式的信号无论有多少位有效数据,数据的最高位总是出现在LRCK变化(也就是一帧开始)后的第2个SCLK脉冲处。这就使得接收端与发送端的有效位数可以不同。如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位。这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位。
随着技术的发展,在统一的 I2S接口下,出现了多种不同的数据格式。根据SDATA数据相对于LRCK和SCLK的位置不同,分为左对齐(较少使用)、I2S格式(即飞利浦规定的格式)和右对齐(也叫日本格式、普通格式)。
为了保证数字音频信号的正确传输,发送端和接收端应该采用相同的数据格式和长度。当然,对I2S格式来说数据长度可以不同。
字段(声道)选择(WS)
命令选择线表明了正在被传输的声道。
WS=0,表示正在传输的是左声道的数据。
WS=1,表示正在传输的是右声道的数据。
WS可以在串行时钟的上升沿或者下降沿发生改变,并且WS信号不需要一定是对称的。在从属装置端,WS在时钟信号的上升沿发生改变。WS总是在最高位传输前的一个时钟周期发生改变,这样可以使从属装置得到与被传输的串行数据同步的时间,并且使接收端存储当前的命令以及为下次的命令清除空间。
时序要求
在I2s总线中,任何设备都可以通过提供必需的时钟信号成为系统的主导装置,而从属装置通过外部时钟信号来得到它的内部时钟信号,这就意味着必须重视主导装置和数据以及命令选择信号之间的传播延迟,总的延迟主要由两部分组成:
1.外部时钟和从属装置的内部时钟之间的延迟
2.内部时钟和数据信号以及命令选择信号之间的延迟
对于数据和命令信号的输入,外部时钟和内部时钟的延迟不占据主导地位,它只是延长了有效的建立时间(set—up time)。延迟的主要部分是发送端的传输延迟和设置接收端所需的时间。
T是时钟周期,Tr是最小允许时钟周期,T>Tr这样发送端和接收端才能满足数据传输速率的要求。
对于所有的数据速率,发送端和接收端均发出一个具有固定的传号空号比(mark—space ratio)的时钟信号,所以t LC和tHC是由T所定义的。t LC和tHC必须大于0.35T,这样信号在从属装置端就可以被检测到。
延迟(tdtr)和最快的传输速度(由Ttr定义)是相关的,快的发送端信号在慢的时钟上升沿可能导致tdtr不能超过tRC而使thtr为零或者负。只有tRC不大于tRCmax的时候(tRCmax>:0.15T),发送端才能保证thtr大于等于0。
为了允许数据在下降沿被记录,时钟信号上升沿及T相关的时间延迟应该给予接收端充分的建立时间(set-up time)。
数据建立时间(set-up time)和保持时间(hold time)不能小于指定接收端的建立时间和保持时间。
随着WS信号的改变,导出一个WSP脉冲信号,进入并行移位寄存器,从而输出数据被激活。串行数据的默认输入是0,因此所有位于最低位(LSB)后的数据将被设置为0。
随着第一个WS信号的改变,WSP在SCK信号的下降沿重设计数器。在“1 out of n”译码器对计数器数值进行译码后,第一个串行的数据(MSB)在SCK时钟信号的上升沿被存放进入B1,随着计数器的增长,接下来的数据被依次存放进入B2到Bn中。在下一个WS信号改变的时候,数据根据WSP脉冲的变化被存放进入左(声道)锁存器或者右(声道)锁存器,并且将B2一Bn的数据清除以及计数器重设,如果有冗余的数据则最低位之后的数据将被忽略。注意:译码器和计数器(虚线内的部分)可以被一个n比特移位寄存器所代替。
IIS总线接口可作为一个编码解码接口与外部8/16位的立体声音频解码电路(CODEC IC)相连,从而实现微唱片和便携式应用。它支持IIS数据格式和MSB-Justified 数据格式。IIS总线接口为先进先出队列FIFO的访问提供DMA传输模式来取代中断模式,可同时发送和接收数据,也可只发送或接收数据。
I2S的总线规范
I2S有4根线,包括:IISDI(串行数据输入),IISDO(串行数据输出),IISLRCK(左右通道选择),和SCLK(串行位时钟)。
产生
IISLRCK
和IISCLK
的设备是主设备。
I2S有3个主要信号:
1.串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲。SCLK的频率=2×采样频率×采样位数。
-
帧时钟LRCK,(也称WS),用于切换左右声道的数据。LRCK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCK的频率等于采样频率。
3.串行数据SDATA,即用二进制补码表示的音频数据。(MSB —> LSB:数据由高位到低位依次传输)
4、一般还有MCLK,主时钟,也叫系统时钟(Sys Clock),是采样频率的256倍或384倍。
有时为了使系统间能够更好地同步,还需要另外传输一个信号MCLK,称为主时钟。
I2S格式的信号无论有多少位有效数据,数据的最高位总是出现在LRCK变化(也就是一帧开始)后的第2个SCLK脉冲处。
这就使得接收端与发送端的有效位数可以不同(因为有固定格式,所以知道如何保留或扩充)。
如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;
如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位。
这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位。
I2S格式的信号无论有多少位有效数据,数据位的最高位(MSB)总是被最先传输,1次能够发送的数据决定于I2S格式的有效位数。
I2S特点
1、支持全双工/半双工
2、支持主/从模式
3、和PCM相比,I2S更适合立体声系统。当然,I2S的变体也支持多通道的时分复用,因此可以支持多声道。
I2S 各种标准
随着技术的发展,在统一的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周期来完成一次传输。
2)左对齐标准
在WS发生翻转同时开始传输数据,参考图 384,为24bit数据封装在32bit帧传输波形。该标准较少使用。注意此时WS为1时,传输的是左声道数据,这刚好与I2S Philips标准相反。
3)右对齐标准
与左对齐标准类似,参考图 385,为24bit数据封装在32bit帧传输波形。
4)PCM标准
PCM即脉冲编码调制,模拟语音信号经过采样量化以及一定数据排列就是PCM了。WS不再作为声道数据选择。它有两种模式,短帧模式和长帧模式,以WS信号高电平保持时间为判别依据,长帧模式保持13个CK周期,短帧模式只保持1个CK周期,可以通过相关寄存器位选择。如果有多通道数据是在一个WS周期内传输完成的,传完左声道数据就紧跟发送右声道数据。图 386为单声道数据16bit扩展到32bit数据帧发送波形。
I2S有3个主要信号
1.串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲。SCLK的频率=2×采样频率×采样位数。
2. 帧时钟LRCK,(也称WS),用于切换左右声道的数据。LRCK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCK的频率等于采样频率。
3.串行数据SDATA,就是用二进制补码表示的音频数据。
有时为了使系统间能够更好地同步,还需要另外传输一个信号MCLK,称为主时钟,也叫系统时钟(Sys Clock),是采样频率的256倍或384倍。
串行数据(SD)
I2S格式的信号无论有多少位有效数据,数据的最高位总是出现在LRCK变化(也就是一帧开始)后的第2个SCLK脉冲处。这就使得接收端与发送端的有效位数可以不同。如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位。这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位。(以上信息来自百度百科)
2 从设备ADMP441
接口:标准飞利浦数字I2S接口,24-bit数据
SCK :I2S接口的串行数据时钟引脚。
SD :I2S接口的串行数据输出引脚。
WS :I2S接口的串行数据字选择引脚。
电源电压:1.8 V < VDD < 3.3 V。
数据格式:从机串行数据端口的格式为I2S 24-bit二进制补码。
默认的数据格式为I2S (二进制补码),MSB 优先。
从机串行数据端口的格式为I2S 24-bit二进制补码。每个WS立体声数据帧对应64 个SCK 周期(fSCK = 64 × fWS)。;每个数据字必须对应32个SCK 周期。L/R控制引脚决定ADMP441从左通道还是右通道输出数据。
图1 硬件连接图
图2 立体声输出I2S时序图
3 stm32中I2S配置
3.1管脚映射
stm32的大容量产品和互联型产品支持I2S音频协议(本文档使用stm32f103fzet6)。可以将SPI模块用作I2S音频接口。I2S和SPI共用3个引脚:
● SD:串行数据(映射至MOSI引脚),用来发送和接收2路时分复用通道的数据(PB15);
● WS:字选(映射至NSS引脚),主模式下作为数据控制信号输出,从模式下作为输入(PB12);
● CK:串行时钟(映射至SCK引脚),主模式下作为时钟信号输出,从模式下作为输入(PB13)。
● MCK:主时钟(独立映射),在I2S 配置为主模式,寄存器SPI_I2SPR的MCKOE位为’1’时,作为输出额外的时钟信号引脚使用。输出时钟信号的频率预先设置为256×Fs,其中Fs是音频信号的采样频率。(ADMP441用不到)
3.2参数说明和配置
●模式配置(IS_I2S_MODE):设置寄存器SPI_I2SCFG[1:0]选择I2S主模式和方向。
00: 从设备发送(I2S_Mode_SlaveTx);
01: 从设备接收(I2S_Mode_SlaveRx);
10: 主设备发送(I2S_Mode_MasterTx);
11: 主设备接受(I2S_Mode_MasterRx)。
主设备输出WS,SCK;从设备WS,SCK作为输入信号。
发送端输出SD;接收端SD作为输入信号。
图3 I2S模式配置
●数据格式(IS_I2S_DATA_FORMAT)
IS_I2S_DATA_FORMAT |
IS_I2S_STANDARD |
I2S_DataFormat_16b (16位全精度) |
I2S_Standard_Phillips(飞利浦规定的格式) |
I2S_DataFormat_16bextended(16位扩展32位) |
I2S_Standard_MSB(日本格式、普通格式) |
I2S_DataFormat_24b(24位帧) |
I2S_Standard_LSB(较少使用) |
I2S_DataFormat_32b(32位全精度) |
I2S_Standard_PCMShort |
ADMP使用飞利浦24bit标准的I2S格式。如果只是读取前16bit的数据,也可以使用。在I2S 配置阶段,如果选择将16位数据扩展到32位声道帧,只需要访问一次寄存器SPI_DR。用来扩展到32位的低16位被硬件置为0x0000。接收时,每次收到高16位半字(MSB) 后,标志位RXNE 置’1’ ,如果允许了相应的中断,则可以产生中断。这样,在2次读和写之间有更多的时间,可以防止下溢或者上溢的情况发生。在使用16位数据扩展到32位帧时,前16位(MSB) 是有意义的数据,后16位(LSB) 被强制为0,该操作不需要软件干预,也不需要有DMA请求(仅需要一次读/ 写操作)。
ADMP取24bit数据时,24位数据帧需要CPU对寄存器SPI_DR进行2 次读或写操作,在使用DMA时,需要2 次DMA传输。对于24位数据,扩展到32位后,最低8位由硬件置0。如果接收0X8EAA33,第一次读SPI_DR得到0X8EAA,第二次读SPI_DR得到0X3300,只有高8位有效,低8位始终是00。
图5 Phillips_I2S_DataFormat_16b
3.3代码配置
●GPIO
//Configure the GPIO Pins for I2S
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOB, GPIOC and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOF | RCC_APB2Periph_AFIO, ENABLE);
/* I2S2 SD, CK and WS pins configuration */
/*I2S2_SD-PB15;I2S2_ CK-PB13;I2S2_WS-PB12*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
●I2S
// Initialise and Configure the Mode for I2S
I2S_InitTypeDef I2S_InitStructure;
/* Enable I2S peripheral clocks*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/*Reset SPI2*/
SPI_I2S_DeInit(SPI2);
I2S_InitStructure.I2S_Mode = I2S_Mode_MasterRx; I2S_InitStructure.I2S_Standard = _I2S_Standard_Phillips;
I2S_InitStructure.I2S_DataFormat = _I2S_DataFormat_16bextended;
I2S_InitStructure.I2S_AudioFreq = _I2S_AudioFreq_8k;
/*I2S clock steady state is low level */
I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S_Init(SPI2, &I2S_InitStructure);
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE);
I2S_Cmd(SPI2, ENABLE);
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
●NVIC
//Initialise the Nested Vectored Interrupt Controller
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
●SPI2_IRQHandler
extern uint32_t usData;
extern uint32_t usData1;
void SPI2_IRQHandler(void)
{
usData = SPI_I2S_ReceiveData(SPI2);
if (SPI_I2S_GetFlagStatus(SPI2, I2S_FLAG_CHSIDE) != SET) /*if it is left chanel*/
usData1 = usData;}
4实验结果
图6 逻辑分析仪采集(D1:SCK;D2:WS;D3:SD)
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/82095.html