i.MX RT600之DMIC外設介紹及應用


恩智浦的i.MX RT600是跨界處理器產品,同樣也是i.MX RTxxx系列的開山之作。不同於i.MX RT1xxx系列單片機,i.MX RT600 采用了雙核架構,將新一代Cortex-M33內核與高性能Cadence Tensilica HiFi 4 音頻DSP內核相結合,適用於32位沉浸式音頻播放和視頻用戶界面應用。i.MX RT600旨在通過安全、功率優化的嵌入式處理器充分挖掘語音輔助終端節點的潛力,因此針對音頻數據的采集、傳輸和處理,i.MX RT600都有豐富的硬件資源進行支持。其中,針對RT600的DMIC外設,本文詳細地進行了介紹,並基於i.MX RT600 EVK開發板,在RT600的DSP端(HiFi4)實現了一個8通道音頻數據采集的demo。

一、DMIC介紹

1.1 DMIC 接口

DMIC接口也稱雙/立體聲數字麥克風接口。i.MX RT600提供了最多8通道的PDM(脈沖密度調制)數字接口,共8根引腳,其中4根時鍾引腳為PDM接口的數字麥克風提供時鍾參考,4根數字引腳能夠從PDM接口的數字麥克風上采集數據。每個PDM接口都支持兩個單通道麥克風或單個立體聲麥克風的連接選項,下圖給出了本次應用中采用的8通道DMIC多路復用連接方式作為參考。

avatar

1.2 RT600 DMIC硬件架構

i.MX RT600總共包含8個DMIC通道,可以從多路的數字麥克風設備采集PDM數據,經過內部一系列處理后,就可以得到16bits或24bits的PCM數據,並支持CPU或DMA直接訪問。每個DMIC通道的內部框圖如下所示。

avatar

從DMIC內部通道的框圖可以看出,PDM數據到PCM轉換的濾波過程包括四個階段。

第一階段,從CIC濾波器開始,它是結合了抽取器的FIR濾波器。 CIC濾波器以給定的過采樣率將來自數字麥克風的PDM數據轉換為PCM數據,該采樣率可以被OSR寄存器配置。

第二階段,PCM數據由半帶抽取濾波器處理后頻率降為原來的一半,同時經過這一階段后,補償了音頻帶上限的滾降。

第三階段,同第二階段一樣,PCM數據經過一個半帶抽取濾波器處理,頻率降為原來的一半。

第四階段,DC濾波器用於消除了音頻信號中任何不需要的直流分量。

另外,為了實現更低的功耗,將Use 2FS register寄存器中的USE2FS位置1可以繞過第二個半帶抽取濾波器,並為DC濾波器提供2FS而不是1FS信號。當通過CPU或DMA從FIFO中讀取PCM數據時,其位寬可以是16bit和24bit,這可以通過配置DCCTRL寄存器的SATURATEAT16BITSIGNEXTEND位來控制。

1.3 DMIC時鍾和采樣頻率計算

DMIC采樣頻率取決於三個方面:
1)DMIC接口基礎時鍾。
DMIC接口的基礎時鍾為整個DMIC外設提供一個參考時鍾,可以通過寄存器CLKCTL1 DMIC0CLKSEL和寄存器DMIC0CLKDIV進行配置。 DMIC外設的可選時鍾源如下圖所示,包括SFRO,FFRO,audio_pll_clk, mclk_in,1m_lposc和32k_wake_clk。

2)提供給數字麥克風設備的DMIC采樣時鍾。
這里的DMIC采樣時鍾用於提供給連接在DMIC外設上的數字麥克風設備一個PDM基准采樣頻率。當然這個頻率的范圍是有限制的,最高不超過6.144MHz,這就導致DMIC的基礎時鍾的頻率不應超過24.576MHz。
3)PCM采樣頻率。
由上面的DMIC通道內部框圖可知,從DMIC采集得到PDM數據,再經過一些列濾波器處理后,最終得到的PCM數據的頻率是降低的。它們之間的關系如下:
PCM采樣頻率= DMIC采樣時鍾頻率 /(N * OSR),其中2 FS模式時,N = 2; 1 FS模式,N = 4)

以本文介紹的demo配置為例,DMIC采樣時鍾頻率配置為3.072MHz,DMIC通道配置為2 FS模式(N=2),OSR設置為32,那么可以得到:

PCM采樣頻率 = DMIC采樣時鍾頻率 / (N * OSR) = 3.072MHz / (2 * 32) = 48KHz

該頻率正是本次應用中DMIC外設得到的PCM數據的采樣頻率。

1.4 FIFO和DMA支持

DMIC FIFO中PCM數據的有效寬度可以是16位或24位,DMIC提供了兩種訪問FIFO數據的方式:CPU或DMA直接訪問。通過配置FIFO的觸發級別,選擇中斷或DMA的方式,就可以將PCM數據從FIFO復制到SRAM。下圖顯示了通過DMA復制DMIC FIFO數據的過程。

