新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 七 ARM9(S3C2440)的IIS-理論知識及程序實例

        七 ARM9(S3C2440)的IIS-理論知識及程序實例

        作者: 時間:2016-11-27 來源:網(wǎng)絡 收藏
        IIS(Inter-IC Sound)由飛利浦公司開發(fā),是一種常用的音頻設備接口,主要用于CD、MD、MP3等設備。

        本文引用地址:http://www.104case.com/article/201611/322172.htm

        s3c2440一共有5個引腳用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前兩個引腳用于數(shù)字音頻信號的輸出和輸入,另外三個引腳都與音頻信號的頻率有關,可見要用好IIS,就要把信號頻率設置正確。IISSCLK為串行時鐘,每一個時鐘信號傳送一位音頻信號,因此IISSCLK的頻率=聲道數(shù)×采樣頻率×采樣位數(shù),如采樣頻率fs為44.1kHz,采樣的位數(shù)為16位,聲道數(shù)2個(左、右兩個聲道),則IISSCLK的頻率=32fs=1411.2kHz。IISLRCK為幀時鐘,用于切換左、右聲道,如IISLRCK為高電平表示正在傳輸?shù)氖亲舐暤罃?shù)據(jù),為低電平表示正在傳輸?shù)氖怯衣暤罃?shù)據(jù),因此IISLRCK的頻率應該正好等于采樣頻率。由于IIS只負責數(shù)字音頻信號的傳輸,而要真正實現(xiàn)音頻信號的放、錄,還需要額外的處理芯片(在這里,我們使用的是UDA1341),CDCLK為該芯片提供系統(tǒng)同步時鐘,即編解碼時鐘,主要用于音頻的A/D、D/A采樣時的采樣時鐘,一般CDCLK為256fs或384fs。

        通過以上分析可以發(fā)現(xiàn),采樣頻率fs對頻率的設置至關重要。而fs不是任意設置的,一般基于不同的應用場合和聽覺效果,而設置不同的幾個固定的值,如8kHz、16kHz、22.05kHz、44.1kHz、48kHz、96kHz等。為了使系統(tǒng)得到以fs為基數(shù)的各類時鐘信號,就要重新調(diào)整系統(tǒng)時鐘。s3c2440用于IIS的時鐘源有PCLK和MPLLin,我們這里選擇PCLK作為IIS的時鐘源。PCLK經(jīng)過兩個預分頻器處理后分別得到IISSCLK、IISLRCK和CDCLK(預分頻器A得到IISSCLK、IISLRCK,預分頻器B得到CDCLK)。寄存器IISPSR是IIS預分頻器寄存器,5~9位是預分頻器A,0~4位是預分頻器B,一般來說,這兩個預分頻器的值N相等,即只要知道一個,另一個也就知道,而這里我們是通過CDCLK來計算預分頻器B的值N的,即CDCLK=PCLK / (N+1)。PCLK與FCLK有一定的比例關系,而FCLK又是由輸入頻率Fin得到。在這里,我們?yōu)榱撕喕嬎悖桓淖働CLK與FCLK的比例關系(即維持在啟動代碼中定義的1:8的關系),那么由Fin而得到CDCLK一共涉及到四個參數(shù):MDIV、PDIV、SDIV和前面公式中的N,涉及到的寄存器有MPLLCON和IISPSR。因此要得到這四個參數(shù)值,就需要一點耐心地計算,原則是誤差最小,其中需要注意的是,計算的結果(包括中間過程的結果)不要溢出,即不要超過32位。例如Fin為12MHz,我們設置采樣頻率fs=44.1kHz,而CDCLK=384fs=16.9344MHz,那么經(jīng)過計算,最終得到N=3,MDIV=150,PDIV=5,SDIV=0,即IISPSR = (3<<5) | 3;,MPLLCON = (150<<12) | (5<<4) | 0;。(我覺得可以根據(jù)要播放的文件的采樣頻率先固定幾個變量,然后再求出剩余的)

        s3c2440有關IIS的寄存器除了IISPSR外,還包括IIS控制寄存器IISCON,主要用于控制數(shù)據(jù)傳輸?shù)姆绞健㈩A分頻器和IIS接口是否開啟;IIS模式寄存器IISMOD,主要用于設置IIS的時鐘源、主從方式、接收發(fā)送方式、串行接口方式、每個聲道串行數(shù)據(jù)位數(shù)和各種頻率值;IIS的FIFO接口寄存器IISFCON用于設置和判斷數(shù)據(jù)傳輸?shù)腇IFO狀態(tài);而寄存器IISFIFO則用于音頻數(shù)據(jù)的傳輸。

        由于s3c2440要實現(xiàn)IIS的錄、放音,還需要UDA1341芯片,因此我們再簡要介紹一下這個芯片的使用。s3c2440與UDA1341之間除了我們前面介紹過的IIS接口相連接外,還有一個稱之為L3總線的連接,用于s3c2440配置UDA1341內(nèi)部的寄存器。由于s3c2440不具備L3總線接口,因此我們是用三個通用IO口來模擬L3,從而實現(xiàn)L3總線的傳輸。UDA1341有兩種模式:地址模式和數(shù)據(jù)傳輸模式。地址模式表示傳輸?shù)氖堑刂沸畔ⅲ母?位永遠是000101,低兩位表示的是傳輸?shù)哪J剑菭顟B(tài)模式、數(shù)據(jù)0模式還是數(shù)據(jù)1模式,其中狀態(tài)模式主要用于配置UDA1341的各類初始狀態(tài),數(shù)據(jù)模式主要用于改善音頻輸入、輸出的效果。

        下面介紹一下L3總線接口

        L3就是line 3(3條線)的意思,它只有L3DATA(數(shù)據(jù)線:用于傳輸數(shù)據(jù))、L3MODE(模式線:用于選擇模式)、L3CLOCK(時鐘線:用于傳輸時鐘)。L3一共有兩個模式:地址模式和數(shù)據(jù)傳輸模式,先傳輸?shù)刂纺J綌?shù)據(jù),再傳輸數(shù)據(jù)模式數(shù)據(jù)。L3MODE為低時是地址模式,L3MODE為高時是數(shù)據(jù)傳輸模式。L3DATA和L3CLOCK相互作用,完成8位數(shù)據(jù)的傳輸,傳輸?shù)捻樞蚴窍鹊臀粩?shù)據(jù),再高位數(shù)據(jù)。

        地址模式是用于選擇設備和定義目標寄存器,在這種模式下,8位數(shù)據(jù)的含義是:高6位是設備地址(UDA1341的地址為000101),低兩位是后面數(shù)據(jù)模式下寄存器的類型(00:DATA0,01:DATA1,10:STATUS)。只要沒有再改變地址模式下的數(shù)據(jù),則數(shù)據(jù)模式下的數(shù)據(jù)始終是傳輸?shù)缴弦粋€地址模式所定義的寄存器內(nèi)。

        在傳輸數(shù)據(jù)模式下,STATUS是用于設置復位,系統(tǒng)時鐘頻率、數(shù)據(jù)輸入模式、DC濾波等內(nèi)容。DATA0分為直接尋址模式和擴展尋址模式,直接尋址模式是直接進行模式的控制,包括音量、靜音等等,而擴展尋址模式是在直接尋址模式下先設置3位擴展地址,再在直接尋址模式下設置5位擴展數(shù)據(jù)。在DATA1下,可以讀取到被檢測峰值。

        //////////////////////////////////////////////////////////////////////////////////////////////////

        在該實驗中我們播放的是wav文件,所以要想正確的播放文件,我們必須對wave文件有一些了解。

        我們用的wave文件是wav格式轉化成的C語言文件,實際上就是一個數(shù)組,該文件可以通過Advanced MP3 WMA Recorder軟件錄音生成wav格式音頻文件,然后通過軟件WinHex生成我們需要的C文件,我在實驗中保存為.h的頭文件添加到該程序中。

        下面是wave格式文件介紹:

        一、綜述
        WAVE文件作為多媒體中使用的聲波文件格式之一,它是以RIFF格式為標準的。
        RIFF是英文Resource Interchange File Format的縮寫,每個WAVE文件的頭四個字節(jié)便是“RIFF”。
        WAVE文件是由若干個Chunk組成的。按照在文件中的出現(xiàn)位置包括:

        1、RIFF WAVE Chunk,

        2、Format Chunk,

        3、Fact Chunk(可選),

        4、Data Chunk。

        具體見下圖:

        ------------------------------------------------
        |RIFF WAVE Chunk|
        |ID= RIFF|
        |RiffType = WAVE|
        ------------------------------------------------
        |Format Chunk|
        |ID = fmt |
        ------------------------------------------------
        |Fact Chunk(optional)|
        |ID = fact|
        ------------------------------------------------
        |Data Chunk|
        |ID = data|
        ------------------------------------------------

        其中除了Fact Chunk外,其他三個Chunk是必須的。每個Chunk有各自的ID,位于Chunk最開始位置,作為標示,而且均為4個字節(jié)。并且緊跟在ID后面的是Chunk大
        小(去除ID和Size所占的字節(jié)數(shù)后剩下的其他字節(jié)數(shù)目),4個字節(jié)表示,低字節(jié)表示數(shù)值低位,高字節(jié)表示數(shù)值高位。下面具體介紹各個Chunk內(nèi)容。所有數(shù)值表示均為低字節(jié)表示低位,高字節(jié)表示高位。

        二、具體介紹
        RIFF WAVE Chunk
        ==================================
        ||所占字節(jié)數(shù)|具體內(nèi)容|
        ==================================
        | ID|4 Bytes |RIFF|
        ----------------------------------
        | Size|4 Bytes ||
        ----------------------------------
        | Type|4 Bytes |WAVE|
        ----------------------------------
        圖2RIFF WAVE Chunk

        以FIFF作為標示,然后緊跟著為size字段,該size是整個wav文件大小減去ID和Size所占用的字節(jié)數(shù),即FileLen - 8 = Size。然后是Type字段,為WAVE,表示是wav文件。
        結構定義如下:
        struct RIFF_HEADER
        {
        charszRiffID[4];// R,I,F,F
        DWORDdwRiffSize;
        charszRiffFormat[4];// W,A,V,E
        };

        Format Chunk

        字節(jié)數(shù)具體內(nèi)容

        | ID|4 Bytes|‘fmt’

        | Size|4 Bytes| 數(shù)值為16或18,18則最后又附加信息
        | FormatTag|2 Bytes| 編碼方式,一般為0x000
        | Channels|2 Bytes| 聲道數(shù)目,1--單聲道;2--雙聲道
        |SamplesPerSec |4 Bytes| 采樣頻率

        | AvgBytesPerSec|4 Bytes| 每秒所需字節(jié)數(shù)===> WAVE_FORMAT
        | BlockAlign|2 Bytes| 數(shù)據(jù)塊對齊單位(每個采樣需要的字節(jié)數(shù))

        | BitsPerSample |2 Bytes| 每個采樣需要的bit數(shù)|2 Bytes | 附加信息(可選通過Size來判斷有無)

        圖3Format Chunk

        以fmt 作為標示。一般情況下Size為16,此時最后附加信息沒有;如果為18則最后多了2個字節(jié)的附加信息。主要由一些軟件制成的wav格式中含有該2個字節(jié)的附加信息。


        結構定義如下:
        struct WAVE_FORMAT
        {
        WORDwFormatTag;
        WORDwChannels;
        DWORDdwSamplesPerSec;
        DWORDdwAvgBytesPerSec;
        WORDwBlockAlign;
        WORDwBitsPerSample;
        };
        struct FMT_BLOCK
        {
        charszFmtID[4];// f,m,t,
        DWORDdwFmtSize;
        WAVE_FORMATwavFormat;
        };


        Fact Chunk
        ==================================
        ||所占字節(jié)數(shù)|具體內(nèi)容|
        ==================================
        | ID|4 Bytes |fact|
        ----------------------------------
        | Size|4 Bytes |數(shù)值為4|
        ----------------------------------
        | data|4 Bytes ||
        ----------------------------------
        圖4Fact Chunk

        Fact Chunk是可選字段,一般當wav文件由某些軟件轉化而成,則包含該Chunk。
        結構定義如下:
        struct FACT_BLOCK
        {
        charszFactID[4];// f,a,c,t
        DWORDdwFactSize;
        };

        Data Chunk
        ==================================
        ||所占字節(jié)數(shù)|具體內(nèi)容|
        ==================================
        | ID|4 Bytes |data|
        ----------------------------------
        | Size|4 Bytes ||
        ----------------------------------
        | data|||
        ----------------------------------
        圖5 Data Chunk

        Data Chunk是真正保存wav數(shù)據(jù)的地方,以data作為該Chunk的標示。然后是
        數(shù)據(jù)的大小。緊接著就是wav數(shù)據(jù)。根據(jù)Format Chunk中的聲道數(shù)以及采樣bit數(shù),
        wav數(shù)據(jù)的bit位置可以分成以下幾種形式:
        |單聲道|取樣1|取樣2|取樣3|取樣4|8bit量化 |聲道0|聲道0|聲道0|聲道0

        |雙聲道|取樣1|取樣2

        |8bit量化 |聲道0(左)|聲道1(右) |聲道0(左) |聲道1(右)

        取樣1|取樣2|
        |單聲道|

        | 16bit量化 |聲道0|聲道0|聲道0|聲道0|(低位字節(jié))|(高位字節(jié))|(低位字節(jié))|(高位字節(jié))

        取樣1

        |雙聲道|------------------------------------------------
        | 16bit量化 |聲道0(左)|聲道0(左) |聲道1(右)|聲道1(右)
        |(低位字節(jié))| (高位字節(jié))| (低位字節(jié))| (高位字節(jié))
        圖6 wav數(shù)據(jù)bit位置安排方式

        Data Chunk頭結構定義如下:
        struct DATA_BLOCK
        {
        charszDataID[4];// d,a,t,a
        DWORDdwDataSize;
        };

        看完上面這些我們應該要清楚在文件的開始地址偏移0x18(24)處是文件的采樣頻率,0x16(22)處是聲道,0x2c(44)處才是真正的wave數(shù)據(jù),也就是我們要播放的數(shù)據(jù)。

        下面是UDA1314通過IIS接口的放音程序

        #include"2440addr.h"
        #include"WindowsXP_Wav.h"
        #include"What_are_words.h"
        #include"def.h"
        //L3接口

        #define L3C (1<<4)//GPB4 = L3CLOCK

        #define L3D (1<<3)//GPB3 = L3DATA

        #define L3M (1<<2)//GPB2 = L3MODE


        上一頁 1 2 下一頁

        關鍵詞: ARM9S3C2440II

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 策勒县| 阳原县| 弋阳县| 四川省| 乐都县| 舞阳县| 正定县| 东乡族自治县| 汪清县| 固阳县| 云浮市| 达尔| 隆化县| 城口县| 姚安县| 肥乡县| 辛集市| 凌云县| 枣阳市| 惠东县| 玉林市| 福鼎市| 农安县| 永宁县| 南皮县| 苏尼特右旗| 彭泽县| 清苑县| 青河县| 灵山县| 靖宇县| 和政县| 华容县| 九龙城区| 邵阳市| 云林县| 洛阳市| 柳林县| 宁阳县| 定安县| 苗栗市|