期刊VIP學術指導 符合學術規范和道德
保障品質 保證專業,沒有后顧之憂
摘要:IIS接口即集成音頻接口,如果設計音頻應用產品,I2S總線接口是必需的。而S3C2410芯片內部集成有I2S接口控制部件,以便實現一個用于迷你型、可移動的多媒體數字音頻信號編解碼器。本文在介紹I2S總線的基礎上,分析并實現了在Linux下放音和錄音的初始化驅動及錄放音的過程。
關鍵字: S3C2410 I2S總線 嵌入式Linux UDA1341
1 I2S總線概述
音響數據的采集、處理和傳輸是多媒體技術的重要組成部分。眾多的數字音頻系統已經進入消費市場,例如數字音頻錄音帶、數字聲音處理器。I2S(Inter—IC Sound)總線是飛利浦公司為數字音頻設備之間的音頻數據傳輸而制定的一種總線標準,該總線專責于音頻設備之間的數據傳輸,廣泛應用于各種多媒體系統。它采用了沿獨立的導線傳輸時鐘與數據信號的設計,通過將數據和時鐘信號分離,避免了因時差誘發的失真,為用戶節省了購買抵抗音頻抖動的專業設備的費用。
2 I2S總線規范
在飛利浦公司的I2S標準中,既規定了硬件接口規范,也規定了數字音頻數據的格式。
2.1 I2S有3個主要信號:
1)串行時鐘SCLK,也叫位時鐘(BCLK),即對應數字音頻的每一位數據,SCLK都有1個脈沖。SCLK的頻率=2×采樣頻率×采樣位數。
2) 幀時鐘LRCK,(也稱WS),用于切換左右聲道的數據。LRCK為“1”表示正在傳輸的是左聲道的數據,為“0”則表示正在傳輸的是右聲道的數據。LRCK的頻率等于采樣頻率。
3)串行數據SDATA,就是用二進制補碼表示的音頻數據。
有時為了使系統間能夠更好地同步,還需要另外傳輸一個信號MCLK,稱為主時鐘,也叫系統時鐘(Sys Clock),是采樣頻率的256倍或384倍。
2.2 串行數據(SD)
I2S格式的信號無論有多少位有效數據,數據的最高位總是出現在LRCK變化(也就是一幀開始)后的第2個SCLK脈沖處。如果接收端能處理的有效位數多于發送端,可以自行補足剩余的位。這種同步機制使得數字音頻設備的互連更加方便,而且不會造成數據錯位。
I2S格式的信號無論有多少位有效數據,數據位的最高位(MSB)總是被最先傳輸,1次能夠發送的數據決定于I2S格式的有效位數。
隨著技術的發展,在統一的I2S接口下出現了多種不同的數據格式。根據SD信號相對于SCK和WS位置的不同,分為左對齊和右對齊2種格式,如圖2和圖3所示。
2.3 字段(聲道)選擇(WS)
命令選擇線表明了正在被傳輸的聲道。
WS=1,表示正在傳輸的是左聲道的數據。
WS=0,表示正在傳輸的是右聲道的數據。
WS可以在串行時鐘的上升沿或者下降沿發生改變,并且WS信號不需要一定是對稱的。在從屬裝置端,WS在時鐘信號的上升沿發生改變。在圖2、圖3兩種數據傳輸格式中,當WS為“1”時傳輸的是左聲道的數據,當WS為“0”時傳輸的是右聲道的數據。為了保證數字音頻信號的正確傳輸,發送端和接收端應該采用相同的數據格式和長度。當然,對I2S格式來說數據長度可以不同。
2.4電氣規范:
輸出電壓:
VL <0.4V
VH>2.4V
輸入電壓
VIL=0.8V
VIH=2.0V
注:目前使用的TTL電平標準,隨著其他IC(LSI)的流行,其他電平也會支持。
3 I2S工作時序
在I2S總線中,任何設備都可以通過提供必需的時鐘信號成為系統的主導裝置,而從屬裝置通過外部時鐘信號來得到它的內部時鐘信號,這就意味著必須重視主導裝置和數據以及命令選擇信號之間的傳播延遲,總的延遲主要由兩部分組成:
1)外部時鐘和從屬裝置的內部時鐘之間的延遲
2)內部時鐘和數據信號以及命令選擇信號之間的延遲
對于數據和命令信號的輸入,外部時鐘和內部時鐘的延遲不占據主導地位,它只是延長了有效的建立時間(set—up time)。延遲的主要部分是發送端的傳輸延遲和設置接收端所需的時間。
T是時鐘周期,Tr是最小允許時鐘周期,T>Tr這樣發送端和接收端才能滿足數據傳輸速率的要求。
對于所有的數據速率,發送端和接收端均發出一個具有固定的傳號空號比(mark—space ratio)的時鐘信號,所以t LC和tHC是由T所定義的。 t LC和tHC必須大于0.35T,這樣信號在從屬裝置端就可以被檢測到。
延遲(tdtr)和最快的傳輸速度(由Ttr定義)是相關的,快的發送端信號在慢的時鐘上升沿可能導致tdtr不能超過tRC而使thtr為零或者負。只有tRC不大于tRCmax的時候(tRCmax>:0.15T),發送端才能保證thtr大于等于0。
數據建立時間(set-up time)和保持時間(hold time)不能小于指定接收端的建立時間和保持時間。
4 I2S總線結構配置
S3C2410數字音頻接口模塊由I2S(Inter-IC Sound)音頻總線接口和UDA1341音頻編碼器(CODEC)組成。S3C2410內置一個I2S總線控制器,該控制器實現了到一個外部8/16位立體聲音頻CODEC IC的接口。支持I2S總線數據格式和MSB-justified數據格式。此控制器包含FIFO,支持DMA傳輸模式。I2S總線控制器結構如圖4所示。
UDA1341是Philips公司的一款經濟型音頻CODEC,用于實現模擬音頻信號的采集(音頻AD)和數字音頻信號的模擬輸出(DA),并通過I2S數字音頻接口,實現音頻信號的數字化處理。
5 S3C2410下的放音代碼
I2S放音代碼如下所示:
void Play_Iis(void)
{
unsigned int save_G, save_E, save_PG, save_PE;
Uart_TxEmpty(0);
由于I2S時鐘從系統進鐘分頻得到,為了得到合適的I2S時鐘,必須對系統時鐘進行適當的降頻處理,降頻后必須對串口重新進行初始化。然后將用到的端口保存起來,并進行端口初始化。
I2S可以采用DMA方式進行語音錄音和播放,因此需進行DMA中斷的注冊。
pISR_DMA2 = (unsigned)DMA2_Done;
然后獲取語音數據及其大小以及采樣頻率。
下來初始化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方式播放語音數據,播放完畢后將引發DMA2中斷,在其中斷處理函數中將dma2_done設置為非零,因此,在主程序中可以通過判斷dma2_done是否為0決定播放是否結束。語音播放結束,通知I2S,并恢復寄存器設置。
最后將關閉中斷并將系統時鐘恢復。
rINTMSK |= (BIT_DMA2);
ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz
Uart_Init(0,115200);
mute = 1;
PRINTF("------放音測試結束------\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();
錄制的聲音數據保存在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結束語
I2S總線是近年出現的一種面向多媒體計算機器Multimedia PC)的音頻總線,該總線專門用于音頻設備之間的數據傳輸。文中基于S3C2410和Linux平臺,設計共實現基于該平臺的I2S錄音放音。