avatar

二、應用

2.1 系統架構

在此應用中,8通道DMIC音頻數據采集的整個架構如圖所示。HiFi4控制8通道DMIC接口從DMIC音頻板接收PDM數據,CS42888編解碼器通過I2S接口接收HIFI4處理過后的PCM數據,並將其傳輸到揚聲器進行實時播放。

2.2 CS42888 Codec介紹

CS42888是高度集成的24位音頻編解碼器,包含具備delta-sigma技術的4個模數轉換器(ADC)和8個數模轉換器(DAC),8個DAC通道均提供數字音量控制,並可以使用差分或單端輸出進行操作。 CS42888的DAC串行端口支持I2S TDM音頻數字接口格式,位深度從16到24不等,並允許時分復用(TDM)接口格式的DAC通道多達8個。CS42888支持的TDM時序圖如圖7所示。

avatar

在DAC_LRCK上升沿之后的第二個DAC_SCLK上升沿,首先接收TDM數據的最高有效位(MSB)。 所有數據在DAC_SCLK的上升沿有效,在DAC_SCLK的下降沿發送。從圖中可以注意到, CS42888在TDM模式下要求每一通道的PCM數據占32個時鍾周期,也就是32bit的位寬,並且DAC_SCLK必須是PCM數據采樣頻率的8倍。因此在配置I2S的時候需要遵從這幾個注意事項。

2.3 DMIC配置

DMIC的采樣頻率與1.3小節中的舉例一致,並為了得到48kHz的PCM采樣頻率,需要進行如下配置:

  • DMIC時鍾源:audio_pll_clk
  • DMIC外圍輸入時鍾:24.576MHz
  • DMIC時鍾分頻器:8
  • DMIC時鍾頻率:3.072MHz
  • OSR寄存器:32
  • FS模式:2FS
  • DMIC采樣位寬:16bit

因此,DMIC PCM采樣率 = DMIC采樣時鍾頻率 / (N * OSR) = 3.072MHz / 2 / 32 = 48kHz

以下代碼給出了每一路DMIC通道的具體配置:

/* dmic channel configurations */
static dmic_channel_config_t s_dmicChannelConfig = {
    .divhfclk            = kDMIC_PdmDiv1,
    .osr                 = 32U,
    .gainshft            = 3U,
    .preac2coef          = kDMIC_CompValueZero,
    .preac4coef          = kDMIC_CompValueZero,
    .dc_cut_level        = kDMIC_DcCut155,
    .post_dc_gain_reduce = 1U,
    .saturate16bit       = 1U,
    .sample_rate         = kDMIC_PhyFullSpeed,
    .enableSignExtend    = false,
};

2.4 Flexcomm配置

i.MXRT600上最多提供8個多功能Flexcomm接口。 在此應用程序中,Flexcomm2被配置為I2C接口。CS42888提供了標准的I2C控制接口,並支持所有功能的軟件配置。因此,HiFi4利用I2C對CS42888進行初始化,配置為TDM工作模式。CS42888作為I2C從設備,讀寫命令的操作時序如圖所示。

avatar

Flexcomm4接口在本應用中配置為I2S接口,用於傳輸DMIC采集的8通道PCM數據。DMIC采集的PCM數據的采樣頻率為48kHz,I2S采樣頻率需保持一致。下面是I2S采樣頻率的配置參數:

  • I2S時鍾源:audio_pll_clk

  • I2S時鍾源頻率:24.576MHz

  • MCLK頻率:12.288MHz

  • I2S傳輸模式:TDM

  • I2S聲道數:8

  • I2S聲道位寬:32bit

  • I2S BCLK = WS * 聲道數 * 聲道位寬 = 48KHz * 8 * 32 = 12.288MHz

  • I2S_DIV (I2S分頻系數) = audio_pll_clk / BCLK = 24.576MHz / 12.288MHz = 2

2.5 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和中斷的具體配置:

#define XCHAL_EXTINT19_NUM		23	/* (intlevel 2) */
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); 

2.6 音頻數據流的處理

為了能夠將8通道DMIC采集的音頻數據發送到CS42888音頻板並播放,根據CS42888數據手冊,我們需要將CS42888配置成TDM模式。在TDM模式下,CS42888接收的PCM數據位寬必須是32bit,其有效數據范圍可以是16位到24位。為此,本應用中我們需要軟件程序將DMIC采集到的16bit位寬的PCM數據處理為32bit位寬,下面我們就介紹該方法。

