RT600 I2S周辺機器導入と応用

NXPのi.MX RT600クロスボーダープロセッサは、また、i.MX RTxxxシリーズのパイオニアです。i.MX RT1xxx MCU、i.MX RT600は異なり、デュアルコアアーキテクチャ、32ビットのビデオとオーディオプレーヤーのユーザーインタフェースのための高性能コアのCortex-M33ケイデンステンシリカのHiFi 4オーディオDSPコアの新世代、浸漬と組み合わせますアプリケーション。完全音声支援端末ノードの電位をタップし、電力最適化された組込みプロセッサを確保するi.MX RT600の目的は、収集、伝送および処理のための音声データに、i.MX RT600は、ハードウェアリソースのサポートを豊富に有しています。前記、I2S周辺RT600ため、紙はi.MX RT600 EVK開発ボードに基づいて、詳細に説明し、RT600端におけるDSP(HiFi4)を実装オーディオデジタルループバックのデモ。

A、I2S紹介

1.1 I2Sインターフェース

I2Sバスは、フィリップス社によって開発されたデジタルオーディオストリームを伝送するための標準的な通信インターフェースを提供します。I2Sバス仕様、すなわち、3線式シリアルバスを定義します。

1、データラインSDAのビットクロックであるシリアルクロックSCK(BCLKもビットクロックと呼びます)。各データビットに対応するSDAは、SCLKパルスを生成しなければなりません。

ステレオPDMのための単一のデータフォーマットの大部分を有する2、WSフレームクロック(LRCKも知られている、またはFSYNC)、左及び右チャネルデータを切り替えるためのWS、DSPで使用されるフレームデリミタまたはTDMモード。さらに、周波数をサンプリングI2Sは、周波数WSによって決定されます。

図3に示すように、シリアルデータ(SDA)は、オーディオデータストリームは、単一のSDAオーディオデータストリームのバイナリ表現であり、データストリームは、種々のフォーマットを有してもよいです。

実用的なアプリケーションで三つ以上に加えて、バスインタフェースI2Sは、MCLK(マスターCLK)のクロックを必要とします。特定のシステムのI2Sでは、I2Sスレーブ装置は、ビットクロックMCLKを構築する必要があるかもしれません。一般的には、サンプリングレート(FS)は、例えばの256fs、は64fsなど、の整数倍です。

1.2 RT600 I2Sハードウェアアーキテクチャ

i.MX RT600は、デジタルオーディオデータのための送信I2Sインタフェースに構成されていてもよい5〜7構成ユニバーサルシリアルインタフェースモジュール(Flexcommインターフェース)、Flexcomms 0の合計を含んでいます。次の図に示す図I2Sサブシステムの全体的なアーキテクチャは、集積I2S FIFOとDMAサポートを構成する各モジュールは、それぞれのI2Sインタフェースは、データの4つのチャネルをサポートします。

アバター

1.3 I2Sフレームフォーマット

ここではフレームフォーマットを提供し、当社のi.MX RT600 I2S周辺機器上、I2Sインターフェース定義かけて導入。

まず、古典的なパターンI2S(クラシックI2Sモード)であり、古典的なパターンは、WSステータスフラグは、変換後(下)チャンネルと右(高い)チャネル、およびWSを左前記仕様定義SDA上の2チャンネルステレオデータを、I2S 1クロックSCKによって遅延されたデータ。以下の概略図に示される古典I2Sモード。

アバター

第2のモードはDSPモード(DSPモード)です。DSPモードでは、WSは、左右のチャンネルのデータを識別するために使用されていないが、チャネルモードのオーディオデータは、ビットストリームにパック。このモードでは、パケットの完全なオーディオデータストリームは、WSフレームの立ち上がりエッジから始まります。WSを変化させることによって、DSPモードは、それぞれ、以下に示す三つのモード、50%WSとDSPモードを進化させることができる、DSPモード1とSCKは、WSのパルス1つのスロットとWSとDSPモードをパルス。

第三の態様は、TDMモードです。TDMモードはクラシックモード又はI2Sモードで使用することができるDSPと連携して、ビットストリームの形で送信された音声データ(左チャンネル)の4チャンネルまで充填することができます。下に示した古典的なTDM I2Sモード、オーディオデータスロットの4対(8チャンネルのオーディオデータ)の合計、フレームフォーマットを介してSDAバスで伝送するための模式図に示すように。

当然这边需要注意的是,RT600上I2S的SDA总线能发送最多4对Slot音频数据。另外寄存器”Configuration 1“和 ”Configuration register 1 for channel pairs 1, 2, and 3“ 中的ONECHANNEL位决定了I2S的数据通道是否为单通道模式,例如:如果ONECHANNEL设置为0,那么该通道的I2S数据流会被I2S总线视为左右声道数据,如果ONECHANNEL设置为1,那么该通道对的I2S数据流被视为单个声道数据。以上所有举例的帧格式示意图都是以ONECHANNEL=0为基础的。

除了经典I2S模式下的TDM,还有在DSP模式下的TDM格式帧,下图展示的是TDM在DSP modes with 1 SCK pulsed WS模式下的帧格式。因此,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。

配置完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被配置的采样位有关。

以下代码给出了WM8904的具体配置:

