I2Cアドレスの衝突を解決する方法は?


39

複数のI2Cスレーブデバイスをすべて同じピンセットのマイクロコントローラーに接続したいのですが、I2Cデバイスはすべて同じアドレスを共有しています。アドレスはハードウェアで固定されています。

同じアドレスで複数のデバイスを接続する方法はありますか?

おそらく、構成可能なアドレスを持つ各デバイスを備えた何らかの種類のI2Cアドレス変換モジュールなので、各デバイスに独自のアドレスを割り当てることができます。

回答:


24

これを行うためにI2Cに組み込まれているものはありません。通常、スレーブデバイスには、この問題を回避するためにアドレスビットを切り替えるために0または1に設定できるいくつかの外部ピンがあります。あるいは、1つの部品に4つまたは5つの部品番号を持っているいくつかのメーカーに対処しましたが、唯一の違いはそのI2Cアドレスです。

ほとんどのデバイスには、I2C通信を処理する特定のハードウェアがあります。つまり、スレーブACKはハードウェア内にあるため、実際にハックすることはできません。

変換モジュールについては、2個のI2Cバスで0.50ドルのPICを購入し、簡単なコードを書いて、アドレストランスレーターとして機能させることができます。


ありがとう。ええ、これらのデバイスにはアドレス選択がありますが、2つのアドレスの間でしかなく、5つ以上のデバイスを接続したいので、やはり衝突が発生します。PICの使用は考えていませんでした。それはうまくいくはずです。この種のことをする既成のものはありませんか?
サイモンPスティーブンス

11
NXPはI2C用のマルチプレクサ/スイッチの束を作成しますが、それらから何かをリグできる可能性があります:ics.nxp.com/products/i2cmuxesたとえば、それぞれ2つのデバイスを持つ3つのサブブランチを作成できます、NXPのスイッチの1つを使用して目標を達成します。
マーク

それはまさに私が探していたものです。名前がわからなかった。ありがとう。
サイモンPスティーブンス

この回答は7年前のものなので、提供された時点では最高だったと思います。ただし、現在通過している他のユーザーにとっては、より新しい回答(現在はリストの下位にランクされている)のいくつかは、現在市場に出ている新しいコンポーネントに基づいて潜在的に優れたアプローチを提供します。
ブリック

6

固定アドレスを持つ複数のI2Cデバイスでこの問題に遭遇しました。解決策は、マイクロコントローラーのI / Oラインを使用して、アドレス指定したくないデバイスのSDAラインを強制的にハイにし、ターゲットのデバイスのI / Oラインを入力として設定することです(高インピーダンス)。これは、ターゲットデバイスのみがそのI2Cアドレスと一致し、他のデバイスは後続のデータを無視することを意味します。

同じアドレスを持つ複数のI2Cデバイス

非アクティブなデバイスのSDAライン上の抵抗はバスのプルアップとして機能するため、正確な値はデバイスの数とバスに必要なプルアップに依存します。したがって、10Kの抵抗を選択すると、3つの非アクティブデバイスが3K3プルアップを提供します。

ショットキーダイオードにより、デバイスがホストにデータを送り返すときにSDAラインを十分に低く引き下げることができます。


あなたがフォローアップしてこれを投稿してくれたことに感謝します。これは非常に独創的な解決策であり、他の人にも役立つと確信しています。
サイモンPスティーブンス

一部のアプリケーションで使用できるすてきなニッチ。それは大好きです。
ハリースベンソン

5

I2Cデバイスのいずれもクロックストレッチング(ハンドシェイク)を使用していない場合、およびI2Cマスターをビットバンギングしている場合、単純なハックはデバイスのいくつかにクロックピンとデータピンをスワップさせることです。バイトの送信中、クロックピンとデータピンが交換されたデバイスは、各「0」ビットを非イベント(クロックなしでデータの立ち上がりと立ち下がり)として認識し、各「1」ビットをI2Cストップとして認識します。および開始(データが低いときにクロックが立ち上がり、データの立ち上がりと立ち下がりが休み、その後クロックが立ち下がります)。あるデバイスの意図的な停止および開始条件は、他のデバイスからはデータビットとして認識される場合がありますが、1つのデバイスが「1」ビットの間に過剰な数の開始および停止条件を持たない限り、どのデバイスも「誤って」


