Kinetis微控制器eDMA和I2S的音頻接口設(shè)計(jì)
摘要:本文給出基于Kinetis MK60N512微控制器和16位/24位音頻數(shù)模轉(zhuǎn)換器MAX5556的立體聲音頻接口設(shè)計(jì)。MK60N512由I2S總線向MAX55 56傳輸音頻數(shù)據(jù),輸出音頻信號(hào)經(jīng)有源濾波器進(jìn)行濾波,保證音頻質(zhì)量的同時(shí)提高其帶負(fù)載能力。由MK60N512內(nèi)部高性能可編程的增強(qiáng)型DMA向I2S模塊傳送音頻數(shù)據(jù),減輕微控制器內(nèi)核的負(fù)擔(dān)。
關(guān)鍵詞:Kinetis;MK60N512;MAX5556;增強(qiáng)型DMA;I2S總線
引言
MK60N512是飛思卡爾公司Kinetis系列微控制器集成度最高的芯片,它基于ARM Cortex—M4內(nèi)核,具有功耗低、性能高、成本低的特點(diǎn),旨在為嵌入式音頻、汽車電子和電源管理等提供靈活的解決方案。MAX5556是美信公司一款低功耗、立體聲音頻數(shù)/模轉(zhuǎn)換器(DAC),支持標(biāo)準(zhǔn)I2S總線協(xié)議,采樣精度最高可達(dá)24位,采樣率為2~50 kHz。采用∑-△調(diào)制技術(shù),能夠?qū)α炕肼曔M(jìn)行有效整形,減小量化噪聲。
音頻處理系統(tǒng)中,采用DMA實(shí)現(xiàn)音頻數(shù)據(jù)在微控制器內(nèi)的傳輸,能減少內(nèi)核的參與,降低內(nèi)核負(fù)擔(dān)。系統(tǒng)的數(shù)據(jù)傳輸通道如圖1所示,音頻信號(hào)暫存在緩存區(qū)中,由DMA傳輸?shù)絀2S總線模塊的發(fā)送電路。為了保持音頻信號(hào)的連續(xù)性,采用“乒乓RAM”設(shè)計(jì)緩存。圖中A/B表示乒乓RAM的編號(hào)。
發(fā)送電路和接收電路均有兩個(gè)FIFO,寬度為32位,深度為15。對(duì)發(fā)送數(shù)據(jù)寄存器TX0/TX1和接收數(shù)據(jù)寄存器RX0/RX1的寫入與讀取可以訪問這些FIFO。發(fā)送邏輯將TX FIFO中的數(shù)據(jù)轉(zhuǎn)移出來,裝入發(fā)送串行移位器TXSR,然后從STXD端口串行發(fā)送;接收邏輯將數(shù)據(jù)從輸入的數(shù)據(jù)幀中轉(zhuǎn)移出來后,將它們放入接收RXFIFO的入口。當(dāng)TX FIFO中空缺數(shù)目或RX FIFO數(shù)據(jù)達(dá)到設(shè)定的數(shù)目時(shí),會(huì)觸發(fā)中斷或者DMA傳輸。
1.2 eDMA
MK60N512的eDMA高度可編程,數(shù)據(jù)傳輸高度優(yōu)化而幾乎不需要CPU內(nèi)核干預(yù)。與普通的DMA不同,eDMA的傳輸由主循環(huán)(Major Loop)和輔循環(huán)(MinorLoop)組成。主循環(huán)由外設(shè)自動(dòng)觸發(fā),每次主循環(huán)結(jié)束后源地址、目的地址都會(huì)按照TCDn_SOFF、TCDn_DOFF寄存器中的值自動(dòng)偏移而不需要CPU去修改。除了所有傳輸結(jié)束后產(chǎn)生中斷申請(qǐng)外,eDMA還支持“半中斷”,即主循環(huán)完成總循環(huán)次數(shù)一半時(shí)產(chǎn)生中斷申請(qǐng),這特別適合“乒乓RAM”設(shè)計(jì)。
2 MAX5556介紹
2.1 引腳定義和內(nèi)部結(jié)構(gòu)
MAX5556內(nèi)部結(jié)構(gòu)如圖3所示,MCLK為主時(shí)鐘,LRCLK為左/右聲道選擇時(shí)鐘,SCLK為外部串行時(shí)鐘,SDATA為串行音頻輸入,OUTL/OUTR為左/右聲道輸出。串行接口模塊獲取音頻數(shù)據(jù)后,由內(nèi)置數(shù)字插值器、濾波器對(duì)其進(jìn)行濾波,以去除基帶音頻信號(hào)攜帶的諧波噪聲;音頻數(shù)據(jù)經(jīng)∑-△調(diào)制器調(diào)制后由DAC轉(zhuǎn)換,輸出的模擬信號(hào)經(jīng)由內(nèi)部的模擬低通濾波器進(jìn)行濾波,衰減高頻量化噪聲;內(nèi)置輸出緩存器能驅(qū)動(dòng)大于3 kΩ的負(fù)載電阻和高達(dá)100 pF的負(fù)載電容;最終模擬音頻信號(hào)從OUTL/OUTR輸出。
2.2 工作模式
MAX5556支持外部串行時(shí)鐘模式和內(nèi)部串行時(shí)鐘模式。在一個(gè)LRCLK周期內(nèi),若檢測(cè)到有效的SCLK,則進(jìn)入外部串行時(shí)鐘模式,SCLK作為采樣時(shí)鐘;如果檢測(cè)不到有效的SCLK,則進(jìn)入內(nèi)部串行時(shí)鐘模式,采樣時(shí)鐘由內(nèi)部生成。內(nèi)部采樣時(shí)鐘的頻率根據(jù)檢測(cè)到的MCLK與LRCLK的比值確定,若MCLK與LRCLK的比值為384,則內(nèi)部采樣時(shí)鐘頻率為48×fLRCLK;若MCLK與LRCLK的比值為256或512,則內(nèi)部采樣時(shí)鐘頻率為32× fLRCLK。
2.3 數(shù)據(jù)格式
MAX5556支持左對(duì)齊16位或者24位數(shù)據(jù)格式。當(dāng)其工作在外部串行時(shí)鐘模式,或工作在內(nèi)部串行時(shí)鐘模式,且同時(shí)MCLK與LRCLK的比值為384時(shí),有效數(shù)據(jù)為24位。如果數(shù)據(jù)不足24位,低位補(bǔ)零;超過24位的數(shù)據(jù)會(huì)被忽略。當(dāng)工作在內(nèi)部串行時(shí)鐘模式,且MCLK與LRCLK的比值為256或512時(shí),有效數(shù)據(jù)為16位。MAX5556數(shù)據(jù)格式如圖4所示。每次LRCLK沿變化后的第二個(gè)SCLK上升沿時(shí),SDATA上數(shù)據(jù)開始有效,出現(xiàn)最高有效位(MSB);24個(gè)或者16個(gè)時(shí)鐘周期后出現(xiàn)最低位有效位(LSB)。LRCLK為0時(shí),數(shù)據(jù)進(jìn)入左聲道DAC;LRCLK為1時(shí),數(shù)據(jù)進(jìn)入右聲道DAC。
3 系統(tǒng)硬件電路設(shè)計(jì)
MK60N512通過I2S總線將音頻數(shù)據(jù)傳輸給MAX5556進(jìn)行數(shù)模轉(zhuǎn)換,輸出模擬音頻信號(hào)由濾波電路進(jìn)行濾波,同時(shí)提高帶負(fù)載能力。I2S總線模塊工作在I2S總線主模式下,發(fā)送電路的STCK、STFS和STXD端口對(duì)應(yīng)的引腳分別為BCLK、TX_FS和TXD,I2S總線模塊的主時(shí)鐘通過MCLK引腳輸出。硬件電路如圖5所示。由于MK60N512工作在3.3 V電壓下,而MAX5556工作電壓為5 V,為了提高數(shù)據(jù)傳輸?shù)姆€(wěn)定性,接口均采用上拉方式。
LM358在5 V單電源供電時(shí)有效輸出為1.5~3.5 V,而MAX5556的輸出可以達(dá)到0~5 V,因而在輸入端使用R1和R2對(duì)原始信號(hào)進(jìn)行衰減,防止輸出信號(hào)出現(xiàn)削頂失真。
4 軟件設(shè)計(jì)
4.1 “乒乓RAM”設(shè)計(jì)
MK60N512的I2S總線模塊在I2S總線模式下支持雙聲道,音頻數(shù)據(jù)在FIFO中交錯(cuò)存放,因此在緩存中的音頻數(shù)據(jù)也需要交錯(cuò)存放。數(shù)據(jù)緩存如圖6所示,其中L/R表示音頻左/右聲道。每個(gè)音頻數(shù)據(jù)占用4個(gè)字節(jié)空間,緩存BUFF_A、BUFF_B在物理地址上是連續(xù)的,它們大小均為512字節(jié),共存儲(chǔ)256個(gè)音頻數(shù)據(jù)。當(dāng)DMA從緩區(qū)BUFF_A中讀取數(shù)據(jù)時(shí),CPU向緩存區(qū)BUFF_B中存儲(chǔ)下一組音頻信號(hào);當(dāng)DMA將BUFF_A中的數(shù)據(jù)全部傳輸結(jié)束后,將DMA通道源地址切換到BUFF_B,同時(shí)CPU向BUFF_A存儲(chǔ)數(shù)據(jù),如此反復(fù)。
4.2 I2S總線模塊的配置
配置I2S總線模塊工作在I2S總線主模式下,默認(rèn)一幀數(shù)據(jù)長(zhǎng)度是32位,而且為左對(duì)齊模式;使用幀同步TX_FS作為聲道選擇時(shí)鐘,且同步幀長(zhǎng)度為一個(gè)字。由于MAX5556的SCLK信號(hào)由MK60N512提供,MAX5556工作在外部串行時(shí)鐘模式,有效數(shù)據(jù)位是24位,因而配置發(fā)送數(shù)據(jù)位為24位。按照MAX5556的數(shù)據(jù)格式,數(shù)據(jù)需要在SCLK下降沿輸出從TXD數(shù)據(jù),且需要發(fā)送早期幀同步,讓數(shù)據(jù)延遲一個(gè)采樣時(shí)鐘,還需要根據(jù)音頻采樣頻率設(shè)置幀頻率。
使能TX FIFO和其DMA請(qǐng)求,當(dāng)FIFO中空缺數(shù)達(dá)到8時(shí),啟動(dòng)一次DMA主循環(huán)。圖7為音頻數(shù)據(jù)在TXFIFO移動(dòng)過程。圖7(a)中FIFO為滿,隨著發(fā)送移位邏輯從FIFO從取出一個(gè)數(shù)據(jù)后,F(xiàn)IFO產(chǎn)生一個(gè)空缺,如圖7(b)所示。當(dāng)發(fā)送8次數(shù)據(jù)后,F(xiàn)IFO空缺數(shù)達(dá)到8個(gè),則觸發(fā)DMA主傳輸,如圖7(c)所示。
I2S總線的初始化代碼略——編者注。
4.3 eDMA配置
當(dāng)TX FIFO空缺數(shù)達(dá)到8時(shí),觸發(fā)DMA主循環(huán),故每次主循環(huán)傳輸數(shù)據(jù)數(shù)目是32字節(jié),每次主循環(huán)源地址偏移也是32字節(jié),完成緩存區(qū)1 024字節(jié)數(shù)據(jù)傳輸需要32次主循環(huán)。第16次主循環(huán)結(jié)束,DMA已經(jīng)將BUFF_A中所有數(shù)據(jù)傳輸完畢,DMA源地址指向BUFF_B,并產(chǎn)生“半中斷”請(qǐng)求,CPU開始向BUFF_A中存儲(chǔ)下一組512字節(jié)音頻數(shù)據(jù)。
當(dāng)BUFF_B中數(shù)據(jù)傳輸結(jié)束后,源地址恢復(fù)到BUFF_A起始地址,并產(chǎn)生中斷請(qǐng)求,CPIJ響應(yīng)中斷并向BIJFFB中存儲(chǔ)下一組512字節(jié)音頻數(shù)據(jù)。可以看出,在傳輸過程中,CPU只需要響應(yīng)兩次中斷請(qǐng)求,然后向緩存區(qū)寫入音頻數(shù)據(jù)。每次主循環(huán)結(jié)束后源地址偏移32字節(jié),完整的傳輸結(jié)束后,源地址恢復(fù)到BUFF_A起始地址,這些操作都是通過eDMA模塊自己完成的。
DMA的初始化代碼略——編者注。
5 測(cè)試結(jié)果
圖8為TX_FS和TXD的波形圖,通道1為TX_FS,通道2為TXD。左/右聲道發(fā)送的音頻數(shù)據(jù)均是0x555。圖8(a)的發(fā)送幀頻率為48 kHz,圖8(b)的為44.1 kHz。從圖8中可以看出,數(shù)據(jù)長(zhǎng)度為24位,左對(duì)齊模式,而且數(shù)據(jù)與幀同步有一個(gè)采樣時(shí)鐘的延時(shí),符合MAX5556的數(shù)據(jù)格式和時(shí)序。
結(jié)語
本文設(shè)計(jì)了基于Kinetis MK60N512和MAX5556的立體聲音頻接口,MK60N512將音頻數(shù)據(jù)按照MAX5556的數(shù)據(jù)格式和時(shí)序通過I2S總線傳輸給MAX5556,MAX5556內(nèi)部DAC將數(shù)據(jù)轉(zhuǎn)化為模擬信號(hào)輸出,并由濾波電路對(duì)音頻信號(hào)進(jìn)行濾波,同時(shí)提高帶負(fù)載能力。使用MK60N512內(nèi)部高性能可配置的eDMA提高系統(tǒng)數(shù)據(jù)傳輸速率,降低CPU的負(fù)擔(dān)。測(cè)試表明,系統(tǒng)能輸出立體聲音頻,輸出頻率可調(diào),可以為Kinetis系列微控制器音頻解決方案提供參考。
評(píng)論