アドレスが重複するI2Cデバイスを一つマイコンにぶら下げたい

アドレスが重複するI2Cデバイスを一つマイコンにぶら下げることを考える。 最近はデバイス側で回路的にCSがあったりやアドレスが変更できたりするものや内部EEPROMに書き込んで設定できるモジュールも増えてきたが、そういうデバイスばっかりでもない。 自分はアプリケーションシートにCSがあると書かれてるのに使えなかったToFデバイスで必要になった(愚痴)が、聞いた話だとRCJとかだとカラーセンサーで困るとか、そういう話があるらしい。

やりかた

  1. 複数の独立したI2Cポートを使う
    • よほどピン数が少ないマイコンボードを除いて2つか3つくらいはあるのでそれを使う。
    • 上限はマイコンボードについてるI2Cの数になる。
  2. I2Cバスマルチプレクサを使う
    • ちゃんと世の中そういう専用ICがある。 秋月で売ってるPCA9547Dとか。
    • digi-keyとかの利用にためらいがないなら2,4,8chのライナップがNXPから出ているので適当に選べる。
  3. NchFETでなんちゃってCSを組む
    • やや真っ当ではない
    • 次で解説

あとはロードスイッチでぶら下がってるモジュールの電源ごとOnOffしたり、イネーブルピン付きのI2Cバスリピーター/レベル変換を複数使うとかあるけども、前者は物によっては変な挙動をしそうだし、後者はバスリピーターやレベル変換が不要な場合、大げさな感じもする。

NchFETでなんちゃってCS

I2Cはマスター側のクロックが来てない間はデータ側がどんな信号来てようが無視される。 また、マスター側からのみクロックを出すので、双方向である必要がない。 なので、単純に1デバイスに付き1枚のNchFETだけでクロックを通す回路を組める。

なんちゃってCS回路

今回はVccは3.3V、マイコン側にRaspberry Pi Picoを、デバイス側にToFがある想定なのでpicoとかtofとかあるが、適当に読み替えてほしい。 CSがHighの時、そこにだけクロックが供給される。

Picoの内蔵プルアップは使っていない。ToF3枚程度ならこれで動いた。

注意点として、FETはオン電圧(ゲートスレッショルド電圧)が十分に低くないと3.3Vの回路ではうまく動かない。 今回はBSS138を用いているので問題ないが、2N7000とか使うと多分動かないんじゃないだろうか。 選定はデータシートのオン抵抗対ゲート・ソース間電圧のグラフや、ゲートソース間電圧ごとのドレイン・ソース間電圧とドレイン電流のグラフなどを見て行けそうかどうか判断する必要がある。

BSS138のデーターシートより
2N7000のデータシートより、3Vの曲線を見るにだいぶ厳しそう

まとめ

専用ICあるんだからI2Cバスマルチプレクサ使え。