嵌入式系統(tǒng)中I2S總線數(shù)據(jù)通信的軟件模擬
根據(jù)MS6336的I2S總線格式以及數(shù)據(jù)發(fā)送流程,軟件模擬I2S總線的步驟如下:
?、?根據(jù)語音數(shù)據(jù)采樣率及采樣位數(shù)計算得到SCK的值和WS的值(WS的值等于采樣頻率)。
系統(tǒng)采樣率為44.1 kHz,則SCK=2×44.1 kHz×103×16=1 411 200 Hz,WS=44 100 Hz。1個SCK時鐘周期T=1/SCK=07 μs。采用延時程序模擬SCK時鐘周期需要應用示波器來精確延時時間。本系統(tǒng)中一個SCK周期的延時為delayI2S(2)。
?、?將WS、BCK和DATA均置為高電平。
?、?選擇左右聲道。首先發(fā)送左聲道數(shù)據(jù),將WS置低(若發(fā)送右聲道數(shù)據(jù)則將WS置高)。
for(ChannelCnt=0;ChannelCnt2;ChannelCnt++){//雙聲道選擇播放
if(ChannelCnt==0){//左聲道選擇信號為低電平
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS 2))) = ~I2S_WS;
}
else{//右聲道選擇信號為高電平
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_WS 2))) = I2S_WS;
}
……
}
?、?選擇高低字節(jié)。將左聲道數(shù)據(jù)以高低字節(jié)的順序發(fā)送,在發(fā)送高字節(jié)第1位數(shù)據(jù)之前先發(fā)送1個周期的串行時鐘。
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ā)送第一個數(shù)據(jù)位之前需要延遲一個位時鐘周期
}
else{//低字節(jié)
c=*SampleData;
}
}
……
}
?、?開始傳輸音頻數(shù)據(jù)(音頻數(shù)據(jù)的傳輸在SCK下降沿準備數(shù)據(jù),在SCK的上升沿發(fā)
送給數(shù)據(jù)接收端)。將采樣點左聲道數(shù)據(jù)的高字節(jié)最高位送給SD,設(shè)置SCK為低電平,此時為SCK的下降沿,數(shù)據(jù)準備好。延時半個SCK周期以后將SCK置為高電平,此時SD線上的數(shù)據(jù)發(fā)送給數(shù)據(jù)接收端,延時半個SCK周期。依次將左聲道剩余位數(shù)據(jù)按照最高位的方式發(fā)送出去。
for(BitCnt=0;BitCnt8;BitCnt++){//1次傳送的數(shù)據(jù)長度為8位,先傳送高字節(jié)再傳送低字節(jié)置時鐘線SCK為低,開始準備數(shù)據(jù)位
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_BCK 2))) = ~I2S_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))) = ~I2S_DATA;
}
delayI2S(1); //延時半個SCK時鐘周期置時鐘線為高,開始傳輸數(shù)據(jù)位
HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (I2S_BCK 2))) = I2S_BCK;
delayI2S(1);//延時半個時鐘周期
}
⑥ 當將1個采樣點的左聲道的數(shù)據(jù)發(fā)送完以后,延時2個SCK周期,然后發(fā)送右聲道的數(shù)據(jù)(同左聲道數(shù)據(jù)的發(fā)送過程)。
根據(jù)以上的過程對每個采樣點的數(shù)據(jù)進行處理,就可以實現(xiàn)通過軟件模擬I2S總線傳輸音頻數(shù)據(jù)了。以上實現(xiàn)的是典型I2S時序模擬,而左對齊和右對齊2種格式只是時序稍有差異,模擬實現(xiàn)過程同典型I2S總線模擬實現(xiàn)過程基本相同。
結(jié)語
在以太網(wǎng)數(shù)字語音廣播系統(tǒng)中應用軟件模擬實現(xiàn)I2S總線時序,能夠成功地實現(xiàn)語音信號的數(shù)據(jù)傳輸,實現(xiàn)語音信號的實時廣播,表明了軟件模擬實現(xiàn)I2S總線的可行性,為解決不支持I2S總線的MCU和各種I2S總線設(shè)備間的通信提供了一種可行的方法。但是,在應用軟件模擬實現(xiàn)I2S的以太網(wǎng)數(shù)字語音廣播系統(tǒng)實時播放語音信號時,存在一些噪聲,表明在采用軟件模擬實現(xiàn)I2S的時序精確性上存在一些欠缺。
評論