なぜI2Cラインはトライステートドライバの代わりにオープンドレインドライバを使うのですか?

私の理解では、I2Cラインはプルアップ抵抗を使用してバスを受動的に論理ハイにプルアップしています。バスで使用されるドライバはアクティブドライバ、つまりオープンコレクタ/オープンドレインであるためです。オープンコレクタ/オープンドレインドライバはラインをローに駆動するがハイには駆動できないので、バスの競合の問題は軽減されます。

私の質問ですが、なぜトライステートドライバとは対照的にI2Cプロトコルがこれらのドライバを使用するのですか?同じバスに複数のトライステート出力ドライバが接続されている場合、トライステートのイネーブル信号が相互に排他的である限り、バスの競合に注意を払い、立ち上がり時間を短縮することもできますオープンコレクタ/オープンドレイントポロジーとは?

5
1つの理由によるクロックストレッチそして、トライステート対応が複数の異なるデバイス間で相互排他的であることをどのように確認しますか。
追加された 著者 Tom Deloford,
立ち上がり時間に関する問題は、単純なプルアップ抵抗の代わりに電流源を使用していくらか解決できることにも注意してください。
追加された 著者 john,

6 答え

...トライステートのイネーブル信号が相互に排他的である限り...

トリックは、他のワイヤを追加せずにこれを実行する方法、またはバスの駆動が許可されたときに各周辺装置に通知するための複数のワイヤを使用する方法です。

I2Cの主な利点は、2本のワイヤと各チップ上の2本のピンがバスに接続されていることだけです。

ピンをスピードと交換したい場合は、SPIを使用することを検討してください。SPIは、一般にI2Cよりも高速を実現できますが、デバイスごとに3または4ピンが必要です。

11
追加された
@ Asmyldof:マルチマスターはいくつかのクールな機能を持っていますが、特定のシナリオを処理するためのきれいな方法はありません。たとえば、2人のマスターが同時にスレーブに「インクリメントカウンター」要求を発行した場合、それぞれがその要求は成功したと考えるかもしれませんが、カウンターは2ではなく1だけ進みます。
追加された 著者 firedfly,
@ Asmyldof:多くのデバイスにはべき乗ではないコマンドがあります。 「インクリメントカウンタ」は、説明が最も簡単なものです(2ワード)。デバイスのコマンド構造がマルチマスターでの使用のためにボトムアップから設計されていない限り、問題が発生しがちです。さらに、クロックストレッチのないシングルマスタツースレーブでも、スレーブがクロックパルスを見ない場合は回復不可能な状態になる可能性があります。マルチマスターはさらに問題のある状態を追加すると思います。
追加された 著者 firedfly,
@ Asmyldof、本当ですが、実際にマルチマスターを使用しているのはどのくらいのI2Cアプリケーションですか?
追加された 著者 The Photon,
+また、マルチマスターネゴシエーションはワイヤードORバスではかなり透過的です(@athedcha:オープンコレクターを引き上げたのはその1つです)。
追加された 著者 Asmyldof,
やり方が少なすぎる。マルチマスターはかっこいいです。しかし、それは仕様のまともな部分なので、「なぜ違いがないのか」の理由としてそれはかなり関連性があります。
追加された 著者 Asmyldof,
@supercatこの "増分カウンタ"は、誰かがその上に実装したコマンドの形式です。これらの発生がどちらのマスターのコマンドプロトコル層にも害を及ぼさないように、コマンドとトランザクションを非常に簡単に設計することができます。
追加された 著者 Asmyldof,

オープンドレインラインを必要とする2つの特定の機能があります。 1つ目はクロックストレッチで、スレーブはデータ処理中にトランザクションを遅らせるためにクロック(SCL)をローに保持することができます。 2つ目はマルチマスター調停で、複数のマスターが同時に送信しようとします。仲裁は、データラインが他のマスターによってローに保持されているのを見たときにマスターに送信を停止させることによって行われます。

仲裁は大きなものです、と私は思います。おそらく、クロックストレッチをプロトコルベースのものに置き換えることもできますが、同じバス上に複数のマスターが必要な場合は、何らかの理由で競合を避ける必要があります。別のワイヤーを追加できない限り、あなたはオープンドレインで立ち往生しています。 (同様の調停スキームを使用するCAN物理層も参照してください。)

4
追加された
トライステートのイネーブル信号が相互に排他的である限り

I 2 Cでこれを確認する方法はありません。デバイスごとに1つの有効化信号が必要です。これで、 SPI の従兄弟を発明しました。

2
追加された
発明されていない、実装されています。それは既に存在しており、それを実装している全員によって異なって広く使用されています。
追加された 著者 Asmyldof,

オープンドレインは、トライステートドライバの一種です。ここでは論理的な矛盾を避けるために必要です - 例えば、バスを持っているスレーブ。

2
追加された
オープンドレインには2つの状態があります。
追加された 著者 Julian,

スリーステートドライバを使用して複数のデバイスが共通バス上で通信するプロトコルでは、バスの競合を防ぐために外部制御線を追加するか、バスの競合が発生した場合に損傷を防ぐために電流制限ドライバを追加する必要があります。バスの競合の場合に許容できる障害電流のレベルは、ラインが低いときに許容できる電流のレベルより高い場合がありますが、双方向の電流制限ドライバは、オープンコレクタドライバとパッシブプルアップを組み合わせたものよりも複雑です。 。

現在の限られたドライバの追加費用を受け入れたいと思っているなら、それはI2Cより速くてより頑強なプロトコルの設計を可能にするでしょう。一方、アクティブハイのドライバをI2Cマスタに追加すると、I2Cを使用しても同様の利点が得られる可能性があります。このような利点を安全に達成するには、マスターとスレーブ間のSDAラインに直列抵抗を追加する必要がありますが、マスターと各スレーブ間に個別の抵抗を使用すると、マスターがSDAラインをハイに駆動できますアクティブにローに駆動していないスレーブは、そうでなければバスを永久的にロックアップさせる可能性があるシナリオからマスタが回復することを可能にします(SCLの9サイクルを超えてSCLを連続的にローに保持することはできません)マスターは9サイクル以内に任意のデバイスに対して停止条件を生成することができますが、2つのデバイスがお互いから見てSCLラインを押さえることができれば、それらはSCLを引き下げるように順番にSCLを引き下げる状態になる可能性があります。絶対に解放されることはなく、マスターは停止条件を生成できません。

0
追加された

この質問に対する本当の答えは、ほとんどの同様の質問と同様に、これがそれが設計された方法だからです。クロックストレッチング、バス調停は確かに有効ですが、その解決策は設計目的には適しています。これは、短距離(多くの場合はオンボード)低速通信です。

いくつかの複雑さをスピードと距離でトレードオフする、より新しい、より速いプロトコルがたくさんあります。あなたがこれを必要とするならば、これらのプロトコルの1つを使ってください。

I²Cは比較的近代的な(〜1982)プロトコルですが、Tri-StateまたはTTL(〜1963)以前は初期のICはRTLとオープンコレクタを使用していましたが、初期のコンピュータの標準的なバス設計でした。 (そして私はデザイナーに本当の挑戦を加えるかもしれません。)

0
追加された