I2S DAC for Raspberry Pi

(AD1896+AD1852)

MCLKがないよ?

Raspberry PiはI2S出力が可能で、なかなかいい音が出ると聞きました。
しかもVolumioを導入すればソフトウェア的にはほとんどお膳立てが済んでいるとか。
I2Sの引き出し口については、T-DAC,RPi-DACを開発したTJ's FPGA and SW projectsさんとこの資料(PDF)が参考になります。

ピンアサインを見ると気づくのですが、いわゆるマスタクロック(MCK)と呼ばれるクロックが出ていません。
どうするんでしょうこれ。
普通のオーディオ用DAC ICってのは、データ用のシリアル線の他に3種のクロックを要求します。

(1)LRCK サンプリング周波数と等しい。LRCK="L"ならデータが左チャネル、"H"なら右チャネルのものであることを示す。
(2)BCK シリアルデータ線のビット区切りを示す。BCKの立ち上がりエッジがデータ取り込みのタイミング。
(3)MCK LRCKと同期していて、その周波数はLRCKの128〜768倍でなくてはいけない。位相関係は任意でよいが変動しないこと。

確かにI2S規格にはMCKの定義がありませんが、ディジタルフィルタやΔΣ機構を動かすには必須で、ないと困ります。

そこでいろいろな解決方法が出てくるわけです。
  1. MCK供給不要のDAC ICを使う
     MCKを内部PLLで生成できるPCM5102を使うことが多く、実績も豊富です。
     システムクロックがLRCKと同期することを必要としないES9018Sも使用可能です。
     もうちょっと原始的にTDA1541AやTDA1543を使う解決も、まぁ…あります。

  2. LRCKやBCKを外付けPLLで逓倍する
     RasPiのBCKは普通64fsをコンスタントに吐き出してきます。
     外付けPLL ICを使って、例えばLRCKを256逓倍するかBCKを4逓倍すれば256fsが得られるわけです。
     h_fujiwaraさんとこに詳しい記事があります。

  3. 外部でクロックを生成しておいてRaspberry Piをスレーブ動作させる
     通常、RasPiは自分でI2S出力に必要なクロックを生成します。
     これを外部のクロックジェネレータにやらせて、RasPiはGPIO経由で周波数を指示するだけにします。
     RasPiではあまり見かけませんが、BeagleBoardBlack用DACでは44.1/48系双方対応するために必要となるそうです。
     三日坊主な私がいつまでブログやれるか...( ̄~ ̄;) にハードウェア・ドライバ双方にわたる詳細な記事があります。
     
  4. MCKの代わりに無理矢理BCKを注入する
     海外でそういう作例があるそうです。PCM1794Aが64fsでも動くこと自体が驚き。
     あまりお勧めできません。

  5. 非同期サンプリングレートコンバータ(ASRC)を間に挟む
     SRC4190/4192、AD1895/1896といったサンプリングレートコンバータICがあります。
     入力ポートにI2S(LRCK,BCK,DATA)を送り込み、出力ポートにLRCKとBCKを注入してやれば、入力側サンプリングレートと 出力側クロック周波数を見ながら自動的にサンプリングレート変換を行い、出力ポートから変換されたデータが出てくるというもの。
     ここで「サンプリングレートと同期したMCKをくれ」とは要求してこないので、RasPiからMCKの供給がなくてもよくなるわけです。
それぞれの方法に長所と短所はありますが、今回は5.の方法でDACを作ってみることにしました。Raspberry Pi側のハードウェアやソフトウェアに手を加える必要がなく、またサンプリングレートの変更があってもDACの設定を変えることなく追従するのが利点で す。
また(あまり過剰な期待はしないことにしますが)Raspberry Piで発生するクロックジッタをちょっとは吸収してくれるかもしれません。

キーデバイスについて

ASRCとして、今回はAD1896を使うことにしました。Digi-keyやRSコンポーネンツで買えます。
普通は入出力クロックスレーブ状態、つまり入力ポートからも出力ポートからもLRCKとBCKの供給を受けて、両者のクロックタイミングと整合性が取れるように音声データを変換するという動作です。
この場合、ASRC出力ポートとDAC ICのためにクロック回路を用意しなくてはいけません。

  ・DACのためにMCKを発生させる水晶発振器
  ・さらにそのMCKを分周してLRCKとBCKを生成する回路

そしてASRCには独立して30MHzのシステムクロックが必要になりますから、なんだかクロックだけでも煩雑ですね。

でも、AD1896には出力ポートでクロックマスタになるモードがあります。大雑把に言うと、

  ・AD1896のシステムクロックを256分周して、それを出力側サンプリングレートとする
  ・出力側のLRCKとBCKはAD1896内部の分周器により生成され、出力ポートに送り出される

というもの。DACのMCKはAD1896と共通にすればよいことになり、クロックジェネレータが一元化できます。

