恩智浦的i.MX RT1010是跨界處理器產品,做爲i.MX RT跨界MCU系列的一個新的切入點,i.MX RT1010是成本最低的LQFP封裝方式與i.MX RT系列產品一向的高性能和易用性的結合產物。html
i.MX RT1010處理器基於ARM Cortex-M7平臺,它具備較高的CPU性能和最佳的實時響應,並具備豐富的外設資源。其中FlexIO是一個高度可配置的模塊,可以模擬多種不一樣的通訊協議,包括UART, I2C, SPI, I2S等。本文介紹如何利用i.MX RT1010的FlexIO外設來模擬I2S總線。編程
本應用筆記主要介紹如何使用FlexIO模塊模擬I2S接口,實現音頻數據的採集,傳輸並播放。使用FlexIO模塊模擬I2S總線信號,能夠代替傳統的I2S或者SAI外設來傳輸音頻數據,很是節省MCU的片上資源。整個demo基於i.MX RT1010 EVK板子進行開發,以下所示。架構
i.MX RT1010利用板載麥克風採集音頻數據到sram緩衝區中進行處理,而後使用模擬的I2S接口將音頻數據發送到音頻播放設備,全部音頻數據的處理都圍繞板上的編解碼芯片WM8960實現。另外,爲了可以成功演示該demo,須要對i.MX RT1010 EVK板子進行以下操做和改動,總體實物圖也以下所示。性能
音頻揚聲器的數字接口插入RT1010 EVK板的J11端口。flex
將ISP撥碼開關SW8更改成0b0010模式。3d
將J1-3和J1-4引腳用短路帽鏈接,將USB線插到板上的J9進行電源。code
去掉iMX RT1010 EVK板上的R85,R87,R88,R20這幾個電阻。orm
FLEXIO須要用到的具體引腳和U10的對應鏈接關係以下:htm
引腳名稱 | 位置 | 位置 | FlexIO引腳號 |
---|---|---|---|
SDA_RX | J54-2 | U10-16 | FlexIO03 |
SDA_TX | J26-8 | U10-14 | FlexIO26 |
SYNC | J26-6 | U10-13 | FlexIO22 |
BCLK | J26-4 | U10-12 | FlexIO21 |
在此應用中,demo整個架構和I2S接口的鏈接關係如圖所示。i.MX RT1010做爲I2S的從設備,利用FlexIO模擬了四根引腳,它們分別是I2S接口的SDA_RX、SDA_TX、FSYNC(WS)以及BLCK。WM8960編解碼器做爲I2S的主設備,從MIC接收音頻信號,而後經過SDA_RX引腳將音頻數據傳輸到RT1010。RT1010將接收的音頻數據處理後,再經過SDA_TX引腳發送給WM8960,WM8960將PCM數據轉成模擬信號交由揚聲器播放。此外,RT1010經過I2C接口對WM8960進行初始化配置操做。blog
與MCU作爲I2S主機不一樣的是,當MCU做爲I2S從機時,FSYNC和BLCK信號是由WM8960產生的,所以第一步要把WM8960配置成master模式。WM8960的MCLK時鐘能夠由RT1010提供,也能夠由WM8960提供。本應用中,咱們利用RT1010產生MCLK信號比較方便,並把MCLK配置爲6.144MHz。
常見的I2S採樣頻率一般有兩組,以下所示。 本應用中,I2S採樣頻率配置爲16kHz,一樣WM8960的採樣頻率也須要被配置爲16kHz。一旦I2S的採樣頻率肯定了,那FSYNC信號的頻率也就肯定了,也爲16kHz。
Typical Sample Frequency (Hz) | Typical Sample Frequency (Hz) |
---|---|
11025 | 8000 |
22050 | 16000 |
44100 | 24000 |
-------- | 32000 |
-------- | 48000 |
爲了可以模擬I2S接口做爲slave模式,FlexIO的時鐘配置是有必定要求的,它必須是採樣頻率的某個倍數,這樣FlexIO的定時器才能匹配這個頻率。在本應用中,FlexIO時鐘被配置爲6.144MHz,FlexIO模擬的I2S接口基於這個時鐘來實現。
下一步,須要對WM8960進行一系列配置,使其從板載MIC採集的音頻信號在傳輸給RT1010時,是16KHz,32bit的立體聲(左右聲道)音頻數據。
接着,咱們須要計算並配置FlexIO的各個引腳時鐘,BCLK時鐘信號是由WM8960產生的,MCLK做爲WM8960的參考時鐘,通過分頻獲得BCLK時鐘,過程以下:
此外,在本應用中還須要將I2S模式配置爲經典I2S模式。有讀者若是對I2S協議不清楚,能夠參考筆者的另外一篇博客i.MX RT600之I2S外設介紹及應用。
下面給出了WM8960編解碼器的部分配置代碼:
wm8960_config_t wm8960Config = { .i2cConfig = {.codecI2CInstance = BOARD_CODEC_I2C_INSTANCE,.codecI2CSourceClock = BOARD_CODEC_I2C_CLOCK_FREQ}, .route = kWM8960_RoutePlaybackandRecord, .rightInputSource = kWM8960_InputDifferentialMicInput2, .playSource = kWM8960_PlaySourceDAC, .slaveAddress = WM8960_I2C_ADDR, .bus = kWM8960_BusI2S, .format = {.mclk_HZ = 6144000U, .sampleRate = kWM8960_AudioSampleRate16KHz, .bitWidth = kWM8960_AudioBitWidth32bit}, .master_slave = true, }; codec_config_t boardCodecConfig = { .codecDevType = kCODEC_WM8960, .codecDevConfig = &wm8960Config }; /* Init codec */ CODEC_Init(&codecHandle, &boardCodecConfig);
FlexIO是一個具備多種功能,高度可配置的模塊,具備如下特色:
在i.MX RT1010上,FLEXIO共有27個引腳。本應用一共使用了4個FlexIO引腳(FlexIO03引腳,FlexIO21引腳,FlexIO22引腳,FlexIO26引腳)分別模擬I2S接口的SDA_RX引腳,BCLK引腳,FSYNC引腳和SDA_TX引腳。 下圖顯示了FlexIO模擬I2S接口的內部鏈接。 Timer0和定時Timer2鏈接的FlexIO引腳分別用於產生BCLK信號和FSYNC信號,而SHIFTER0和SHIFTER2的FlexIO引腳分別用於產生SDA_TX信號和SDA_RX信號。下面分別介紹SHIFTER和Timer使用方法和配置。
經過配置SHIFTCTL寄存器,能夠將SHIFTER配置成6種模式,本應用場景中只須要關注Transmit模式和Receive模式就行。
先對SHIFTER0進行配置。將SHIFTER0配置爲Transmit模式,SHIFER0在移位時鐘的上降沿將SHIFERBUF0中的數據從TX引腳輸出。SHIFTER2被配置爲Receive模式,一樣SHIFER2在移位時鐘的降低沿從RX引腳上獲取數據並放入SHIFERBUF2。當數據從SHIFTER加載到SHIFTBUF寄存器中或數據從SHIFTBUF寄存器加載到SHIFTER中時,若是已經將SHIFTER狀態標誌位(SHIFTSDEN SSDE)置1,就能夠產生一個DMA請求。整個 SHIFTER的微體系結構如圖所示,它充分展現了SHIFER中各個模塊之間的關係以及IO引腳輸入輸出的關係。
下面須要對Timer0和Timer2進行配置。
當Timer2檢測到FSYNC的上升沿時使能,當其檢測到trigger事件的降低沿時禁用。Timer0的使能發生在BLCK的上升沿以及Timer2的trigger事件檢測爲高電平時,Timer0的關閉發生在其自身的比較事件產生時。此外,Timer0和Timer2的時鐘狀態須要被初始化爲邏輯1。Timer2的時鐘模式須要被配置爲16位計數模式,其比較事件產生的值設置爲0,並使用FSYNC引腳的輸入做爲遞減量,使用BCLK引腳的輸入做爲trigger事件。Timer0的時鐘模式須要被配置爲16位計數器,並使用BCLK引腳的輸入做爲遞減量。 在此應用中,Timer2的比較事件產生的值設置爲127(32 * 4-1),這是根據64bit一幀的音頻數據位寬長度計算獲得的。
下面給除了詳細的寄存器配置:
到這裏,FlexIO用於模擬I2S接口的基本配置就介紹完畢,接下來還須要介紹音頻數據的處理機制。
MCU在同時接收和發送PCM數據並進行播放的應用場景中,容易出現播放音樂卡頓的狀況,爲了不出現這種卡頓,一個好的傳輸機制是必不可少的,下圖就給出了一種處理PCM數據的思路。
每當FlexIO中的SHIFTER有DMA請求產生時,應當即從SHIFTBUF讀取或寫入音頻數據。下圖中兩個緩衝區用於PCM數據的發送和接收,這兩個緩衝區構成了ping-pang buffer。PCM數據幀的位寬爲64位(左通道和右通道),每一個緩衝區被設置爲256bit,即存放4幀PCM數據, 每當一個緩衝區中的PCM數據接收滿或發送時,下一個緩衝區將當即開始接收或發送。
在利用FlexIO模擬I2S時,須要注意兩點:
因爲FlexIO同步延遲,當FlexIO用來模擬I2S從設備時,串行數據的輸出有效時間是FlexIO時鐘週期的2.5倍。 所以,I2S的BCLK最大時鐘頻率應當是FlexIO時鐘頻率的六分之一。
FlexIO是一個功能強大,很是靈活的模塊,除了本文給出的Timer和SHIFTER的配置外,讀者也利用其它配置模擬出I2S接口。
至此,i.MX RT1010之FlexIO模擬I2S外設介紹完畢。