恩智浦的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多路復用連接方式作為參考。
1.2 RT600 DMIC硬件架構
i.MX RT600總共包含8個DMIC通道,可以從多路的數字麥克風設備采集PDM數據,經過內部一系列處理后,就可以得到16bits或24bits的PCM數據,並支持CPU或DMA直接訪問。每個DMIC通道的內部框圖如下所示。
從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寄存器的SATURATEAT16BIT和SIGNEXTEND位來控制。
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數據的過程。
二、應用
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所示。
在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從設備,讀寫命令的操作時序如圖所示。
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,需要注意以下幾點:
- DMIC音頻采集板與RT600 EVK板的J31連接。
- 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 |
- 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) |
- 音頻揚聲器插入CS42888音頻板的J11,J12,J13,J14,J15和J16端口。
- 對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”來實現。
至此,RT600之DMIC外設介紹完畢。