新聞中心

        S3C2440之IIS操作MDK

        作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏


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

        由圖可知,有發(fā)送器,也有接收器,發(fā)送器和接收器都可以作為控制器。誰(shuí)發(fā)出WS和SCK,誰(shuí)就是控制器。

        SCK為IIS串行數(shù)據(jù)的位時(shí)鐘,WS為聲道切換時(shí)鐘,WS的頻率等于采樣頻率fs。SCK頻率=WS*每個(gè)數(shù)據(jù)的位數(shù)*通道數(shù)。

        MSB先發(fā)送,由于收發(fā)對(duì)于字長(zhǎng)的規(guī)定可以不一樣,所以最終的長(zhǎng)度需要根據(jù)實(shí)際情況而定。


        2440具有64深度,且位長(zhǎng)為16bit的FIFO。PCLK進(jìn)過預(yù)分頻A和B產(chǎn)生SCLK和LRCK。PCLK和MPLLin共同產(chǎn)生CDCLK,供給音頻編碼譯碼器使用。

        因?yàn)?440的IIS接口僅僅是單純的傳輸數(shù)據(jù),依從IIS協(xié)議而已,實(shí)際使用中,需要將數(shù)據(jù)轉(zhuǎn)換為模擬音頻,或者將外界的音頻轉(zhuǎn)換為數(shù)字信號(hào)給系統(tǒng)使用。

        3種模式:DMA模式,同時(shí)傳輸和接收模式,僅傳輸和接收模式。

        這里采用的編碼譯碼器是UDA1314TS。僅為從模式,需要主設(shè)備供應(yīng)時(shí)鐘,為256fs、384fs、512fs。

        UDA1314具有L3線接口與微控制器通信。L3DATA L3MODE L3CLOCK。具有2種模式,地址模式和數(shù)據(jù)模式。地址模式通過L3選擇通信的設(shè)備且定義數(shù)據(jù)傳輸模式訪問的目的寄存器。數(shù)據(jù)模式是雙向的,輸入到UDA1314中編程它的聲音處理和系統(tǒng)控制特性和從UDA1314輸出提供聲音的峰值水平值。


        先傳低位,再傳高位,2440不具備該接口,需要用GPIO模擬使用。



        依據(jù)上面的實(shí)際圖來配置硬件。

        音頻數(shù)據(jù)所給出的信息:

        根據(jù)wav格式從數(shù)據(jù)中讀出采樣頻率。聲道數(shù)。量化位數(shù)。根據(jù)這些來配置IIS相關(guān)寄存器。

        程序:

        本例程,PCLK=100MHZ,音頻數(shù)據(jù)的fs=22.05Khz,2通道,16bit。由于音頻文件過大,所以放在類似硬盤的nandflash中,且不占用前4k。本文利用了MDK的庫(kù)函數(shù)。

        IIS.C文件

        #include "S3C2440.h"#include "iis.h"/ÄÄâUDA1314µÄ3Ïß²Ù×÷¬Óë2440ͨÐÅ*//data : Ðè´«ÊäµÄÊý¾Ý//address : ÊǵØÖ·Äʽ»¹ÊÇÊý¾ÝÄʽ/void WriteL3(unsigned char data,unsigned char address) { int i,j; / *µØÖ·ÄʽʱÐò¬ÕÆÎÕ¼¸¸öÒªµã *Êý¾Ý´«ÊäµÄʱºò±Ö¤L3MODEΪµÍ *Êý¾Ý´«Ê俪ʼµÄÐźÅÊDZ֤L3MODEΪµÍL3CLOCKΪ¸ß *Êý¾Ý´«Êä½áÊøµÄÐźÅÊDZ֤L3MODEΪ¸ßL3CLOCKΪ¸ß *Êý¾Ý´«Êä¹ý³ÌÖÐÒ»¸öL3CLOCKµÄÖÜÆÚ´«Ò»¸öÊý¾Ýλ *Êý¾ÝÄʽʱÐò¬ÕÆÎÕ¼¸¸öÒªµã *Êý¾Ý´«ÊäµÄʱºò±Ö¤L3MODEΪµÍ *Êý¾Ý´«Ê俪ʼµÄÐźÅÊDZ֤L3MODEΪ¸ßL3CLOCKΪ¸ß *Êý¾Ý´«Êä½áÊøµÄÐźÅÊDZ֤L3MODEΪ¸ßL3CLOCKΪ¸ß *Êý¾Ý´«Êä¹ý³ÌÖÐÒ»¸öL3CLOCKµÄÖÜÆÚ´«Ò»¸öÊý¾Ýλ / if(1 == address) rGPBDAT = (rGPBDAT & (~(L3D | L3M | L3C))) | L3C; else rGPBDAT = (rGPBDAT & (~(L3D | L3M | L3C))) | (L3C | L3M); for(i = 0;i < 10;i++); for(i = 0;i < 8;i++) { if(data & 0x01) { rGPBDAT &= ~L3C; rGPBDAT |= L3D; for(j = 0;j < 5;j++); rGPBDAT |= L3C; rGPBDAT |= L3D; for(j = 0;j < 5;j++); } else{ rGPBDAT &= ~L3C; rGPBDAT &= ~L3D; for(j = 0;j < 5;j++); rGPBDAT |= L3C; rGPBDAT &= ~L3D; for(j = 0;j < 5;j++); } data >>= 1; } rGPBDAT = (rGPBDAT & (~(L3D | L3M | L3C))) | (L3C | L3M); }  void playsound(unsigned char *buffer, int length){int count,i;char flag;rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //L3¿ªÊ¼´«ÊäºL3M=H, L3C=H//ÅäÖÃUDA1341WriteL3(0x14 + 2,1);            //״̬Äʽ(000101xx+10)WriteL3(0x60,0);          //0,1,10, 000,0 : ״̬0,¸´Î»WriteL3(0x14 + 2,1);            //״̬Äʽ (000101xx+10)WriteL3(0x10,0);          //0,0,01, 000,0 : ״̬0, 384fs,IIS,no DC-filteringWriteL3(0x14 + 2,1);     //״̬Äʽ (000101xx+10)WriteL3(0xc1,0);           //1,0,0,0, 0,0,01:״̬1,//Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,//DAC non-inverting,Single speed playback,ADC-Off DAC-On//ÅäÖÃs3c2440µÄIIS¼Ä´æÆ÷//Ô¤·ÖƵÆ÷Ϊ5¬ËùÒÔCDCLK=PCLK/(5+1)=384fs=384*22.05khz=50Mhz/N+1 ---->	N=5rIISPSR = 5<<5|5;//ÎÞЧDMA¬ÊäÈë¿ÕÏЬԤ·ÖƵÆ÷ÓÐЧ,²¥·ÅÏÖÓеÄÒôƵÊý¾Ý¬ËùÒÔ²»ÐèÒª´ÓUDA1314ÖнÓÊÕÈκÎÊý¾Ý¬ËùÒÔÉèÖÃÊäÈë¿ÕÏÐrIISCON  = (0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1);   //PCLKΪʱÖÓÔ´¬Êä³öÄʽ¬IISÄʽ¬Ã¿¸öÉùµÀ16λ¬CODECLK=384fs¬SCLK=32fsrIISMOD  = (0<<9)|(0<<8)|(2<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0);     rIISFCON = (0<<15)|(1<<13);           //Êä³öFIFOÕý³Äʽ¬Êä³öFIFOʹÄÜflag=1;count=0;//¿ªÆôIISrIISCON |= 0x1;while(flag){if((rIISCON & (1<<7))==0)               //¼ì²éÊä³öFIFOÊÇ·ñΪ¿Õ{    //FIFOÖеÄÊý¾ÝΪ16λ¬Éî¶ÈΪ32//µ±Êä³öFIFOΪ¿Õʱ¬Ò»´ÎÐÔÏòFIFOдÈë32¸ö16λÊý¾Ýfor(i=0;i<32;i++){rIISFIFO=(buffer[2*i+count])+(buffer[2*i+1+count]<<8);}                  count+=64;if(count>length)flag=0;                  //ÒôƵÊý¾Ý´«ÊäÍê¬ÔòÍ˳ö}}rIISCON = 0x0;            //¹Ø±ÕIIS}

        main.c文件

        int main(void){	init_uart0();NF_Init();NF_Read((u8*)0x33000000, (ulong)0x1000, 0x100000);printf("rntest music......rn");playsound(music + 44,sizeof(music) - 44);}

        scatter文件:

        ; *
        ; * Scatter-Loading Description File generated by uVision *
        ; *


        LR_ROM1 0x00000000 0x00100000 { ; load region size_region
        ER_ROM1 0x00000000 0x000001000 { ; load address = execution address
        *.o (RESET, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
        }


        RW_RAM1 0x30000000 0x40000000 { ; RW data
        .ANY (+RW +ZI)
        }





        OTHERS 0x31000000{
        uart.o(*)
        iis.o(*)
        }

        HEAP 0x32000800 {
        S3C2440A.o(HEAP)
        }


        STACK 0x32000c00{
        S3C2440A.o(STACK)
        }


        }


        LD_ROM2 0x1000
        {
        MUSIC 0x33000000{
        *(wav)
        }
        }

        scatter文件中采用了2個(gè)加載域,單獨(dú)把音頻數(shù)據(jù)放到了4k后,運(yùn)行在0x33000000.

        燒寫到nandflash中,可以正常運(yùn)行,播放歌曲。



        關(guān)鍵詞: S3C2440IIS操作MD

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 镇平县| 鹤壁市| 三原县| 巴楚县| 恩平市| 灵丘县| 莎车县| 扶余县| 荥阳市| 神农架林区| 柏乡县| 灵丘县| 溧阳市| 永嘉县| 固安县| 怀仁县| 靖边县| 新宁县| 安福县| 潮州市| 上犹县| 仙游县| 左云县| 兴文县| 如东县| 峨眉山市| 吉首市| 松原市| 治多县| 旌德县| 武胜县| 沭阳县| 桑植县| 澄城县| 运城市| 卓资县| 金山区| 桐城市| 新安县| 莱芜市| 石狮市|