I2S总线为数字音频应用提供了一个标准的通信接口。它是一条3线串行总线,包含串行数据SD、字选择WS、串行时钟SCK。LPC1788的I2S接口提供了彼此独立的发送和接收通道,每个通道可以作为主机或从机,还提供了可选的过采样主机时钟输出MCLK。因此发送和接收通道各有四个引脚,对于发送为I2S_TX_CLK、I2S_TX_WS、I2S_TX_SDA、I2S_TX_MCLK。I2S的时序如图1。
图1:I2S时序
从图中可以看出每个串行时钟SCK传送一位音频信号,因此SCK的频率=声道数X采样频率X采样位数。如程序中44.1KHZ采样的16位立体音,对应的SCK频率为2X16X44100HZ。WS是字段选择,也称为帧时钟,他的一个周期正好传输一帧数据。在WS改变后,数据字在发送时钟的下一个下降沿上开始。即图中MSB位在WS下降沿的下一个SCK时钟出现。在立体声模式下,当WS为低电平时发送左声道数据,当WS为高电平时发送右声道数据。如果是单声道模式,相同的数据会在WS的高低电平各发送一次。因此,要正确的通过I2S总线进行音频信号的传送,关键要正确配置传输速率。对于LCP1778,我们通过配置数字音频输出寄存器I2SDAO配置音频数据的宽度、声道数、和WS的周期。程序中的音频数据为44.1KHZ采样的16位立体音,因此I2SDAO中的WS_halfperiod字段配置成16-1,因为WS低电平和高电平各发送16位数据。配置SCK要设置2个寄存器,首先配置发送时钟速率寄存器I2STXRATE,通过它配置分数速率发生器以分频CCLK得到I2S TX_REF=CCLKX(X/Y)/2;如果我们使能了MCLK输出时,RX_REF就发送到MCLK管脚。其次,配置位发送时钟位速率寄存器I2STXBITRATE,该寄存器的值加1用来分频TX_REF得到SCK频率。
对I2S控制器配置完成后,我们可以将要发送的音频数据写入发送FIFO,FIFO的大小为8个字。而且发送和接收通道仅接收32位对齐的数据,因此对较短的数据我们要进行扩展才能写入FIFO进行发送。
对于总线上的状态,将在状态反馈寄存器I2SSTATE中进行指示,主要有中断和DMA请求的指示以及FIFO的当前深度指示。对于中断我们可以配置中断请求控制寄存器I2SIRQ设置FIFO触发中断的深度。