6
私は投票していませんが、これは私には少し危険なようです。I2Cでの私の経験では、通常の接続だけで十分にノイズが発生しやすくなります。ただし、「ハッキング」という言葉を使用し、「i2cデバイスのいずれもクロックストレッチングを使用していない場合」という警告に言及しているため、誰かのために機能する場合は、より強力になります。
ジェイソンS

5

バススイッチを使用して、アドレスが競合するデバイス間でI2Cバスを多重化することを検討します。バススイッチは容量と抵抗が非常に低く、バッファ/ドライバとは異なり、2つの回路ノードを接続または切断する真のスイッチです。

バススイッチには通常、1つの奇妙な特性があります。これは、オープンドレインデバイスを使用しているため、I2Cには関係ありません。電源Vdd。(これは、スイッチがオンになったときに電源にゲート電圧を持つMOSFETであるため、スイッチド電圧がVddに近づくにつれて、利用可能なVgsがはるかに低くなるためです)


1
リンクが壊れています。 fairchildsemi.com/product-technology/bus-switchesはより適切に機能します。
フロリダ州

4

比較したいTCS3414カラー光センサーが2つありました(フィルターが異なるFNパッケージとCSパッケージ)。I2Cアドレスはハードワイヤードされています。SCL(クロック)およびSDA(データ)ラインに関してI2Cがどのように機能するかを見て、SDAラインをオフにすると、チップがスタートビットまたはストップビットを取得できなくなり、休止状態のままになるように見えました。そのため、CMOSアナログスイッチ(4066B)を使用して、各デバイスへのSDAラインをオンまたはオフにしました。これは、2つのデバイスを切り替えるのにうまく機能しました。私はそれがハックであることを知っており、PCA9548の方がはるかに優れていると思いますが、便利なものはありませんでした。


実際、これはまったくハックではなく、これが受け入れられた答えであるべきだと私は主張します。これがいくつかの商用製品で使用されているのを見てきましたが、より良いソリューションは考えられません(GPIOが利用できないため、I2C固有のマルチプレクサなどの純粋なI2Cソリューションが必要でない限り)。古き良きアナログマルチプレクサには十分な帯域幅があり、非常に安価です。
ジェイカールソン

4

現在、答えがあります-Linear Techには、LTC4316 / 17/18シリーズのアドレストランスレータがあります。それらは比較的新しく、可用性は不確実です。


非常に興味深いコンポーネント。ほとんどのI2Cデバイスには2つの固定アドレスがあり、LTC4316は合理的なコストでアドレス指定を2倍にすることができます。
Mehrad

4

いくつかのメーカーは、I2CバスのマルチプレックスおよびスイッチICを提供しています。

muxは一度に1つのチャネルをアクティブにできます。スイッチは、複数のスイッチを並行して有効にできます。

たとえば、NXPTI、およびMaximの製品を確認してください。

実験のために、AdafruitにはTCA9548aボードがあります。

同じアドレスのターゲットチップが8個ある場合は、8対1のMUXを選択します。ターゲットチップにアクセスする前に、正しいI2CバスをアクティブにするようにMUXを構成します。

長所

  • プログラミング不要(マイクロコントローラベースのアプローチとは異なります)
  • I2C機能と必要な速度をサポートできます(通常のアナログ/デジタルバスマルチプレクサと比較)。たとえば、通常の(I2C以外の)MUXは、すべてのチャネルにジェネラルコールアドレスを渡しません。

-1

シンプルなdemuxチップ(74HC139 afaikなど)を使用し、I2C CLKピンを入力に接続します(I2C CLKピンは出力のみであるため)。GPIOピンを使用して、目的の出力を制御します。その後、I2Cデータピンをすべてのスレーブ間で共有できます。


6
SCLは出力のみではありません。スレーブは速度を落とす必要がある場合にクロックを延長することがあります。
-stevenvh

アナログマルチプレクサー(双方向)を使用できますが、デコーダーはstevenhが述べた理由で動作しない場合があります。マルチプレクサーを使用する場合、スレーブ側に弱いパルプが必要です。また、バスがアイドル状態のときにのみ、マルチプレクサの選択を変更します。
ケビンホワイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.