天天看點

基于AVR模拟I2S時序的原理分析

最近在了解相關I2S模拟時序的資料,在網上流傳的方案用一片AVR 模拟出I2S信号,讓不具備I2S接口 的MCU處理音頻資料與帶I2S的DAC通信,完成音頻解碼輸出。

有關于音頻資料格式的計算參見另一篇blog,這裡隻分析I2S模拟時序作原理。

程式代碼網上都有,介于各種權利在此隻對其實作原理及硬體架構做分析。

聲明:為尊重原作者的本意,下面按原作者的順序進行闡述。

模拟I2S的主體思路有兩種,但大緻架構一緻,如圖:

基于AVR模拟I2S時序的原理分析

思路1,用支援20MHz外部晶振且帶CLKO的AVR,工作在音頻DAC的工作頻率(如16.9344MHz),

用3個定時器分别工作在CTC,CTC,Fast PWM模式下模拟出I2S總線的LRCLK(即fs)、

BCLK(SCLK)、SPI的片選CS,當然AVR的CLKO為MCLK且SPI的從機為另外發送SDATA的主機,如上圖。

思路2,任意一款支援20MHz最大時鐘的AVR,通過彙編對IO進行控制模拟出上面4個時鐘信号。

介于我手上有mega328P我選擇了第一種方案,原作者用的是mega48,AVR系列C代碼也相容,

用T/C0、T/C1、T/C2配置為相應的模式即可,需要注意的是熔絲配置的時候不要忘記使能CLKO以及

使用外部晶振。

C代碼的實作也很簡單,出于版權這裡就不貼了,有興趣可以百度,隻大緻分析一下原理:

1,初始化T/C0和T/C2為CTC,輸出點空比50%的方波;計數TOP值根據AVR的定時器設定公式即可

計算出來;

2,初始化T/C1為比較輸出的fast PWM模式,參考CS4334的DS介紹,支援24bit位寬 96KHz的資料

格式,并且要求T/C1模拟出的SPI片選CS時序滿足一定要求;

基于AVR模拟I2S時序的原理分析

a.觀察CS4334波形,需要在BCLK/SCLK第一個周期後置低全能SPI通信;

b.且頻率為LRCK的2倍,即在單個聲道傳輸資料的時候就要完成一個周期的資料傳輸;

c.b中一個周期的資料在CS4334上可以是16BIT和24BIT,并且是DAC自适應,即不足24BIT時後8BIT

自動填充0;

是以,原作者讓CS4334工作在16BIT有效資料的模式下,CS頻率為2倍于BLK/SCL,且占空比為略小于

(24-16)BIT/24BIT,略小于的原因是CS4334的I2S時序要求,如上圖:

如上圖所示,C代碼裡在初始化代碼的時候也很巧妙的利用nop()語句實作了時序的比對,有關時鐘計算

可以參考另外的我的blog。

這裡隻分析了産生I2S的時序部分,另外需要注意的是作為SPI從機的SDATA主機的時序配置,

基于AVR模拟I2S時序的原理分析

原作者以CS4334為例,剛好我手上也有這片DAC,參數就不評價了,隻從原理上進行學習分享!

繼續閱讀