Si5351Aを使って簡易I2Sマスタを作ってみる

 外部クロックがらみでいろいろ調べていたところ、秋月電子通商でSilicon Labsの3CHクロックジェネレータSi5351Aモジュールを見つけたので、これでI2Sマスタを作ってみた。
 クロック出力をちょうど3系統持っているので、MCLK/BCLK/LRCLKの3種を生成してみる。

f:id:tkztkztkz:20190501210333j:plain

ポイント

  • 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に接続する。

f:id:tkztkztkz:20190502124205j:plain - 実験の様子。上のほうに居る8pin DIP基板が秋月のSi5351Aモジュール。

対応ハードウェア

 blue-7さんが頒布しているハードウェアを使うと簡単に動作させることができます。

sites.google.com

 トップの写真は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