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