恩智浦的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。html
DMIC接口也稱雙/立體聲數字麥克風接口。i.MX RT600提供了最多8通道的PDM(脈衝密度調製)數字接口,共8根引腳,其中4根時鐘引腳爲PDM接口的數字麥克風提供時鐘參考,4根數字引腳可以從PDM接口的數字麥克風上採集數據。每一個PDM接口都支持兩個單通道麥克風或單個立體聲麥克風的鏈接選項,下圖給出了本次應用中採用的8通道DMIC多路複用鏈接方式做爲參考。安全
i.MX RT600總共包含8個DMIC通道,能夠從多路的數字麥克風設備採集PDM數據,通過內部一系列處理後,就能夠獲得16bits或24bits的PCM數據,並支持CPU或DMA直接訪問。每一個DMIC通道的內部框圖以下所示。架構
從DMIC內部通道的框圖能夠看出,PDM數據到PCM轉換的濾波過程包括四個階段。post
第一階段,從CIC濾波器開始,它是結合了抽取器的FIR濾波器。 CIC濾波器以給定的過採樣率未來自數字麥克風的PDM數據轉換爲PCM數據,該採樣率能夠被OSR寄存器配置。性能
第二階段,PCM數據由半帶抽取濾波器處理後頻率降爲原來的一半,同時通過這一階段後,補償了音頻帶上限的滾降。flex
第三階段,同第二階段同樣,PCM數據通過一個半帶抽取濾波器處理,頻率降爲原來的一半。優化
第四階段,DC濾波器用於消除了音頻信號中任何不須要的直流份量。3d
另外,爲了實現更低的功耗,將Use 2FS register寄存器中的USE2FS位置1能夠繞過第二個半帶抽取濾波器,併爲DC濾波器提供2FS而不是1FS信號。當經過CPU或DMA從FIFO中讀取PCM數據時,其位寬能夠是16bit和24bit,這能夠經過配置DCCTRL寄存器的SATURATEAT16BIT和SIGNEXTEND位來控制。code
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 = 1)
以本文介紹的demo配置爲例,DMIC採樣時鐘頻率配置爲3.072MHz,DMIC通道配置爲2 FS模式(N=2),OSR設置爲32,那麼能夠獲得:
PCM採樣頻率 = DMIC採樣時鐘頻率 / (N * OSR) = 3.072MHz / (2 * 32) = 48KHz
該頻率正是本次應用中DMIC外設獲得的PCM數據的採樣頻率。
DMIC FIFO中PCM數據的有效寬度能夠是16位或24位,DMIC提供了兩種訪問FIFO數據的方式:CPU或DMA直接訪問。經過配置FIFO的觸發級別,選擇中斷或DMA的方式,就能夠將PCM數據從FIFO複製到SRAM。下圖顯示了經過DMA複製DMIC FIFO數據的過程。
在此應用中,8通道DMIC音頻數據採集的整個架構如圖所示。HiFi4控制8通道DMIC接口從DMIC音頻板接收PDM數據,CS42888編解碼器經過I2S接口接收HIFI4處理事後的PCM數據,並將其傳輸到揚聲器進行實時播放。
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的時候須要聽從這幾個注意事項。
DMIC的採樣頻率與1.3小節中的舉例一致,併爲了獲得48kHz的PCM採樣頻率,須要進行以下配置:
所以,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, };
i.MXRT600上最多提供8個多功能Flexcomm接口。 在此應用程序中,Flexcomm2被配置爲I2C接口。CS42888提供了標準的I2C控制接口,並支持全部功能的軟件配置。所以,HiFi4利用I2C對CS42888進行初始化,配置爲TDM工做模式。CS42888做爲I2C從設備,讀寫命令的操做時序如圖所示。
Flexcomm4接口在本應用中配置爲I2S接口,用於傳輸DMIC採集的8通道PCM數據。DMIC採集的PCM數據的採樣頻率爲48kHz,I2S採樣頻率需保持一致。下面是I2S採樣頻率的配置參數:
MCLK頻率:12.288MHz
I2S_DIV (I2S分頻係數) = audio_pll_clk / BCLK = 24.576MHz / 12.288MHz = 2
在RT600上作音頻數據的處理推薦用DMA,從而減小對CPU資源的消耗。DMA在RT600上推薦的用法是CM33核使用DMA0,而HiFi4使用DMA1。此外,在HiFi4中使用DMA與在CM33端是有必定區別的,這個主要體如今如下幾點:
這些註冊的中斷與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);
爲了可以將8通道DMIC採集的音頻數據發送到CS42888音頻板並播放,根據CS42888數據手冊,咱們須要將CS42888配置成TDM模式。在TDM模式下,CS42888接收的PCM數據位寬必須是32bit,其有效數據範圍能夠是16位到24位。爲此,本應用中咱們須要軟件程序將DMIC採集到的16bit位寬的PCM數據處理爲32bit位寬,下面咱們就介紹該方法。
首先,DMIC採集到的每一通道的PCM數據都利用了ping-pang 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的機制可以保證數據傳輸的穩定和可靠。
8通道DMIC音頻數據採集demo基於i.MX RT600 EVK RevE板子實現,整個硬件平臺包括3部分:DMIC音頻採集板,CS42888音頻板和i.MX RT600 EVK板,以下圖所示。
爲了演示該demo,須要注意如下幾點:
DMIC音頻採集板與RT600 EVK板的J31鏈接。
CS42888音頻板與RT600 EVK板進行鏈接,鏈接狀況如表所示:
CS42888 audio board | RT600 EVK board |
---|---|
A4 PIN | J26 PIN1 (GND) |
A5 PIN | J27 PIN3 (BCLK) |
A6 PIN | J27 PIN2 (WS) |
A8 PIN | J27 PIN1 (TX) |
A9 PIN | J29 PIN4 (3V3) |
A11 PIN | J28 PIN1 (RESET) |
A13 PIN | J29 PIN8 (5V) |
A16 PIN | JS2 PIN1 (1V8) |
B5 PIN | J28 PIN10 (SCL) |
B6 PIN | J28 PIN9 (SDA) |
B12 PIN | J27 PIN6 (MCLK) |
音頻揚聲器插入CS42888音頻板的J11,J12,J13,J14,J15和J16端口。
對RT600 EVK板進行改動:
至此,RT600之DMIC外設介紹完畢。