<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式系統(tǒng)中I2S總線數(shù)據(jù)通信的軟件模擬

          嵌入式系統(tǒng)中I2S總線數(shù)據(jù)通信的軟件模擬

          作者: 時(shí)間:2010-09-29 來(lái)源:網(wǎng)絡(luò) 收藏

            根據(jù)MS6336的格式以及數(shù)據(jù)發(fā)送流程,的步驟如下:

           ?、?根據(jù)語(yǔ)音數(shù)據(jù)采樣率及采樣位數(shù)計(jì)算得到SCK的值和WS的值(WS的值等于采樣頻率)。

            采樣率為44.1 kHz,則SCK=2×44.1 kHz×103×16=1 411 200 Hz,WS=44 100 Hz。1個(gè)SCK時(shí)鐘周期T=1/SCK=07 μs。采用延時(shí)程序SCK時(shí)鐘周期需要應(yīng)用示波器來(lái)精確延時(shí)時(shí)間。本中一個(gè)SCK周期的延時(shí)為delay(2)。

           ?、?將WS、BCK和DATA均置為高電平。

           ?、?選擇左右聲道。首先發(fā)送左聲道數(shù)據(jù),將WS置低(若發(fā)送右聲道數(shù)據(jù)則將WS置高)。

            for(ChannelCnt=0;ChannelCnt2;ChannelCnt++){//雙聲道選擇播放

            if(ChannelCnt==0){//左聲道選擇信號(hào)為低電平

            HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS 2))) = ~I(xiàn)2S_WS;

            }

            else{//右聲道選擇信號(hào)為高電平

            HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS 2))) = I2S_WS;

            }

            ……

            }

           ?、?選擇高低字節(jié)。將左聲道數(shù)據(jù)以高低字節(jié)的順序發(fā)送,在發(fā)送高字節(jié)第1位數(shù)據(jù)之前先發(fā)送1個(gè)周期的串行時(shí)鐘。

            for(HorLCnt=0;HorLCnt2;HorLCnt++){//聲道數(shù)據(jù)高低字節(jié)選擇

            if(ChannelCnt==0){//左聲道

            if(HorLCnt==0){//高字節(jié)

            c=*(SampleData+1);//SampleData指向音頻數(shù)據(jù)緩沖區(qū)首地址,即左聲道低字節(jié)

            delayI2S(2);//發(fā)送第一個(gè)數(shù)據(jù)位之前需要延遲一個(gè)位時(shí)鐘周期

            }

            else{//低字節(jié)

            c=*SampleData;

            }

            }

            ……

            }

           ?、?開(kāi)始傳輸音頻數(shù)據(jù)(音頻數(shù)據(jù)的傳輸在SCK下降沿準(zhǔn)備數(shù)據(jù),在SCK的上升沿發(fā)

            送給數(shù)據(jù)接收端)。將采樣點(diǎn)左聲道數(shù)據(jù)的高字節(jié)最高位送給SD,設(shè)置SCK為低電平,此時(shí)為SCK的下降沿,數(shù)據(jù)準(zhǔn)備好。延時(shí)半個(gè)SCK周期以后將SCK置為高電平,此時(shí)SD線上的數(shù)據(jù)發(fā)送給數(shù)據(jù)接收端,延時(shí)半個(gè)SCK周期。依次將左聲道剩余位數(shù)據(jù)按照最高位的方式發(fā)送出去。

            for(BitCnt=0;BitCnt8;BitCnt++){//1次傳送的數(shù)據(jù)長(zhǎng)度為8位,先傳送高字節(jié)再傳送低字節(jié)置時(shí)鐘線SCK為低,開(kāi)始準(zhǔn)備數(shù)據(jù)位

            HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_BCK 2))) = ~I(xiàn)2S_BCK;

            if((cBitCnt)0x80) {

            HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_DATA 2))) = I2S_DATA;

            }

            else{

            HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_DATA 2))) = ~I(xiàn)2S_DATA;

            }

            delayI2S(1); //延時(shí)半個(gè)SCK時(shí)鐘周期置時(shí)鐘線為高,開(kāi)始傳輸數(shù)據(jù)位

            HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_BCK 2))) = I2S_BCK;

            delayI2S(1);//延時(shí)半個(gè)時(shí)鐘周期

            }

           ?、?當(dāng)將1個(gè)采樣點(diǎn)的左聲道的數(shù)據(jù)發(fā)送完以后,延時(shí)2個(gè)SCK周期,然后發(fā)送右聲道的數(shù)據(jù)(同左聲道數(shù)據(jù)的發(fā)送過(guò)程)。

            根據(jù)以上的過(guò)程對(duì)每個(gè)采樣點(diǎn)的數(shù)據(jù)進(jìn)行處理,就可以實(shí)現(xiàn)通過(guò)I2S傳輸音頻數(shù)據(jù)了。以上實(shí)現(xiàn)的是典型I2S時(shí)序模擬,而左對(duì)齊和右對(duì)齊2種格式只是時(shí)序稍有差異,模擬實(shí)現(xiàn)過(guò)程同典型I2S總線模擬實(shí)現(xiàn)過(guò)程基本相同。

            結(jié)語(yǔ)

            在以太網(wǎng)數(shù)字語(yǔ)音廣播中應(yīng)用模擬實(shí)現(xiàn)I2S總線時(shí)序,能夠成功地實(shí)現(xiàn)語(yǔ)音信號(hào)的數(shù)據(jù)傳輸,實(shí)現(xiàn)語(yǔ)音信號(hào)的實(shí)時(shí)廣播,表明了軟件模擬實(shí)現(xiàn)I2S總線的可行性,為解決不支持I2S總線的MCU和各種I2S總線設(shè)備間的通信提供了一種可行的方法。但是,在應(yīng)用軟件模擬實(shí)現(xiàn)I2S的以太網(wǎng)數(shù)字語(yǔ)音廣播系統(tǒng)實(shí)時(shí)播放語(yǔ)音信號(hào)時(shí),存在一些噪聲,表明在采用軟件模擬實(shí)現(xiàn)I2S的時(shí)序精確性上存在一些欠缺。


          linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();