期刊VIP學術(shù)指導 符合學術(shù)規(guī)范和道德
保障品質(zhì) 保證專業(yè),沒有后顧之憂
來源:期刊VIP網(wǎng)所屬分類:機械時間:瀏覽:次
摘要:IIS接口即集成音頻接口,如果設計音頻應用產(chǎn)品,I2S總線接口是必需的。而S3C2410芯片內(nèi)部集成有I2S接口控制部件,以便實現(xiàn)一個用于迷你型、可移動的多媒體數(shù)字音頻信號編解碼器。本文在介紹I2S總線的基礎上,分析并實現(xiàn)了在Linux下放音和錄音的初始化驅(qū)動及錄放音的過程。
關鍵字: S3C2410 I2S總線 嵌入式Linux UDA1341
1 I2S總線概述
音響數(shù)據(jù)的采集、處理和傳輸是多媒體技術(shù)的重要組成部分。眾多的數(shù)字音頻系統(tǒng)已經(jīng)進入消費市場,例如數(shù)字音頻錄音帶、數(shù)字聲音處理器。I2S(Inter—IC Sound)總線是飛利浦公司為數(shù)字音頻設備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標準,該總線專責于音頻設備之間的數(shù)據(jù)傳輸,廣泛應用于各種多媒體系統(tǒng)。它采用了沿獨立的導線傳輸時鐘與數(shù)據(jù)信號的設計,通過將數(shù)據(jù)和時鐘信號分離,避免了因時差誘發(fā)的失真,為用戶節(jié)省了購買抵抗音頻抖動的專業(yè)設備的費用。
2 I2S總線規(guī)范
在飛利浦公司的I2S標準中,既規(guī)定了硬件接口規(guī)范,也規(guī)定了數(shù)字音頻數(shù)據(jù)的格式。
2.1 I2S有3個主要信號:
1)串行時鐘SCLK,也叫位時鐘(BCLK),即對應數(shù)字音頻的每一位數(shù)據(jù),SCLK都有1個脈沖。SCLK的頻率=2×采樣頻率×采樣位數(shù)。
2) 幀時鐘LRCK,(也稱WS),用于切換左右聲道的數(shù)據(jù)。LRCK為“1”表示正在傳輸?shù)氖亲舐暤赖臄?shù)據(jù),為“0”則表示正在傳輸?shù)氖怯衣暤赖臄?shù)據(jù)。LRCK的頻率等于采樣頻率。
3)串行數(shù)據(jù)SDATA,就是用二進制補碼表示的音頻數(shù)據(jù)。
有時為了使系統(tǒng)間能夠更好地同步,還需要另外傳輸一個信號MCLK,稱為主時鐘,也叫系統(tǒng)時鐘(Sys Clock),是采樣頻率的256倍或384倍。
2.2 串行數(shù)據(jù)(SD)
I2S格式的信號無論有多少位有效數(shù)據(jù),數(shù)據(jù)的最高位總是出現(xiàn)在LRCK變化(也就是一幀開始)后的第2個SCLK脈沖處。如果接收端能處理的有效位數(shù)多于發(fā)送端,可以自行補足剩余的位。這種同步機制使得數(shù)字音頻設備的互連更加方便,而且不會造成數(shù)據(jù)錯位。
I2S格式的信號無論有多少位有效數(shù)據(jù),數(shù)據(jù)位的最高位(MSB)總是被最先傳輸,1次能夠發(fā)送的數(shù)據(jù)決定于I2S格式的有效位數(shù)。
隨著技術(shù)的發(fā)展,在統(tǒng)一的I2S接口下出現(xiàn)了多種不同的數(shù)據(jù)格式。根據(jù)SD信號相對于SCK和WS位置的不同,分為左對齊和右對齊2種格式,如圖2和圖3所示。
2.3 字段(聲道)選擇(WS)
命令選擇線表明了正在被傳輸?shù)穆暤馈?/p>
WS=1,表示正在傳輸?shù)氖亲舐暤赖臄?shù)據(jù)。
WS=0,表示正在傳輸?shù)氖怯衣暤赖臄?shù)據(jù)。
WS可以在串行時鐘的上升沿或者下降沿發(fā)生改變,并且WS信號不需要一定是對稱的。在從屬裝置端,WS在時鐘信號的上升沿發(fā)生改變。在圖2、圖3兩種數(shù)據(jù)傳輸格式中,當WS為“1”時傳輸?shù)氖亲舐暤赖臄?shù)據(jù),當WS為“0”時傳輸?shù)氖怯衣暤赖臄?shù)據(jù)。為了保證數(shù)字音頻信號的正確傳輸,發(fā)送端和接收端應該采用相同的數(shù)據(jù)格式和長度。當然,對I2S格式來說數(shù)據(jù)長度可以不同。
2.4電氣規(guī)范:
輸出電壓:
VL <0.4V
VH>2.4V
輸入電壓
VIL=0.8V
VIH=2.0V
注:目前使用的TTL電平標準,隨著其他IC(LSI)的流行,其他電平也會支持。
3 I2S工作時序
在I2S總線中,任何設備都可以通過提供必需的時鐘信號成為系統(tǒng)的主導裝置,而從屬裝置通過外部時鐘信號來得到它的內(nèi)部時鐘信號,這就意味著必須重視主導裝置和數(shù)據(jù)以及命令選擇信號之間的傳播延遲,總的延遲主要由兩部分組成:
1)外部時鐘和從屬裝置的內(nèi)部時鐘之間的延遲
2)內(nèi)部時鐘和數(shù)據(jù)信號以及命令選擇信號之間的延遲
對于數(shù)據(jù)和命令信號的輸入,外部時鐘和內(nèi)部時鐘的延遲不占據(jù)主導地位,它只是延長了有效的建立時間(set—up time)。延遲的主要部分是發(fā)送端的傳輸延遲和設置接收端所需的時間。
T是時鐘周期,Tr是最小允許時鐘周期,T>Tr這樣發(fā)送端和接收端才能滿足數(shù)據(jù)傳輸速率的要求。
對于所有的數(shù)據(jù)速率,發(fā)送端和接收端均發(fā)出一個具有固定的傳號空號比(mark—space ratio)的時鐘信號,所以t LC和tHC是由T所定義的。 t LC和tHC必須大于0.35T,這樣信號在從屬裝置端就可以被檢測到。
延遲(tdtr)和最快的傳輸速度(由Ttr定義)是相關的,快的發(fā)送端信號在慢的時鐘上升沿可能導致tdtr不能超過tRC而使thtr為零或者負。只有tRC不大于tRCmax的時候(tRCmax>:0.15T),發(fā)送端才能保證thtr大于等于0。
數(shù)據(jù)建立時間(set-up time)和保持時間(hold time)不能小于指定接收端的建立時間和保持時間。
4 I2S總線結(jié)構(gòu)配置
S3C2410數(shù)字音頻接口模塊由I2S(Inter-IC Sound)音頻總線接口和UDA1341音頻編碼器(CODEC)組成。S3C2410內(nèi)置一個I2S總線控制器,該控制器實現(xiàn)了到一個外部8/16位立體聲音頻CODEC IC的接口。支持I2S總線數(shù)據(jù)格式和MSB-justified數(shù)據(jù)格式。此控制器包含F(xiàn)IFO,支持DMA傳輸模式。I2S總線控制器結(jié)構(gòu)如圖4所示。
UDA1341是Philips公司的一款經(jīng)濟型音頻CODEC,用于實現(xiàn)模擬音頻信號的采集(音頻AD)和數(shù)字音頻信號的模擬輸出(DA),并通過I2S數(shù)字音頻接口,實現(xiàn)音頻信號的數(shù)字化處理。
5 S3C2410下的放音代碼
I2S放音代碼如下所示:
void Play_Iis(void)
{
unsigned int save_G, save_E, save_PG, save_PE;
Uart_TxEmpty(0);
由于I2S時鐘從系統(tǒng)進鐘分頻得到,為了得到合適的I2S時鐘,必須對系統(tǒng)時鐘進行適當?shù)慕殿l處理,降頻后必須對串口重新進行初始化。然后將用到的端口保存起來,并進行端口初始化。
I2S可以采用DMA方式進行語音錄音和播放,因此需進行DMA中斷的注冊。
pISR_DMA2 = (unsigned)DMA2_Done;
然后獲取語音數(shù)據(jù)及其大小以及采樣頻率。
下來初始化UDA1341,設置為放音模式。
Init1341(PLAY);
接著進行DMA初始化。
//DMA2 Initialize
rDISRC2 = (int)(Buf + 0x2c);
rDISRCC2 = (0<<1) + (0<<0);
rDIDST2 = ((U32)IISFIFO);
rDIDSTC2 = (1<<1) + (1<<0);
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(1<<20)+(size/4);
rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0);
I2S的初始化并啟動I2S功能。
if(fs==44100)
rIISPSR = (2<<5) + 2;
else
rIISPSR = (5<<5) + 5;
rIISCON = (1<<5) + (1<<2) + (1<<1);
rIISMOD = (0<<8) + (2<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);
rIISFCON = (1<<15) + (1<<13);
//IIS Tx Start
rIISCON |= 0x1;
rINTMSK &= ~(/*BIT_EINT0 | BIT_UART0 |*/ BIT_DMA2);
ClearPending(BIT_DMA2);
I2S啟動后,將采用DMA方式播放語音數(shù)據(jù),播放完畢后將引發(fā)DMA2中斷,在其中斷處理函數(shù)中將dma2_done設置為非零,因此,在主程序中可以通過判斷dma2_done是否為0決定播放是否結(jié)束。語音播放結(jié)束,通知I2S,并恢復寄存器設置。
最后將關閉中斷并將系統(tǒng)時鐘恢復。
rINTMSK |= (BIT_DMA2);
ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz
Uart_Init(0,115200);
mute = 1;
PRINTF("------放音測試結(jié)束------\n\n");
6 S3C2410下的錄音代碼
錄音程序在初始化等動作上與放音類似,代碼如下:
void Record_Iis(void)
{
unsigned int save_G, save_E, save_PG, save_PE;
Uart_TxEmpty(0);
ChangeClockDivider(1,1);
ChangeMPllValue(0x96,0x5,0x1);
Uart_Init(33857142,115200);
PRINTF("--------錄音測試--------\n");
PRINTF("[1] 請接上耳機和麥克風\n");
save_G = rGPGCON;
save_E = rGPECON;
save_PG = rGPGUP;
save_PE = rGPEUP;
IIS_PortSetting();
錄制的聲音數(shù)據(jù)保存在rec_buf中,錄制長度為REC——LEN:
rec_buf = (unsigned short *)0x31000000;
pISR_DMA2 = (unsigned)DMA2_Rec_Done;
pISR_EINT0 = (unsigned)Muting;
rINTMSK &= ~(BIT_DMA2);
Init1341(RECORD);
rDISRCC2 = (1<<1) + (1<<0);
rDISRC2 = ((U32)IISFIFO);
rDIDSTC2 = (0<<1) + (0<<0);
rDIDST2 = (int)rec_buf;
rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<24)+(1<<23)+(1<<22)+(1<<20)+REC_LEN;
rDMASKTRIG2 = (0<<2) + (1<<1) + 0;
rIISMOD = (0<<8) + (1<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);
rIISPSR = (2<<5) + 2;
rIISCON = (0<<5) + (1<<4) + (1<<3) + (0<<2) + (1<<1);
rIISFCON = (1<<14) + (1<<12);
開始錄音:
rIISCON |= 0x1;
while(!Rec_Done) Delay(1);
rINTMSK |= BIT_DMA2;
Rec_Done = 0;
PRINTF(" 錄音完畢\n");
7結(jié)束語
I2S總線是近年出現(xiàn)的一種面向多媒體計算機器Multimedia PC)的音頻總線,該總線專門用于音頻設備之間的數(shù)據(jù)傳輸。文中基于S3C2410和Linux平臺,設計共實現(xiàn)基于該平臺的I2S錄音放音。