I2Cバスの設計は次のようなものです-
- SCLで立ち下がりエッジが発生すると、スレーブデバイスが特定の最小遅延なしにSDAを直ちにアサートする可能性があります。
- 立ち上がりエッジと立ち下がりエッジの相対的な順序は非常に重要です。
ドライバーの強度とラインキャパシタンスの違いにより、1つのデバイスがSCLのやや遅い立ち下がりエッジにSDAを非常に速く駆動して別のデバイスが最初にSDAが立ち下がるのを認識することで応答する可能性があります。
SCLで複数のロジックしきい値を定義し、SCLの立ち下がりエッジがSDAのエッジの後に来ると見なされるように指定するには、SDAのエッジが検出されたときに2/3 VDDを上回っている必要があります。ただし、デバイスは、SCLの立ち下がりエッジに応答して、SDAが1/3 VDDを下回るまでSDAをアサートしない場合がありますが、仕様はそのような用語で記述されていません。
代わりに、SDAとSCLでほぼ同時に立ち下がりエッジを検出するデバイスは、SDAのエッジが実質的に先行しない限り、通常、SCLのエッジが最初に発生したと見なします。一部のI2C実装は、SCLとSDAを外部クロックに同期し、SDAの立ち下がりエッジをSCLの立ち下がりエッジの2周期前に観測して、最初に来たと見なされるようにすることでこれを処理します。SCLとSDAの動作速度が同期クロックに比べて速すぎる場合、デバイスはSCLとSDAの任意の高信号と低信号のシーケンスを認識する可能性があります。これらのシーケンスの1つが遅いデバイスをアドレスしているように見える場合、それに応じて反応し、進行中の他の通信を押しつぶす可能性があります。
I2Cバス上のデバイスがシステムクロックへの同期に依存しなければならない特別な理由はありません(SCLで2つの個別のしきい値を検出できる方が良いでしょう)が、一部のデバイスは実際にそのように動作するというのが事実です。内部で低速に制限されていたデバイスが高速バスと共存したい場合でも、関心のあることが起こっているときは常に、少なくともクロックストレッチを使用する必要があることに注意してください。
これにより、一部の通信が他の場合よりも遅くなる可能性がありますが、速度の低下は、クロック同期設計で必要とされるほど悪くはありません(遅いデバイスがクロックをストレッチする実際の量では、おそらく同期されたクロックユニットで最悪のシナリオの障害を回避するためにクロックを遅くする必要がある量ほど悪い。