RT600 I2S外设介绍及应用 (2)

RT600 I2S外设介绍及应用

二、应用 2.1 系统架构

在此应用中,音频数字回环demo的整个架构如图所示。WM8904编解码器通过音频数据线来接收音频信号。音频信号经过WM8904后会转变成PCM信号。HiFi4通过一路I2S接口连续不断地接收PCM信号,并使用另一个I2S接口将PCM信号发送回WM8904编解码器,最后WM8904编解码器输出的音频信号会给播放设备实时播放。另外,HiFi4利用一路I2C接口对WM8904进行初始化配置操作。

2.2 时钟配置及采样频率计算

在RT600上使用I2S外设做音频数字回环的关键一步是选择I2S外设的时钟源,以及配置I2S的采样频率。

首先需要确定MCLK和I2S的时钟源。 如图所示,MCLK有两个时钟源,分别是48/60m_irc和audio_pll-clk,而I2S至少有5个时钟源。 在此应用中,我们把MCLK和I2S的时钟源均设置为audio_pll_clk。

RT600 I2S外设介绍及应用

配置完MCLK和I2S外设的时钟源后,下一步就是根据实际应用需求配置MCLK的时钟频率和I2S的时钟频率。 I2S的采样频率通常有两大类,下表列出了这两类典型的I2S采样频率。一旦I2S的采样频率确定了,那WS信号的频率也就确定了。

Typical Sample Frequency (Hz) Typical Sample Frequency (Hz)
11025   8000  
22050   16000  
44100   24000  
--------   32000  
--------   48000  
--------   96000  

对于RT600来说,I2S采样频率是由I2S的时钟源分频得到的,而WS采样频率有上表所列的两大类,为了能够精确地通过时钟分频系数来计算得到这些典型的采样频率,笔者根据经验总结,将I2S的时钟输入源配置为11.289MHz和24.576MHz是比较容易和推荐的。如果I2S的时钟源为11.289MHZ,那么44.1KHz可以通过对其分频得到;如果I2S的时钟源为24.576MHZ,那么96KHz或者48KHz也可以通过对其分频得到。

在音频数字回环的demo中,选择的信号源为PC端48KHz,16bit的立体声(左右声道)音频信号。我们以此来计算并配置时钟,过程如下:

将时钟源audio_pll_clk配置为24.576MHZ,即audio_pll_clk = 24.576MHZ

WS = 48KHz

MCLK = audio_pll_clk = 24.576MHZ

BCLK = WS * 声道数 * 声道位宽 = 48KHz * 2 * 16 = 1.536MHz

I2S_DIV (I2S分频系数) = audio_pll_clk / BCLK = 24.576MHz / 1.536MHz = 16

此外,在本应用中还需要将I2S模式配置为经典I2S模式。
以下代码给出了I2S时钟的具体配置:

#define DEMO_AUDIO_BIT_WIDTH (16) #define DEMO_AUDIO_SAMPLE_RATE (48000) #define DEMO_I2S_CLOCK_DIVIDER 24576000/2/16/48000 /* attach AUDIO PLL clock to FLEXCOMM1 (I2S1) */ CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM1); /* attach AUDIO PLL clock to FLEXCOMM3 (I2S3) */ CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM3); /* attach AUDIO PLL clock to MCLK */ CLOCK_AttachClk(kAUDIO_PLL_to_MCLK_CLK); CLOCK_SetClkDiv(kCLOCK_DivMclkClk, 1); SYSCTL1->MCLKPINDIR = SYSCTL1_MCLKPINDIR_MCLKPINDIR_MASK; /* Set shared signal set 0: SCK, WS from Flexcomm1 */ SYSCTL1->SHAREDCTRLSET[0] = SYSCTL1_SHAREDCTRLSET_SHAREDSCKSEL(1) | SYSCTL1_SHAREDCTRLSET_SHAREDWSSEL(1); /* Set flexcomm3 SCK, WS from shared signal set 0 */ SYSCTL1->FCCTRLSEL[3] = SYSCTL1_FCCTRLSEL_SCKINSEL(1) | SYSCTL1_FCCTRLSEL_WSINSEL(1); s_TxConfig.divider = DEMO_I2S_CLOCK_DIVIDER; s_RxConfig.divider = DEMO_I2S_CLOCK_DIVIDER; 2.3 WM8904 Codec介绍

WM8904是为便携式音频应用而优化的高性能超低功耗立体声编解码器。 WM8904使用标准的I2C总线控制接口,提供对WM8904所有功能的软件配置。 在本应用中,WM8904作为I2C从设备,HiFi4可以通过I2C接口与编解码器通信,并且可以使用I2C进行编解码器初始化和配置。WM8904的单个寄存器的读写操作时序图如下所示。 为了允许在同一接口上仲裁多个从机(或多个主机),WM8904通过使SDA引脚处于三态(而不是将其拉高)来发送逻辑1,因此需要一个外部上拉电阻来将SDA拉高。

同样WM8904也需要被配置为经典I2S模式,其示意图如下所示。可以对比发现,与我前文介绍的经典I2S模式是一致的。在检测到LRCLK边沿后,MSB在BCLK的第二个上升沿可用。 然后按顺序传输直到最低位。另外,可以看到在一个采样的LSB和下一个采样的MSB之间有可能会存在未使用的BCLK时钟信号,这个跟WM8904被配置的采样位有关。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzszyz.html