Si5351Aを使って簡易I2Sマスタを作ってみる
外部クロックがらみでいろいろ調べていたところ、秋月電子通商でSilicon Labsの3CHクロックジェネレータSi5351Aモジュールを見つけたので、これでI2Sマスタを作ってみた。
クロック出力をちょうど3系統持っているので、MCLK/BCLK/LRCLKの3種を生成してみる。
ポイント
- Si5351Aモジュール搭載の25MHzクロックから計算上の誤差やAccumulated Jitterなしで44.1kHz/48kHz系のクロックを生成できる。
- 通常SoCやDAI/DAC内部のDividerで生成するLRCLKまで低Jitterのクロック出力で賄えるのが特徴かな?
- LRCLKで出力タイミングを作っているDACには効果があるかもしれない
- SoC内蔵のDividerよりSi5351AのDividerのほうがJitterが少ないと仮定してですが
- 内蔵PLLのAccumulated Jitterがそもそも多いRaspberry Piにも良さそう。SoCが出力できないMCLKも生成できる。
- RPiの出力はAccumulated Jitterと呼ばれる計算上の辻褄あわせで、時々1周期の長さが可変するJitterが存在する。
- RPiのAccumulated JitterはMASHフィルタを無効化することで抑制できるらしい(未テスト)
- 8Pin DIPモジュール形状で500円とお手ごろ価格。電源とI2Cを繋ぐだけ。
- 自作基板を作るならSi5351A 110円くらい+水晶 100円くらいかな?
- 使用上の注意点としては、必ずVDDOを先かVDDと同時に立ち上げること。VDDOを供給せずVDDを入れると壊れることもあるようです。
- チップが非常に弱いので逆接や電源シーケンスを守らないと簡単に壊れます
実装方法
ハードウェア
結線について
- POWER
- VCORE/VOUTに3.3Vを供給する
- GNDを繋ぐ
- I2C
- SCL/SDAをSBCに接続する。NanoPi NEO2の場合にはPU抵抗を忘れずに。
- CLKOUT
- CLK0をMCLK/CLK1をBCLK/CLK2をLRCLKに接続する。
- 実験の様子。上のほうに居る8pin DIP基板が秋月のSi5351Aモジュール。
対応ハードウェア
blue-7さんが頒布しているハードウェアを使うと簡単に動作させることができます。
トップの写真はI2S AUDIO HATに秋月のSi5351Aモジュールを搭載したものです。
ソフトウェア
- Si5351Aドライバはdrivers/clk/clk-si5351.cに居るのでこれを利用
- DAI LINKドライバでSi5351Aのクロックを設定して音を出すようにした
- DAI_FMTはCBM_CFMに設定する(BCLK/LRCLKを外部から供給する)
- 適切にMCLK/BCLK/LRCLKを算出し、Si5351Aドライバに設定(clk_set_rate)
- 適切にfsを算出し、CPU DAIドライバに設定(snd_soc_dai_set_bclk_ratio)
考察とかメモとか
- 音質はIntPLLより向上。
- 水晶発振器をOE切り替えて鳴らすのとどっこいかちょい劣るくらい?
- Si5351Aの発振子の種類で結構音が変わるっぽい
- 秋月のモジュールに載ってる25MHzは割と元気な音がする
- BCLK_RATIO(MCLK/BCLK比)が正しく出力されるので、AK449X以外のMCLKが必要なDACでも問題なく動作可能
- PCM1794(I2S/RJ24)やFN1242A(I2S/RJ24)あたりでも再生できることを確認済み
実験用のカーネルなど
- ソースはgithubにコミット済み github.com
- クロック制御の実体は下記ソース
sound/soc/codecs/i2s_mfdl.c
- Si5351Aの指定は下記dtsを参照のこと
arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2-i2s_3clk.dts
- 近いうちに対応済みVolumio2イメージを公開予定です
- ラズパイ向けのドライバセットも出せるかも
Si5351Aのスペックをメモ
- Si5351Aは25MHzの水晶振動子を基に2.5kHzから200MHzまでのクロックを生成できる。
- 150MHzを超えるクロックはMultisynth Dividerの設定値に制約が生じるがオーディオ用途では関係なさそう
- 500kHzを下回るクロックはMultiSynth Dividerで生成できないが、Output StageのR Divと併用することで2.5kHzまで下げられる
- PLLは2系統で3ch出力
- 各chにMultisynth DividerとR Divが居て、クロックソースをPLLA or PLLBから選ぶ形式
- オーディオ用途だと基本的にすべてが整数比で割り切れるのでPLLAだけ使えればよい
- ジッタ関連
- Phase Jitterは3.5psだそうな
- Webにしか記述は無い。おそらくTypical
- Period Jitter max 155ps / typ 70ps
- 水晶発振器には及ばないがそこそこ良さそう。
- 京セラのKCシリーズではPhase Jitter max 1.0ps/Period Jitter max 50ps
- Phase Jitterは3.5psだそうな