ちょっと Tea Time!? I2Cだけで基板やデバイスの区別はできるか? 2025.1.30
現在 Renew DIV5142とCONTROLLER UNITをつかって統合システムを作ろうとしていますが、
過去につくった基板も接続できるようにすると、無駄にならなくて済みます。
課題は、接続した基板やそこで使われているデバイスが何かがわかることです。
外部からパラメータ等で明示するのがもっとも確実ですが、そのためのプログラムを作るのも
あまりスマートではありません。多くの基板がI2Cで動いていることもあり、それをつかって
わからないかなあ〜というのが今回のTea Time!?です。
区分可能かどうかのポイントはI2Cをつかっているデバイスのアドレスの違いです。
1.DAIやSRCについて
CONTROLLER UNITに接続できそうな基板は下記になりそうです。
下記の4つで比べると、全部ことなることがわかりました。SRC4137とRenewSRC4137は
似ていますが、SRC4137の方がPCA9539を2個つかっているので、これから区別できそうです。
基板名 | I2Cアドレス |
Renew Simple DAI for CS8416 |
CS8416:0x20 |
Renew DAI9211 | PCM9211:0x80 |
SRC4137 | DIX9211: 0x80 AK4137:0x20 PCA9539:0xee PCA9539:0xec |
Renew SRC4137 | DIX9211: 0x80 AK4137:0x20 PCA9539:0xee |
2.DACについて
手元にあり使えそうなものを調べてみました。条件はPCM(I2S)入力があるものです。
こうやって眺めてみると、かなり意外と構成がバラバラなこともあり、区別はできそうです。
基板名 | I2Cアドレス | 備考 | |
DAC34301 DAC34352 |
PCM9211:0x80 BD34301/52:0x38〜0x3e PCA9539:0xec |
BD34301とBD34352の違いは IDレジスタで判別可 |
|
DAC343XX | CS8416:0x20 BD34301/52:0x38〜0x3e PCA9539:0xec |
同上 | |
DAC343XX-S | BD34301/52:0x38〜0x3e | 同上 | |
DAC1795-I2C | PCM1795:0x98〜0x9e PCA9539:0xe8〜0xee |
||
DAC179X-2.1 | CS8416:0x20 PCM179X:0x98 PCM179X:0x9a |
チップの違いは? | |
DAC4497-2.1 | AK4497: 0x20 AK4497: 0x24 DIX9211:0x80 PCA9539:0xee |
||
DAC4493-5 | AK4493: 0x20 AK4493: 0x22 AK4493: 0x24 AK4493: 0x26 DIX9211:0x80 PCA9539:0xee |
||
DAC4493-I2C | AK4493: 0x20〜0x26 PCA9539:0xe8〜0xee |
||
DAC4499 | AK4499: 0x20〜0x26 |
その他、ES9018などをつかったDACもあるけど、回路図が手書きでかなり省略しているので、
なにがなんだかプログラムから紐解かないといけないので、ちょっとパスです。
SRC4137をCONTROLLER UNITに繋いでみよう!
基板箱の中からSRC4137が見つかったので、これを繋いでみましょう。
ちょっと埃がついていたので、コンプレッサーで吹き飛ばしたら綺麗になりました。
改造はPICのところのみで行いますので、別のICソケットを用意してそこに配線をして、
ICを差し替えます。I2Cの取り出しはスイッチの接続ポートを流用です。そこには
47kΩのプルアップ抵抗があるので、除去しておきましょう。I2Cのプルアップ抵抗に
47kΩが追加されても、問題ないのですがCONTROLLER UNITのプルアップ抵抗が
1kΩと低くしていることもあり、これ以上の負荷をかけたくなったので念のため削除です。
当然のことながら、SRC4137のI2Cのプルアップ抵抗であるR4,R5も取り除きます。
なお、システムクロックは本来は色々と可変できるようになっていますが、ここでは
24.576MHzに固定しておきます。SRC4137には未使用のI/O拡張期のポートが沢山
あるので、それらでコントロールしてもいいけど、まずはシンプルに動かすところを目指します。
SRC4137を繋いでみましょう。以前にSLAVE UNITで使っていたものです。
基板端子をツつかってI2C信号を取り出します。
あっても大丈夫だろうけど、不要なプルアップ抵抗は取り除いておきます。
I2Cのプルアップ抵抗R4,R5も取り除いておきます。
PICの代わりにこのような配線を行ったICソケットを差し込みます。
認識するかな?
CONTROLLER UNITのI2C-1に接続してテストです。
無事、すべてのICを認識するかな?
CONTROLLER UNITに接続してテストです。
あれ?AK4137と通信できない?
電源をいれて、I2Cの接続状況を確認しますが、基板上のAK4137(0x20)だけが
I2C通信ができません。その他のICは大丈夫です。
どうやら原因はAK4137のPDN(POWER DOWN &RESET)端子の取り扱いにあるようです。
電源投入時にはLowレベルになっている必要があったので、ずっとHighレベル固定ではだめなようです。
AK4137のPDNは電源投入時にはLowレベルになっている必要があるようです。
原因がわかったので、CR回路をつかってPDNの立ち上がりにディレイをかけます。
そうすることによって、SRC4137上のすべてのICとI2C通信ができるようになりました。
CR回路によるPDNのディレイを追加しました。
ICソケット上の配線の回路です。
これで、SRC4137上のすべてのICをコントロールできるようになりました。
別のICソケットに配線を行ってPICと差し替える方法を今回はつかいましたが、
若干見た目が悪いかなあ〜。CR回路の代わりにPICを使う手もありますが、
高々数10バイト程度と思われるプログラムにPICを使うのも勿体ないので、
これが一番安上りの方法でしょう。
CONTROLLER UNITのソフトに組み込んでみましょう!
しかし、SRC4137のソフトを組んだのって、もう10年くらい前なのでなにも覚えていないなあ〜。
既存のプログラムがわかりやすく書いてあれば、いいのだけどなあ〜。
(つづく)