RPiのI2Cバスの最大デバイスロード/ファンアウト?

Aug 19 2020

私はRPi4を持っていて、4つのMCP23017 gpioエクスパンダーでI2Cバスを使用していますが、これは正常に機能します。私の意図は、8つのMCPMCP23017デバイスを使用することです。これらのデバイスには3ビットのアドレス指定しかないため、これは1つのI2Cバスで最大です。私の質問は、RPiのI2Cバスには最大のデバイスローディング/ファンアウトがありますか?

回答

2 Milliways Aug 20 2020 at 14:37

I²Cを理解していません。これはオープンドレインバスであるため、ファンアウトの概念は適用されません。負荷は静電容量によってさらに制限されます。静電容量は、デバイスの数に加えて、バスの長さとレイアウトにも関係します。値の小さいプルアップまたはバッファリングを利用することで、デバイスの数を最大化できます。

のバッファリングと多重化を参照してください https://en.wikipedia.org/wiki/I²C

「システムに多数のI2Cデバイスがある場合、大きなバスセグメントを小さなバスセグメントに分割するためにバスバッファまたはマルチプレクサを含める必要がある場合があります。これは、バスセグメントの静電容量を許容値未満に保つため、または同じアドレスを持つ複数のデバイスをマルチプレクサで分離できるようにします。」

賢明なレイアウトであれば、8台のMCPMCP23017デバイスでロードの問題が発生することはありません。

GeertVc Aug 21 2020 at 12:45

バス容量が高すぎる、ファンアウトが高すぎる(この場合に関連する場合は...)ことが心配な場合、または8つを超えるMCP23017 IOエクスパンダをRPiに接続する場合は、非常に簡単な解決策があります。 :PCA9548(8つのI2Cバス)などのI2CスイッチをRPiの元のI2Cピンに接続します。Linuxカーネルは数年前からこれを暗黙的にサポートしているので、あなたがしなければならない唯一のことはファイルに次の行を追加することです/boot/config.txt(としてsudo):

dtoverlay=i2c-mux,pca9548,addr=0x70

このようにして、追加のデバイスを接続できる8つのI2Cバスが追加されます(i2cdetect -l追加のバスとその名前を確認するために使用します)。あなたがしなければならない唯一の事、あなたのコードでは、先のソフトウェア伝えることです/dev/i2c-x、あなたのI2Cデバイスが接続されているデバイスを。

いくつかの利点:

  • バス容量の広がり
  • I2CMUXのスイッチングコマンドを気にする必要はありません。Linuxカーネルモジュールが/dev/i2c-xバスに基づいてこれを実行します。
  • 合計64個のMCP23017デバイスをRPiに(間接的に)追加できます。つまり、(クレイジーな)合計64 x 16 = 1024 IO(これ以上何が必要ですか...)
  • 重要:I2CMUXの「反対側」にある電源装置を組み合わせて使用​​できます。これは3V3にすることができますが、1V8または5Vにすることもできます。とても便利!I2C MUXのフロントエンドは、入力/出力ピンの損傷を避けるために、RPi(つまり、3V3)の電源に従う必要があることに注意してください。

不利益:

はい、1つあります。プロジェクトにハードウェアを追加する必要がありますが(制限はありますが)、このわずかな追加作業で多くの利益を得ることができます。