wm8904_config_t wm8904Config = {
    .i2cConfig          = {.codecI2CInstance = BOARD_CODEC_I2C_INSTANCE, .codecI2CSourceClock
                        = 19000000U},
    .recordSource       = kWM8904_RecordSourceLineInput,
    .recordChannelLeft  = kWM8904_RecordChannelLeft2,
    .recordChannelRight = kWM8904_RecordChannelRight2,
    .playSource         = kWM8904_PlaySourceDAC,
    .slaveAddress       = WM8904_I2C_ADDRESS,
    .protocol           = kWM8904_ProtocolI2S,
    .format             = {.sampleRate = kWM8904_SampleRate48kHz, .bitWidth 
                = kWM8904_BitWidth16},
    .mclk_HZ            = 24576000U,
    .master             = false,
};
static void I2C_Config(void)
{
  PRINTF("Configure WM8904 codec\r\n");
  /* protocol: i2s * sampleRate: 48K  * bitwidth:16*/
  if (CODEC_Init(codecHandle, &boardCodecConfig) != kStatus_Success)
  {
    PRINTF("WM8904_Init failed!\r\n");
  }
  /* Initial volume kept low for hearing safety. */
  CODEC_SetVolume(codecHandle, kCODEC_PlayChannelHeadphoneLeft  |kCODEC_PlayChannelHeadphoneRight, 0x0020);
}

2.4 DMA和中断配置

在RT600上做音频数据的处理推荐用DMA,从而减少对CPU资源的消耗。DMA在RT600上推荐的用法是CM33核使用DMA0,而HiFi4使用DMA1。此外,在HiFi4中使用DMA与在CM33端是有一定区别的,这个主要体现在以下几点:

  • 需要在XOS或XTOS中注册并启用HiFi4中断。
  • 在HiFi4中DMA操作的SRAM地址必须是non-cacheable。
  • 需要由使用INPUTMUX注册HiFi4中断。

这些注册的中断与HiFi4的连接关系如下表所示。表中除了提供所需的中断选择之外,还显示了各个中断的中断优先级。L1中断的优先级最低,而L3中断的优先级最高。

以下代码给出了HiFi4 DMA和中断的具体配置:

DMA_Init(DMA1);
/* XCHAL_EXTINT19_NUM, intlevel 2 */
INPUTMUX_AttachSignal(INPUTMUX, 18U, kINPUTMUX_Dmac1ToDspInterrupt); 
xos_register_interrupt_handler(XCHAL_EXTINT19_NUM,
                       (XosIntFunc *) DMA_IRQHandle, 
                     DMA1);
xos_interrupt_enable(XCHAL_EXTINT19_NUM);   
DMA_EnableChannel(DMA1, DEMO_I2S_TX_CHANNEL);
DMA_SetChannelPriority(DMA1, DEMO_I2S_TX_CHANNEL, kDMA_ChannelPriority3);
DMA_CreateHandle(&s_DmaTxHandle, DMA1, DEMO_I2S_TX_CHANNEL); 
DMA_EnableChannel(DMA1, DEMO_I2S_RX_CHANNEL); 
DMA_SetChannelPriority(DMA1, DEMO_I2S_RX_CHANNEL, kDMA_ChannelPriority2);
DMA_CreateHandle(&s_DmaRxHandle, DMA1, DEMO_I2S_RX_CHANNEL);

2.5 音频数据流的处理

MCU在同时接收和发送PCM数据并进行播放的应用场景中,容易出现播放音乐卡顿的情况,为了避免出现这种卡顿,一个好的传输机制是必不可少的,下图就给出了一个处理PCM数据的思路。

図示のように3つのPCMデータ送信(TX)および受信機(RX)、送信用バッファと受信データの合計がDMA要求チャネルI2Sの完了によってトリガされ、3つのバッファは、閉じたループを形成します。受信バッファPCMデータが一杯になるときはいつでも、次のバッファは、直ちに同じトークンも送信される受信開始され、データの送受信が同期されます。平野話すには、TX RX I2Sに追いつくず、常に準備ができて、バッファはTXとRXの間で持っているんI2S。図初期から見ることができ、DMA要求はDMA要求間でシームレスに最初からPCMの送受信を可能にするためであるI2Sの二倍のTXとRXを提出し、それを確保することが可能となる開始PCM伝送遅延は表示されません。

もちろん、バッファの数は、ユーザーの実際のニーズによって異なります。バッファは、典型的なピンポンバッファ(pingを-パンバッファ)を構成する2である場合。なぜ私はここに3つのバッファは、リングバッファではなく、単純なピンポンパンがそれをバッファ構成する使用していますか?PCMデータは、そのような私はDMIC 8チャンネルの獲得を発表しました別の記事のアプリケーションなど、より複雑であるとき、あなたはリングバッファのメカニズムを必要とするので、確かに一部の人々は非常に混乱します。

このアプリケーションでは、ビット幅は32ビットPCMデータである(16ビットは、左と右のチャンネル)、各バッファが8件のPCMデータが設けられており、各バッファの即ちPCMデータ長が256ビットです。PCMデータは、各バッファの長さに対応した各送信チャネルのデータ長は、オーディオデータをI2S RT600最大長サポート2048bitsを送信することができるI2Sもあり、この範囲を超えることができません。

ビルドするには、3つ、RT600ハードウェアデモンストレーションプラットフォーム

デモI2Sオーディオデジタルループバックを証明するために、図RT600 EVKレーヴに示すようにボードを持って、そしてまた次のことに注意する必要があります。

  • JP7.2に接続JP7.1。
  • JP8.2に接続JP8.1。
  • 入力オーディオ信号としてJ3ポート、PCに接続することができます。
  • スピーカーに接続されたオーディオ信号の出力としてJ4ポート、。
  • ISPスイッチ(SW5がある)、すなわち、ON、OFF、ON、0b010に切り替えます
  • ポートボードのJ6にUSB。

アバター

これまでのところ、I2S周辺機器の導入のRT600。

おすすめ

転載: www.cnblogs.com/jamesfan2019/p/12307944.html
RT