AD1896のシステムクロックにはいろいろと条件があります。

  ・クロック周波数は通常30MHz以下、条件が整っても最高34MHzまで
  ・入出力で取り扱うサンプリング周波数の138倍以上の周波数が必要
  ・クロックマスタモードの分周比は1/256,1/512,1/768のいずれかのみ選択可

これを見ると、クロックマスタモードを使う限り、DACをfs_out=192kHzでは動かせそうにないことがなんとなくわかります。
かといってシステムクロックを24.576MHzにしてfs_out=96kHzにすると、今度はRaspberry Piからfs_in=192kHzの音声が送られてきたときに困りますよね。

そこで、システムクロックを27.000MHzとして、fs_out=105.5kHzでDACを動作させることにしました。

DACはAD1852を使います。
東芝の古いDVDプレイヤーから取り出してきたもので、一度ちゃんと使ってみたかったのです。
電圧出力なので、DAC出力のアナログ回路が比較的簡単。
ほぼ同等性能で電流出力のAD1853はオーディオ機器によく採用されていて好評だったようです。

これらを普通に接続することにして、回路図を書きます。

回路図とレイアウト

s-dar1852sche.jpg
回路図拡大(png)

レイアウト図
dar1852-layo.png

感光基板用フィルム(そのまま作るのはお勧めしません、参考までに)
部品面(インク面が基板に密着、600dpi)
半田面(インク面が基板に密着、600dpi)

リードフォーミングされた100uF電解コンデンサがやたら余っているとか、ちょっとはMUSE(黒)を使ってみたいとか、スルーホールが作れないとかいった理由でちょっと変な基板ができてくると思いますので、あまりそのまま製作しない方がいいかも、とは思います。
あと、実際に前バージョンの基板を作った後で気づいた回路ミスの修正を反映させてはありますが、修正後試作はしていません。

使用部品について

クロックジェネレータはKC7050B27.0000C30A00を使いました。
共立で売られているFOX924Bの27MHzでも動きそうな気はします。

アナログデバイセズのICは全てマルツで揃った時期がありましたが、今は購入できないようです
(取り扱いを再開しました。少し値上げはしたようですが、それでも安価な入手先のひとつに挙げられます)
Amazonで取り寄せるという方法もあります。出店しているのが加賀電子(エーディーエム)といいますから、まごうことなき正規代理店です。

10uFのタンタルコンデンサですが、特別に細かい指定はありません。マルツで売られているリンクマンの47uFとか、安価でサイズもちょうどいいと思います。ディジタル系の小さい0.1uFは普通の積層セラミックです。
電解コンデンサで特に低ESRを要求する箇所はありません。

アナログ系のコンデンサはフィルムコンデンサとオーディオ用電解コンデンサを使っておくのが良好でしょう。

オペアンプは、特別に指定をしません。オーディオ用として一般的に使われるものならたいてい使えます。
個人的にはMUSES8820Dとか薦めておきます。

アナログ電源等に大きなフィルムコンデンサを多用していますが、あれはECHUの0.1uF(50V)です。
フィルムコンデンサなら別の品種でも可。

アナログ出力には信号カップリングコンデンサを直列に入れられるようにしています。
無極性電解コンデンサを付ければとりあえず音は出ますが、あまり音質が よくありません。
基板からはみ出してもいいので、どうにかして数十uF程度のフィルムコンデンサを付けることをお勧めしておきます。
自分が製作したときは 基板裏面にDTD-Zの10uFを取り付けています。

電源は安定化された±12Vを供給します。
上レイアウト図の右端(1番)が+12V、中央(2番)がGND、左端(3番)が-12Vです。


s-P1010551.jpg


試運転

s-s-s-P1010536.jpg

とりあえずバラック組みで音を出してみることにしました。
快活な感じというのか、元気な高解像度系で、元気だけど外向きに暴れることがありません。粗もあまり出さない感じ。
湿っぽさや艶っぽさを盛る方向ではないようですので、そういうのを求めるならアンプやスピーカーで実現した方がいいのかも。

とりあえず動かすなら設定不要

Volumio1.41PI〜1.51PIを使い、音声データはUSB端子に挿したストレージに入れておく
…という使い方をするなら、VolumioのイメージをSDカードに書き込めばすぐ使えます。
DHCP有効、UPnP名前解決ができる状態で起動しますので、webブラウザで
http://volumio/
http://volumio.local/
上記いずれかを開けば操作可能になります(環境がIPv4、IPv6のいずれかによって異なる)。
IPアドレスを固定するのも、I2Sドライバを有効にするのもwebブラウザ上で可能です。
また、USB端子に挿したストレージがWindowsの共有フォルダとしてアクセスできますので、PCから音声ファイルを送り込むのも容易。

それ以上のカスタマイズについてはまた後日書くかも。

戻る