首先,DMIC采集到的每一通道的PCM數據都利用了ping-pong buffer的形式放在對應的緩沖區,而RT600的DMA支持了最多4通道DMIC的數據搬移。因此,采用DMA memory to memory的功能,我們可以把DMIC的4通道PCM數據搬到一個固定的緩沖區(假設為BUFFER1),但是這個BUFFER1中4通道的PCM數據是有固定間隔的,間隔的大小為48bit。有的小伙伴或許這里有疑惑了,為什么間隔的大小是48bit,而不是32或16bit呢?我們接下來慢慢分析。

正是由於DMIC和DMA外設的限制,導致DMA一次只能搬運4通道16bit的PCM數據,假如BUFFER0沒有被操作的內存地址已經初始化為0x00,那么我們就可以把那些內存地址上為0x00的地址與PCM數據拼湊成32bit的PCM數據,PCM數據的有效位依舊是16bit,滿足CS42888的要求。PCM數據間隔大小為48bit是針對16bit的PCM數據,那針對於32bit的PCM數據來說,這4通道的PCM數據在BUFFER1上的間隔就是32Bbit。

看到這里相信讀者已經明白了8通道的PCM數據該怎么處理了,沒錯,只需要另外再開啟1路DMA,還是采用DMA memory to memory的功能,就可以將另外DMIC的4通道PCM數據搬移到BUFFER1內存空間上那些間隔出來的32bit位寬的地址上。

整個DMIC采集的8通道PCM數據后續軟件過程如下圖所示。

接下來,HiFi4控制一路I2S將處理成TDM格式的PCM數據傳輸到CS42888編解碼器。為了能夠流暢地播放音頻流數據,與RT600之I2S外設介紹及應用中介紹的處理方法一樣,筆者采用了如下圖所示的方法。圖中,總共3個緩沖區用於處理PCM數據,這3個緩沖區構成一個閉環。每個緩沖區為1024字節,包含32幀PCM數據,每一幀包含8包32bit的PCM數據。 每當一個緩沖區中的PCM數據接收滿時,下一個緩沖區將立即開始接收,發送也同理。因為本次應用中需要處理的PCM數據有8路,數據量比較大,因此采用ring buffer的機制能夠保證數據傳輸的穩定和可靠。

三、RT600 硬件演示平台搭建

8通道DMIC音頻數據采集demo基於i.MX RT600 EVK RevE板子實現,整個硬件平台包括4部分:QSPI NOR Flash板子,DMIC音頻采集板,CS42888音頻板和i.MX RT600 EVK板,如下圖所示。

為了演示該demo,需要注意以下幾點:

  1. DMIC音頻采集板與RT600 EVK板的J31連接。
  2. CS42888音頻板與RT600 EVK板進行連接,連接情況如表所示:
CS42888 audio board RT600 EVK board
A4 PIN (GND) J25 PIN2
A5 PIN (BCLK) J27 PIN3
A6 PIN (WS) J27 PIN2
A8 PIN (TX) J27 PIN1
A9 PIN (3V3) J29 PIN2
A11 PIN (RESET) J28 PIN1
A13 PIN (5V) J29 PIN8
A16 PIN (1V8) JP10 PIN1
B5 PIN (SCL) J28 PIN10
B6 PIN (SDA) J28 PIN9
B12 PIN (MCLK) J27 PIN6
  1. QSPI NOR Flash板和RT600 EVK板的連接,如下表所示。Flexspi Port B和RT600 EVK板的DMIC之間的硬件連接存在沖突,如果使用DMIC,則不能使用Flexspi Port B,因此需要單獨外接一塊Flash。
QSPI NOR flash board RT600 EVK board
PIN_3V3 J28 PIN8 (3V3)
PIN_GND J28 PIN7 (GND)
PIN_CLK J28 PIN6 (CLK)
PIN_IO1 J28 PIN5 (MISO )
PIN_IO0 J28 PIN4 (MOSI )
PIN_IO2 JS15 PIN1 (3V3)
PIN_IO3 J29 PIN4 (3V3)
PIN_CS J28 PIN3 (SS0)
  1. 音頻揚聲器插入CS42888音頻板的J11,J12,J13,J14,J15和J16端口。
  2. 對RT600 EVK板進行改動:
  • 去掉R379-A,R380-A,R384-A,R389-A,R390-A,R391-A,R392-A,R393-A這些電阻。
  • 用0歐姆電阻焊接R379-B,R380-B,R384-B,R389-B,R390-B,R391-B,R392-B,R393-B這些位置。
  • 將ISP開關(SW5)切為(ON OFF OFF),然后將demo的image文件下載到QSPI NOR閃存中。 之后再將ISP開關(SW5)切為(ON OFF ON),並使RT600從QSPI NOR Flash啟動。 具體的實現方法可以參考恩智浦官方的應用文檔AN12751“How to Enable Recovery Boot from QSPI Flash”來實現。

avatar

至此,RT600之DMIC外設介紹完畢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM