用CS43L42音頻解碼器和EP7212嵌入式處理器設計的MP3文件播放系統(tǒng)
摘要:介紹了CIRRUS LOGIC公司生產(chǎn)的音頻解碼芯片CS43L42與嵌入式處理器EP7212的接口實現(xiàn)方法,分析了基于嵌入式處理器EP7212/7312和CS43L42芯片的MP3文件播放系統(tǒng),給出了由其組成的完整硬件連接圖和有效的軟件實現(xiàn)方法。
關鍵詞:嵌入式處理器;數(shù)字音頻接口DAI;CS43L42;MP3;EP7212
1 引言
目前存儲聲音信息的音頻數(shù)據(jù)格式主要有PCM文件、VOC文件、MIDI文件、MP3文件等。對導航系統(tǒng)來說,要實現(xiàn)音頻文件的播放,存儲器容量是一個需要考慮的問題。由于導航系統(tǒng)的存儲空間有限,所以要求存儲的文件壓縮率高。與其它文件格式相比,MP3音頻文件具有較高的壓縮率和不遜色于CD的音質(zhì),所以在導航系統(tǒng)中音頻文件的存儲選用MP3格式。
MP3的全稱為MPEG1 Layer-3音頻文件,MPEG?Moving Picture Experts Group?在漢語中譯為活動圖像專家組,特指活動影音壓縮標準。MPEG音頻文件是MPEG1標準中的聲音部分,也叫MPEG音頻層,它根據(jù)壓縮質(zhì)量和編碼復雜程度劃分為三層,即Layer1、Layer2、Layer3,分別對應MP1、MP2、MP3這三種聲音文件,并根據(jù)不同的用途,使用不同層次的編碼。MPEG音頻編碼的層次越高,編碼器越復雜,壓縮率也越高,MP1和MP2的壓縮率分別為4:1和6:1~8:1,而MP3的壓縮率則高達10:1~12:1,也就是說,一分鐘CD音質(zhì)的音樂,未經(jīng)壓縮需要10MB的存儲空間,而經(jīng)過MP3壓縮編碼后只有1MB左右。不過MP3對音頻信號采用的是有損壓縮方式,為了降低聲音失真度,MP3采取了“感官編碼技術”,即編碼時先對音頻文件進行頻譜分析,然后再用過濾器濾掉噪音電平,接著通過量化的方式將剩下的每一位重新排列,最后形成具有較高壓縮率的MP3文件,從而使壓縮后的文件在回放時能夠達到比較接近原音源的聲音效果。
雖然MP3是一種有損壓縮方式,但它以極小的聲音失真換來較高的壓縮比,因此在較多的場合得以應用。尤其是隨著數(shù)字技術的發(fā)展,MP3壓縮方式在便攜式電子產(chǎn)品中得到了越來越廣泛的應用,深受追求時尚、新潮的青年朋友的喜愛。
2 CS43L42播放芯片
CS43L42是CIRRUS LOGIC公司生產(chǎn)的音頻解碼芯片,它可工作在1.8~3.3V,關掉線性放大器時功耗僅16mW?非常適合于MP3、MD播放器等低功耗場合的應用。該芯片是一款完全意義上的數(shù)模轉(zhuǎn)換器,它包括1bit D/A轉(zhuǎn)換、模擬濾波、音量控制、線性電壓輸出以及耳機放大器。通過改變主頻率,其允許的輸入采樣頻率可從2k~100kHz變化。該器件具有數(shù)字重音、峰值限制和去加重等特性。此外,由于采用了POPGUARD技術,CS43L42還可有效防止加電、斷電時產(chǎn)生的瞬間沖擊。
CS43L42具有DAI接口,能夠與嵌入式處理器EP7212/7312較好的配合。它具有三種模式:雙線模式、SPI模式、STAND ALONE模式。通過引腳CP/SA和AD0/CS/DEM0置相應狀態(tài)可以設置這三種模式。當CP/SA引腳為低電平時,芯片為STAND ALONE模式,當CP/SA為高電平時,只要檢測到引腳AD0/CS/DEM0電平從低到高變化,則進入SPI模式,否則為雙線模式。在STAND ALONE模式下,可用SCL/CCLK/DIF1和SDA/CDIN/DIF0引腳來設置數(shù)據(jù)、左/右時鐘以及主時鐘之間的關系。在雙線模式和SPI模式下,則可以通過對寄存器進行操作來實現(xiàn)靜音、聲道衰減和音量控制等功能。圖1是CS43L42的內(nèi)部原理圖,圖2是該芯片的引腳排列示意圖,各引腳的功能如下:
1腳(RST):復位信號,低有效。
2腳(LRCK):左/右?guī)健?/P>
3腳(SDATA):串行音頻數(shù)據(jù),數(shù)據(jù)隨串行時鐘引入。
4腳(AD0/CS/DEM0):在SPI模式下,用于使能控制端口。
5腳(SCLK/DEM1):位時鐘,等于MCLK的1/2,每幀有128位。
6腳(VL):數(shù)字電源電壓,典型值為1.8V~3.3V。
7腳(MCLK):2x過采樣時鐘,僅在從模式下輸入。
圖3
8腳(SCL/CCLK/DIF1):串行控制接口時鐘。
9腳(SDA/CDIN/DIF0):串行控制數(shù)據(jù)輸入輸出。
10腳(N.C.):無連接,懸空。
11腳(CP/SA):控制模式和等待模式控制。
12腳(VQ_HP):耳機靜態(tài)電壓接口。
13腳(REF_GND):連接到模擬地。
14腳(FILT+):正向基準電壓,用于內(nèi)部采樣電路。
15腳(VQ_LINE):線輸出靜態(tài)電壓接口。
16?21腳(HP_A,HP_B):耳機輸出。
17腳(GND):連接到模擬地。
18腳(VA):模擬電源電壓,典型值為1.8V~3.3V。
19腳(VA_LINE):線性擴音器電源端,典型值在1.8V~3.3V。
20腳(VA_HP):耳機放大電源端,典型值為0.9V~3.3V。
22,23腳(AOUTB? AOUTA):模擬輸出端。
24腳(MUTEC):靜音控制。
3 CS43L42的硬件連接電路
如系統(tǒng)中芯片工作在STAND_ALONE模式,則將DIF1、DIF0分別設置為低、高電平表示接收左起有效的24位數(shù)據(jù)。圖3是CS43L42的典型外圍連接電路。圖中的電容C由下式給出:
C=(RL+560)/[4π Fs(RL·560)]
4 MP3播放軟件設計
MP3文件播放的軟件設計任務如下:
(1)初始化EP7212 的DAI接口。
(2)將MP3文件解碼成PCM文件并存放于開辟的兩個緩沖區(qū)(左、右兩個聲道)。
(3)在FIQ(快速中斷請求)中將PCM格式的數(shù)據(jù)寫到DAI接口,同時播放聲音(未有數(shù)據(jù)時播放靜音)。
4.1 EP7212的DAI接口介紹和初始化
a. DAI接口
EP7212/7312的數(shù)字音頻接口(DAI)主要用于支持高質(zhì)量立體聲的音頻處理。圖4是CS43L42與嵌入式微處理器EP7212的DAI接口電路。該接口主要由以下五個信號組成:
(1)LRCK,左/右?guī)健?/P>
(2)SCLK,位時鐘,等于MCLK的1/2,每幀有128位。
(3)MCLK,2x過采樣時鐘,僅在從模式下輸入。
(4)SDOUT,數(shù)字音頻數(shù)據(jù)輸出。
(5)SDIN,數(shù)字音頻數(shù)據(jù)輸入。
用MSB/Left數(shù)據(jù)調(diào)整格式意味著數(shù)據(jù)在幀同步信號(LRCK)電位改變后立即被計時。MSB在第一位時是左調(diào)整,這與I2S格式相比有些不同,I2S格式的數(shù)據(jù)在改變電位后要延遲一個時鐘。數(shù)據(jù)幀每幀是128位長,這樣每個聲道64位長。幀的大小和LRCK的運行周期在EP7212/7312中不能被設置。SCLK可從MCLK中得到,頻率等于1/2 MCLK。缺省模式中,DAI處于主模式。該模式下自己產(chǎn)生的MCLK時鐘等于9.216MHz。這樣,SCLK等于4.608MHz。對于需要SCLK有不同速率的應用,DAI可以被設置成從模式。在從模式下,外部源通過MCLK引腳給MCLK提供主時鐘,然后分成兩半生成SCLK。不管DAI模式如何設置,SCLK和LRCK通常都設置成輸出。數(shù)據(jù)一般在SCLK的上升沿鎖入,在下降沿釋放。
DAI接口是一種高質(zhì)量的數(shù)字音頻接口,可以連接與DAI接口兼容的音頻設備。EP7212 的DAI接口通過位時鐘和幀同步時鐘產(chǎn)生128bit幀數(shù)據(jù)。數(shù)字音頻數(shù)據(jù)的接收和發(fā)送均采用全雙工方式,對應于12采樣深度的接收FIFO和8采樣深度的發(fā)送FIFO。在DAI 接口信號中,MCLK是主時鐘,它是音頻采樣頻率的256倍,SCLK為音頻采樣頻率的128倍,LRCK固定為采樣頻率。由于本系統(tǒng)中的MCLK連接外部時鐘發(fā)生器,頻率為11.2896MHz?所以采樣頻率為44.1KHz。其DAI接口時序圖如圖5所示。
圖5
DAI的幀長128bit?其中包括一個音頻采樣數(shù)據(jù),在這128bit中,僅有32bit為實際的音頻數(shù)據(jù),其余輸出均為零。左/右時鐘作為幀同步信號,左/右時鐘從高到低表示右聲道的16bit數(shù)據(jù),從低到高表示左聲道的16bit數(shù)據(jù)。
b. DAI接口初始化
DAI初始化程序中首先應設置控制寄存器, 接著選擇外部時鐘有效以及在左發(fā)送FIFO數(shù)據(jù)少于一半時產(chǎn)生中斷。然后清除狀態(tài)寄存器上溢、下溢位,之后使DAI接口、發(fā)送FIFO和接收FIFO有效。最后打開DAI中斷。
4.2 MP3文件的解碼
ARM公司提供有基于ARM處理器音頻文件解碼庫,它能夠有效地解碼MP3格式的歌曲,而輸出16bit立體聲PCM數(shù)據(jù)。
a. 解碼庫所定義的結(jié)構(gòu)
·tSampleRate定義了解碼數(shù)據(jù)PCM的采樣率
typedef enum tagSampleRate
{
SR 11 025kHz?
SR 12kHz?
SR 44 1kHz?
SR 48kHz?
SR 32kHz?
SR Reserved
} tSampleRate ?
·tMPEGStatus 給出了MP3函數(shù)返回狀態(tài)值。
typedef enum tagMPEGStatus
{
eNoErr?
eNoSyncword?
eCRCError?
eBrokenFrame?
eEndOfBitstream?
eDataOverflow?
} tMPEGStatus ?
·tMPEGBitstream?給出MPEG比特流的指針,bufptr定義為比特流的字指針,bitidx定義為字中的索引(0-31)。
typedef struct tagMPEGBitstream
{
unsigned int * bufptr?
unsigned int bitidx?
} tMPEGBitstream?
·tMPEGHeader?包括MPEG音頻報頭信息,sam-ple_rate為PCM采樣頻率,samplesperchannel為每個聲道的采樣數(shù),numchans為聲道數(shù),packed info為報頭信息,bits required為下一次調(diào)用函數(shù)需要bit數(shù),free format是指比特流的格式。
typedef struct tagMPEGHeader
{
tSampleRate sample rate?
unsigned int samplesperchannel?
unsigned int numchans?
unsigned int packed info?
unsigned int bits required?
unsigned int free format?
} tMPEGHeader?
b. MP3解碼庫所提供的函數(shù)
·InitMP3Audio?tMPEGInstance *inst?
功能:初始化解碼器解碼指針。
·MP3SearchForSyncword?tMPEGInstance *inst?tM-PEGBitstream *bs?length?
功能:查找MPEG數(shù)據(jù)中的同步字。
·MP3DecodeInfo?tMPEGInstance * inst?tMPEGBit-stream * bs?tMPEGHeader * pmpeg hdr?
功能:從MPEG幀中獲得報頭的信息。
·MP3DecodeData?tMPEGInstance *inst? short *left?short * right? tMPEGBitstream * bs?
功能:從MP3數(shù)據(jù)解碼成PCM數(shù)據(jù),并將其存到left、right指向的緩沖區(qū)中。
c. MP3程序解碼流程及在FIQ中斷中的實現(xiàn)
圖6所示是該系統(tǒng)中MP3文件的解碼流程。該文件可在FIQ中斷中實現(xiàn)播放。由于DAI FIFO對應于FIQ中斷,因此,它可以通過控制寄存器來設置FIFO的中斷方式,并可在程序中將產(chǎn)生中斷的位置設置在左發(fā)送FIFO中少于四個采樣數(shù)據(jù)時。由于在FIQ中斷中保存有MP3解碼緩沖區(qū)的地址,因此,若在進入FIQ后各寫四個采樣數(shù)據(jù)到左右FIFO中,那么,對于44.1kHz文件來說,FIQ發(fā)生的速率將為11kHz。為了保證左右FIFO的正確填充,一般需要交替寫兩個FIFO。此時如果MP3緩沖區(qū)無數(shù)據(jù),則可寫0(靜音)到兩個FIFO中,這樣,程序就可以跳出FIFO中斷接著處理數(shù)據(jù)。需要說明的是:無論程序是否需要錄音,都要從接收緩沖區(qū)讀四個數(shù)據(jù),這樣可確保DAI FIFO處于同步狀態(tài)而不會產(chǎn)生失真。另外,在FIQ處理程序的最后,還要清除溢出狀態(tài)位,這樣可以防止FIQ始終中斷。