最近在了解相關I2S模拟時序的資料,在網上流傳的方案用一片AVR 模拟出I2S信号,讓不具備I2S接口 的MCU處理音頻資料與帶I2S的DAC通信,完成音頻解碼輸出。
有關于音頻資料格式的計算參見另一篇blog,這裡隻分析I2S模拟時序作原理。
程式代碼網上都有,介于各種權利在此隻對其實作原理及硬體架構做分析。
聲明:為尊重原作者的本意,下面按原作者的順序進行闡述。
模拟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時序滿足一定要求;
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主機的時序配置,
原作者以CS4334為例,剛好我手上也有這片DAC,參數就不評價了,隻從原理上進行學習分享!