S3C2440 IIS操作 uda134x录放音
? IIS(Inter-IC Sound)由飛利浦公司開發(fā)。是一種經(jīng)常使用的音頻設(shè)備接口,主要用于CD、MD、MP3等設(shè)備。
? ? ? ? s3c2440一共同擁有5個引腳用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前兩個引腳用于數(shù)字音頻信號的輸出和輸入,另外三個引腳都與音頻信號的頻率有關(guān),可
見要用好IIS,就要把信號頻率設(shè)置正確。IIS僅僅負責(zé)數(shù)字音頻信號的傳輸。而要真正實現(xiàn)音頻信號的放、錄,還須要額外的處理芯片(在這里,我們使用的是UDA1341)。
?IISSCLK為串行時鐘,這條線路在 codec 芯片 uda134x 內(nèi)部是BCK也就是 bit clock input。
每個時鐘信號傳送一位音頻信號
? ?因此IISSCLK的頻率=聲道數(shù)×採樣頻率×採樣位數(shù),如採樣頻率fs為44.1kHz,採樣的位數(shù)為16位。聲道數(shù)2個(左、右兩個聲道),則IISSCLK的頻率=32fs=1411.2kHz。
? ?IISLRCK為幀時鐘。用于切換左、右聲道,如IISLRCK為高電平表示正在傳輸?shù)氖亲舐暤罃?shù)據(jù),為低電平表示正在傳輸?shù)氖怯衣暤罃?shù)據(jù),因此IISLRCK的頻率應(yīng)該正好等于
採樣頻率fs。從上面兩幅圖能夠清除的看出來。
? ? CDCLK 也就是 uda134x 內(nèi)部的sysclk 在 uda134芯片手冊能夠設(shè)置為system clock 256fs , 384fs or 512fs。 在s3c2440里面僅僅能設(shè)置成256fs或384fs。這個引腳為該芯
片提供系統(tǒng)同步時鐘。即編解碼時鐘。主要用于音頻的A/D、D/A採樣時的採樣時鐘。
? ? ?通過以上分析能夠發(fā)現(xiàn),採樣頻率fs對頻率的設(shè)置至關(guān)重要。
而fs不是隨意設(shè)置的。對于特定的音頻數(shù)據(jù)這個值是固定的,而設(shè)置不同的幾個固定的值。如8kHz、16kHz、22.05kHz、44.1kHz、48kHz、96kHz等。常見的wav 文件都是 44.1khz。
? ?為了使系統(tǒng)得到以fs為基數(shù)的各類時鐘信號,就要又一次調(diào)整系統(tǒng)時鐘。
s3c2440用于IIS的時鐘源有PCLK和MPLLin。我們這里選擇PCLK作為IIS的時鐘源。PCLK經(jīng)過兩個
預(yù)分頻器處理后分別得到IISSCLK、IISLRCK和CDCLK(預(yù)分頻器A得到IISSCLK、IISLRCK。預(yù)分頻器B得到CDCLK)。? ? ?
? ? 寄存器IISPSR是IIS預(yù)分頻器寄存器,5~9位是預(yù)分頻器A。0~4位是預(yù)分頻器B,一般來說,這兩個預(yù)分頻器的值N相等。即僅僅要知道一個,還有一個也就知道。而這里我們
是通過CDCLK來計算預(yù)分頻器B的值N的,即 CDCLK= PCLK / (N+1)。
? 注意在整個寄存器組里面沒有直接設(shè)置fs,由于PCLK是已經(jīng)設(shè)置好的,假如取值400Mhz,再通過這里的N 得到CDCLK。 而CDCLK 和fs關(guān)系也是通過設(shè)置IISMOD寄存器
得到。所以fs也就確定了,然后 IISSCLK 也能夠通過 IISMOD 寄存器設(shè)置得到。
假設(shè)直接用預(yù)分頻器A的N值和PCLK來計算IISSCLK和IISLRCK似乎沒有給出一個方式。
?
? ? ?當 fs=44.1khz 的時候CDCLK=384fs=16.9344MHz,對于PCLK 有非常多取值,依照最小誤差的原則能夠算出
? ?另外在 官方給出的 2440test ?裸機文件里也有一組數(shù)值:
因此這里就選擇這一組了。
另外上面的2組都會導(dǎo)致 FCLK > 400Mhz,會不會導(dǎo)致cpu不穩(wěn)定?
IISCON 和 IISMOD 寄存器每一個位含義例如以下所看到的:
? ? 對于處理器和 uda134x 通信,正常的音頻傳輸是通過IIS 來進行的,上面已經(jīng)說了。還要配置 uda134x 內(nèi)部寄存器,uda134x 支持I2C 和L3總線模式等模式配置,記得以
前在mips 架構(gòu)上 是通過I2c 寄存器來設(shè)置的。這里我們選擇 L3總線來設(shè)置。
? ?因為s3c2440不具備L3總線接口,因此我們是用三個通用IO口來模擬L3,從而實現(xiàn)L3總線的傳輸。UDA1341有兩種模式:地址模式和傳輸數(shù)據(jù)模式。
地址模式表示傳輸?shù)氖堑刂沸畔?#xff0c;它的高6位永遠是000101。低兩位表示的是傳輸?shù)哪J?#xff0c;是狀態(tài)模式、數(shù)據(jù)0模式還是數(shù)據(jù)1模式,當中狀態(tài)模式主要用于配置UDA1341
的各類初始狀態(tài),數(shù)據(jù)模式主要用于改善音頻輸入、輸出的效果。
地址模式和數(shù)據(jù)模式主要通過 L3MODE 線來區(qū)分。
l3 線 數(shù)據(jù)寫 模式代碼例如以下:
codec 配置 代碼例如以下(與上面的時序圖相應(yīng)):
//L3總線接口的寫函數(shù) //輸入?yún)?shù)data為要寫入的數(shù)據(jù) //輸入?yún)?shù)address,為1表示地址模式,為0表示傳輸數(shù)據(jù)模式 static void WriteL3(byte data,byte address) {int i,j;if(address == 1)rGPBDAT = (rGPBDAT & ~(L3D | L3M | L3C)) | L3C; //L3D=L, L3M=L(地址模式), L3C=HelserGPBDAT = (rGPBDAT & ~(L3D | L3M | L3C)) | (L3C | L3M); //L3M=H(傳輸數(shù)據(jù)模式) for(i=0;i<10;i++); //等待一段時間//并行數(shù)據(jù)轉(zhuǎn)串行數(shù)據(jù)輸出,以低位在前、高位在后的順序for(i=0;i<8;i++) {if(data & 0x1) // H{rGPBDAT &= ~L3C; //L3C=LrGPBDAT |= L3D; //L3D=H for(j=0;j<5;j++); //等待一段時間rGPBDAT |= L3C; //L3C=HrGPBDAT |= L3D; //L3D=Hfor(j=0;j<5;j++); //等待一段時間}else // L{rGPBDAT &= ~L3C; //L3C=LrGPBDAT &= ~L3D; //L3D=Lfor(j=0;j<5;j++); //等待一段時間rGPBDAT |= L3C; //L3C=HrGPBDAT &= ~L3D; //L3D=Lfor(j=0;j<5;j++); //等待一段時間 }data >>= 1;}rGPBDAT = (rGPBDAT & ~(L3D | L3M | L3C)) | (L3C | L3M); //L3M=H,L3C=H } //配置UDA1341WriteL3(0x14 + 2,1); //狀態(tài)模式(000101xx+10)WriteL3(0x60,0); //0,1,10, 000,0 : 狀態(tài)0,復(fù)位WriteL3(0x14 + 2,1); //狀態(tài)模式 (000101xx+10)WriteL3(0x10,0); //0,0,01, 000,0 : 狀態(tài)0, 384fs,IIS,no DC-filteringWriteL3(0x14 + 2,1); //狀態(tài)模式 (000101xx+10)WriteL3(0xc1,0); //1,0,0,0, 0,0,01:狀態(tài)1,上面設(shè)置codec 寄存器含義要從datasheet 里面找到解釋?比方說??WriteL3(0xc1,0); ? ? 0xc1 轉(zhuǎn)換成二進制就是:
1 1 0 0 0 0 0 1b
? ?上面簡介了IIS 音頻播放各種配置,事實上對于錄音也要配置頻率。跟對應(yīng)的codec寄存器,這里實現(xiàn)了錄制一段音頻數(shù)據(jù)。然后再播出的功能。
?? 這個能夠參考曾經(jīng)的博文??qemu模擬alsa聲卡 ?制作一個wav 文件,然后再把wav文件轉(zhuǎn)換成c數(shù)組這一步能夠用winhex完畢:首先打開須要提取的wav文件,然后再在數(shù)
據(jù)部分的開始處右鍵點擊“Beginning of Block”。在數(shù)據(jù)結(jié)束部分右鍵點擊“End of block”。這時就選中了所需的數(shù)據(jù)。然后右鍵點擊“Edit”->"Copy block"->"C source"。這時
數(shù)據(jù)就以unsigned char數(shù)組的形式拷貝到了剪貼板上。接下來新建一個文本文件粘貼進去就能夠了。粘貼進去你會發(fā)現(xiàn),xinhex已經(jīng)幫你定義好了數(shù)組,能夠直接用到c
代碼中。相當人性化,對于前面的bmp位圖制作數(shù)組也能夠用這樣的方式。
音頻播放代碼:
buffer = music_buffer;length = 564000; //sizeof(music_buffer);init_iis();//開啟IISrIISCON |= 0x1;while(1){i++;if(i>99)i=0;count = 0;while(1) {if((rIISCON & (1<<7))==0) //檢查輸出FIFO是否為空{(diào) //FIFO中的數(shù)據(jù)為16位,深度為32這個數(shù)值能夠參考s3c2440//當輸出FIFO為空時,一次性向FIFO寫入32個16位數(shù)據(jù)for(i=0;i<32;i++){*IISFIFO=(buffer[2*i+count])+(buffer[2*i+1+count]<<8);}count+=64;//OSTimeDly( 1 ); 這里1等于5ms ,可是連這5ms也無法歇息,否則 會導(dǎo)致音樂全然聽不出來/// cpu 在播放的時候是無法休眠了,假設(shè)用dma 那么這個傳輸數(shù)據(jù)的過程就不用cpu管理,cpu就能夠休眠了。if(count>length) break; //音頻傳輸數(shù)據(jù)完,則退出 } } //rIISCON = 0x0; //關(guān)閉IIS OSTimeDly(OS_TICKS_PER_SEC); }
完整代碼間例如以下鏈接:
參考:
blog.csdn.net/zhaocj/article/details/5570424
s3c2440文檔
總結(jié)
以上是生活随笔為你收集整理的S3C2440 IIS操作 uda134x录放音的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数“转移”
- 下一篇: CSS之div和span标签