複数のI2Cスレーブデバイスをすべて同じピンセットのマイクロコントローラーに接続したいのですが、I2Cデバイスはすべて同じアドレスを共有しています。アドレスはハードウェアで固定されています。
同じアドレスで複数のデバイスを接続する方法はありますか?
おそらく、構成可能なアドレスを持つ各デバイスを備えた何らかの種類のI2Cアドレス変換モジュールなので、各デバイスに独自のアドレスを割り当てることができます。
複数のI2Cスレーブデバイスをすべて同じピンセットのマイクロコントローラーに接続したいのですが、I2Cデバイスはすべて同じアドレスを共有しています。アドレスはハードウェアで固定されています。
同じアドレスで複数のデバイスを接続する方法はありますか?
おそらく、構成可能なアドレスを持つ各デバイスを備えた何らかの種類のI2Cアドレス変換モジュールなので、各デバイスに独自のアドレスを割り当てることができます。
回答:
これを行うためにI2Cに組み込まれているものはありません。通常、スレーブデバイスには、この問題を回避するためにアドレスビットを切り替えるために0または1に設定できるいくつかの外部ピンがあります。あるいは、1つの部品に4つまたは5つの部品番号を持っているいくつかのメーカーに対処しましたが、唯一の違いはそのI2Cアドレスです。
ほとんどのデバイスには、I2C通信を処理する特定のハードウェアがあります。つまり、スレーブACKはハードウェア内にあるため、実際にハックすることはできません。
変換モジュールについては、2個のI2Cバスで0.50ドルのPICを購入し、簡単なコードを書いて、アドレストランスレーターとして機能させることができます。
固定アドレスを持つ複数のI2Cデバイスでこの問題に遭遇しました。解決策は、マイクロコントローラーのI / Oラインを使用して、アドレス指定したくないデバイスのSDAラインを強制的にハイにし、ターゲットのデバイスのI / Oラインを入力として設定することです(高インピーダンス)。これは、ターゲットデバイスのみがそのI2Cアドレスと一致し、他のデバイスは後続のデータを無視することを意味します。
非アクティブなデバイスのSDAライン上の抵抗はバスのプルアップとして機能するため、正確な値はデバイスの数とバスに必要なプルアップに依存します。したがって、10Kの抵抗を選択すると、3つの非アクティブデバイスが3K3プルアップを提供します。
ショットキーダイオードにより、デバイスがホストにデータを送り返すときにSDAラインを十分に低く引き下げることができます。
I2Cデバイスのいずれもクロックストレッチング(ハンドシェイク)を使用していない場合、およびI2Cマスターをビットバンギングしている場合、単純なハックはデバイスのいくつかにクロックピンとデータピンをスワップさせることです。バイトの送信中、クロックピンとデータピンが交換されたデバイスは、各「0」ビットを非イベント(クロックなしでデータの立ち上がりと立ち下がり)として認識し、各「1」ビットをI2Cストップとして認識します。および開始(データが低いときにクロックが立ち上がり、データの立ち上がりと立ち下がりが休み、その後クロックが立ち下がります)。あるデバイスの意図的な停止および開始条件は、他のデバイスからはデータビットとして認識される場合がありますが、1つのデバイスが「1」ビットの間に過剰な数の開始および停止条件を持たない限り、どのデバイスも「誤って」
バススイッチを使用して、アドレスが競合するデバイス間でI2Cバスを多重化することを検討します。バススイッチは容量と抵抗が非常に低く、バッファ/ドライバとは異なり、2つの回路ノードを接続または切断する真のスイッチです。
バススイッチには通常、1つの奇妙な特性があります。これは、オープンドレインデバイスを使用しているため、I2Cには関係ありません。電源Vdd。(これは、スイッチがオンになったときに電源にゲート電圧を持つMOSFETであるため、スイッチド電圧がVddに近づくにつれて、利用可能なVgsがはるかに低くなるためです)
比較したいTCS3414カラー光センサーが2つありました(フィルターが異なるFNパッケージとCSパッケージ)。I2Cアドレスはハードワイヤードされています。SCL(クロック)およびSDA(データ)ラインに関してI2Cがどのように機能するかを見て、SDAラインをオフにすると、チップがスタートビットまたはストップビットを取得できなくなり、休止状態のままになるように見えました。そのため、CMOSアナログスイッチ(4066B)を使用して、各デバイスへのSDAラインをオンまたはオフにしました。これは、2つのデバイスを切り替えるのにうまく機能しました。私はそれがハックであることを知っており、PCA9548の方がはるかに優れていると思いますが、便利なものはありませんでした。
現在、答えがあります-Linear Techには、LTC4316 / 17/18シリーズのアドレストランスレータがあります。それらは比較的新しく、可用性は不確実です。
いくつかのメーカーは、I2CバスのマルチプレックスおよびスイッチICを提供しています。
muxは一度に1つのチャネルをアクティブにできます。スイッチは、複数のスイッチを並行して有効にできます。
たとえば、NXP、TI、およびMaximの製品を確認してください。
実験のために、AdafruitにはTCA9548aボードがあります。
同じアドレスのターゲットチップが8個ある場合は、8対1のMUXを選択します。ターゲットチップにアクセスする前に、正しいI2CバスをアクティブにするようにMUXを構成します。
長所
シンプルなdemuxチップ(74HC139 afaikなど)を使用し、I2C CLKピンを入力に接続します(I2C CLKピンは出力のみであるため)。GPIOピンを使用して、目的の出力を制御します。その後、I2Cデータピンをすべてのスレーブ間で共有できます。