いろいろいじっている間に踏み抜いた落とし穴があるので書いておきます。
まず最初にレジスタアクセス。Datasheet Rev.C には「全てのアドレスにシングル・アドレスでも、バースト・モードでもアクセスできる」と書いてあります。
All addresses can be accessed in both a single-address mode or a burst mode.
これを「全てのレジスタにバイト単位でアクセスできる」と解釈すると泥沼にはまります。これは書いた人の英語力に問題があるとしか思えないですが、ここに書いてあることの意味を日本語で書くとこうなります。
全てのアドレスに対して single-register mode でも、 multiple-register モードでもアクセスできる。
そもそもバースト・モード自身、アドレスは一回しか送りませんから、シングル・アドレスと対立させることが間違っています。さて、これの何が落とし穴かというと、1本だけ複数バイトからなるレジスタがあるのです。R2のPLL Controlです。
ADAU1361には1本だけ複数バイトからなるレジスタがあり、しかもデータ・シートの何処を見渡しても『分割アクセスしてはならない』などと書いていません。その上、上の記述です。はい。分割アクセスしてしまいました。見事にどぶ板を踏み抜きました。
少なくともI2Cでアクセスする場合は、R2を分割アクセスしてはいけません。バースト・モードでアクセスしてください。
もうひとつ、PLLのロックが確立するまではSRCを設定してはいけません。これがまた見つけにくい問題で、この問題が表面化するのは
- SRCを使っていて
- かつ、コールド・スタートの場合
に限られます。
これはつまり、FS=48kHzや、Fs=44.1kHzの時にはプログラムの問題が表面化しないということです。そしてFs=96kHzやFs=32kHzのようにSRCを使う場合も、ウォーム・スタートの場合は問題が表面化しません。そしてmbedによる開発は常にウォーム・スタートです。
「ロック・ステータスの確認なんて当然だろう」
はい、その通りですね。ぐうの音も出ません。せめてわかりやすい初期化コード例でも提示されていれば楽だったんですけどね。
ちなみにまだ音は出ていません。なぜでしょう。明らかにDACには正しいデータが入力されているのですが。