I 2 C ( Inter-Integrated Circuit、発音は「アイスクエアシー」または「アイツーシー」)、別名I2CおよびIICは、1980年にフィリップスセミコンダクターズ(現NXPセミコンダクターズ)によって発明された、同期式、マルチマスター/マルチスレーブ、シングルエンドのシリアル通信バスです。[ 1 ]短距離のボード内通信で、低速の周辺集積回路(IC)をプロセッサやマイクロコントローラに接続するために広く使用されています。
I 2 C バスは、速度よりもシンプルさと製造コストの低さが重視される幅広い電子機器アプリケーションで使用されています。I 2 Cを使用するPCコンポーネントやシステムには、デュアル インライン メモリ モジュール(DIMM)上のシリアルプレゼンス検出(SPD) EEPROMや、 VGA、DVI、HDMIコネクタを介したモニター用の拡張ディスプレイ識別データ(EDID) などがあります。一般的な I 2 C アプリケーションには、ハードウェア モニター、センサー、リアルタイム クロックの読み取り、アクチュエータの制御、低速DACおよびADC へのアクセス、シンプルなLCDまたはOLEDディスプレイの制御、ディスプレイ データ チャネルを介したコンピュータ ディスプレイ設定 (バックライト、コントラスト、色相、カラー バランスなど) の変更、スピーカーの音量の変更などがあります。
I²Cの特長の一つは、マイクロコントローラが汎用I/Oピン2本だけでデバイスチップのネットワークを制御できる点です。同様の用途で使用される他の多くのバス技術、例えばシリアルペリフェラルインターフェースバス(SPI)などは、複数のデバイスを接続するためにより多くのピンと信号を必要とします。
システム管理バス(SMBus)は、1994年にインテルとデュラセルによって定義されたI2Cのサブセットであり、より厳格な使用方法を規定しています。SMBusの目的の一つは、堅牢性と相互運用性を向上させることです。そのため、最新のI2CシステムはSMBusのポリシーやルールの一部を取り入れており、 I2CとSMBusの両方をサポートし、コマンドや出力ピンの使用による最小限の再構成のみで済む場合もあります。PCシステムのシステム管理にはSMBusが使用され、そのピンは従来のPCIコネクタとPCI Expressコネクタの両方に割り当てられています。

欧州特許EP0051332B1 Adでは、PMM MoelandsとHerman SchutteがI2Cバスの発明者として記載されています。両名は1980年にアイントホーフェンのフィリップス中央アプリケーション研究所CABで開発エンジニアとして勤務しており、そこでI2Cバスは「複数のステーションを相互接続するためのクロック線とデータ線からなる2線式バスシステム」として開発されました。米国特許はUS 4689740A で付与されました。バスの社内開発名は当初COMICでしたが、後にI2Cに変更されました。この特許はKoninklijke Philips NVに譲渡されました。
I 2 C の特許および仕様では、 1980 年~ 2021 年の間、マスター/スレーブという用語が使用されていました。[ 1 ] [ 3 ] 2021 年に、I 2 C 仕様のリビジョン 7 で、用語がコントローラ/ターゲットに変更されました。 [ 3 ] [ 4 ]これらのデバイスの技術的な定義と、I 2 C バス上での役割は変更されていません。[ 4 ]

I 2 C はシリアルデータライン (SDA) とシリアルクロックライン (SCL) の2 つの信号のみを使用します。どちらも双方向で、抵抗でプルアップされています。[ 3 ]一般的に使用される電圧は+5 V または +3.3 V ですが、他の電圧のシステムも許可されています。
I 2 Cリファレンスデザインは7 ビットのアドレス空間を持ち、まれに 10 ビットの拡張があります。一部のベンダーは、最初のアドレス バイトの最下位ビットが書き込みコマンドと読み出しコマンドを区別するために使用されるため、代わりに 8 ビットおよび 11 ビットのアドレスを報告しています。[ 5 ]
一般的なI2Cバス速度は100 kbit/s の 標準モードと400 kbit/s の高速モードがあります。10 kbit/s の低速モードもありますが、任意の低いクロック周波数も使用可能です。I 2 Cの後継バージョンでは、より多くのノードをホストでき、より高速な速度 ( 400 kbit/s高速モード、1 Mbit/s高速モード プラス、3.4 Mbit/s高速モード、5 Mbit/s超高速モード) で動作できます。これらの速度は、PC よりも組み込みシステムで広く使用されています。
ビットレートは、クロックストレッチやその他のハードウェアオーバーヘッドを除いた、コントローラ(マスター)とターゲット(スレーブ)間の転送速度を示していることに注意してください。プロトコルオーバーヘッドには、ターゲットアドレス、場合によってはターゲットデバイス内のレジスタアドレス、およびバイトごとのACK/NACKビットが含まれます。したがって、実際のユーザデータの転送速度は、これらのピークビットレートだけから推測されるよりも低くなります。たとえば、ターゲットとの各やり取りで1 バイトのデータしか転送できない場合、データ転送速度はピークビットレートの半分以下になります。
特定のI²Cバス上に存在できるノードの数は、アドレス空間とバス全体の容量(400pF )によって制限されるため、実用的な通信距離は数メートルに制限されます。また、比較的高いインピーダンスと低いノイズ耐性のため、共通の接地電位が必要となり、これもまた、同一のプリント基板内、あるいは小規模な基板システム内での通信に実用的な用途を限定することになります。
前述のリファレンスデザインは、クロック(SCL)線とデータ(SDA)線を備え、7ビットのアドレス指定が可能なバスです。このバスでは、ノードはコントローラ(マスター)またはターゲット(スレーブ)の2つの役割を担います。
このバスはマルチコントローラバスであり、任意の数のコントローラノードが存在することが可能です。さらに、コントローラとターゲットの役割は、メッセージ間(STOPメッセージが送信された後)で変更される場合があります。
特定のバスデバイスには4つの動作モードが存在する可能性があるが、ほとんどのデバイスは単一の役割とその2つのモードのみを使用する。
I2Cバスは、0と1のデータビットに加えて、メッセージ区切り文字として機能し、データビットとは区別される特別なSTART信号とSTOP信号を備えています。(これは、非同期シリアル通信で使用されるスタートビットとストップビットとは対照的です。非同期シリアル通信で使用されるスタートビットとストップビットは、タイミングによってのみデータビットと区別されます。)
コントローラは、最初にSTART信号を送信し、続いて通信したいターゲットの7ビットのアドレスを送信することでコントローラ送信モードに入ります。最後に、ターゲットに書き込む(0)か、ターゲットから読み取る(1)かを表す1ビットの信号が続きます。
バス上にターゲットが存在する場合、ターゲットはそのアドレスに対してACKビット(確認応答を示すアクティブロー)で応答します。コントローラは送信モードまたは受信モード(送信した読み書きビットに応じて)で処理を続行し、ターゲットはそれに対応するモード(受信モードまたは送信モード)で処理を続行します。
アドレスとデータバイトは、最上位ビットから順に送信されます。スタート条件は、SCLがハイの状態でSDAがハイからローに遷移することで示され、ストップ条件は、SCLがハイの状態でSDAがローからハイに遷移することで示されます。その他のSDAの遷移はすべて、SCLがローの状態で行われます。
コントローラがターゲットに書き込みを行う場合、コントローラは1バイトの信号を繰り返し送信し、ターゲットはACKビットを送信します。(この場合、コントローラはコントローラ送信モード、ターゲットはターゲット受信モードとなります。)
コントローラがターゲットから読み取りを行う場合、コントローラはターゲットから1バイトずつ繰り返し受信し、最後のバイトを除く各バイトの後にACKビットを送信します。(この場合、コントローラはコントローラ受信モード、ターゲットはターゲット送信モードとなります。)
I2Cトランザクションは複数のメッセージで構成される場合があります。コントローラは、トランザクションの終了時にSTOP条件でメッセージを終了させるか、別のメッセージのためにバスの制御を維持するために別のSTART条件を送信する場合があります(複合フォーマットトランザクション)。
I 2 C は、それぞれ START で始まり STOP で終わる基本的なトランザクションの種類を定義しています。
複合トランザクションでは、各読み取りまたは書き込みはSTARTとターゲットアドレスで始まります。最初のSTART条件に続くSTART条件は、繰り返しSTARTビットとも呼ばれます。繰り返しSTARTの前にはSTOP条件は付きません。ターゲット側は、このSTOP条件によって次のメッセージが同じトランザクションの一部であることを認識します。
対象機器は、製品ドキュメントに記載されている特定のメッセージにのみ応答します。
純粋なI2Cシステムは、任意のメッセージ構造をサポートします。SMBusは、単一のターゲットに関わる「ワードNの読み取り」や「ワードNの書き込み」など、9種類の構造に制限されています。PMBusは、グループプロトコルによってSMBusを拡張し、複数のSMBusトランザクションを1つの結合メッセージで送信できるようにします。終了時のSTOPは、グループ化されたアクションがいつ有効になるかを示します。たとえば、1つのPMBus操作で3つの電源装置(3つの異なるI2Cターゲットアドレスを使用)を再構成する場合、それらの新しい構成は、STOPを受信した時点で同時に有効になります。
ごく一部の例外を除き、I 2 C も SMBus も、メッセージ内のデータバイトの意味など、メッセージのセマンティクスを定義していません。メッセージのセマンティクスは、それ以外は製品固有のものです。例外としては、I 2 Cの汎用呼び出しアドレス (0x00) または SMBusアラート応答アドレス宛てのメッセージ、および動的アドレス割り当てと管理のための SMBusアドレス解決プロトコル(ARP) に関わるメッセージなどが挙げられます。
実際には、ほとんどのターゲットは要求応答制御モデルを採用しており、書き込みコマンドに続く1バイト以上のバイトがコマンドまたはアドレスとして扱われます。これらのバイトによって、後続の書き込みバイトの処理方法や、後続の読み取りに対するターゲットの応答方法が決まります。ほとんどのSMBus操作は、1バイトのコマンドで行われます。

具体的な例として、アドレスハイとアドレスローと呼ばれる2バイトの要求バイトを使用する24C32タイプのEEPROMが挙げられます。(したがって、これらのEEPROMは、シングルバイトのコマンドまたはアドレスのみをサポートする純粋なSMBusホストでは使用できません。)これらのバイトは、32kビット(または4kB)のEEPROMアドレス空間内のバイトをアドレス指定するために使用されます。同じ2バイトのアドレス指定は、512kビット(または64kB)を格納する24C512のようなより大きなEEPROMでも使用されます。これらのEEPROMへのデータの書き込みと読み出しには、単純なプロトコルが使用されます。アドレスが書き込まれ、メッセージの終わりまでデータが転送されます。データバイトの前にカウントがなく、一度に32バイトを超えるデータが転送される可能性があるため、プロトコルのデータ転送部分はSMBusで問題を引き起こす可能性があります。2 kbitの24C02のような32 kbitより小さいI 2 C EEPROMは、この問題を克服するために、非効率的なシングルバイトデータ転送を使用してSMBus上でよく使用されます。
EEPROMには単一のメッセージが書き込まれます。STARTの後、コントローラは方向ビットをクリアしたチップのバスアドレス(書き込み)を送信し、次にEEPROM内のデータの2バイトのアドレスを送信し、そのアドレスから書き込むデータバイトを送信した後、STOPを送信します。複数のバイトを書き込む場合、すべてのバイトは同じ32バイトのページ内に収まっている必要があります。EEPROMはこれらのバイトをメモリに保存している間、それ以降のI2C要求には応答しません。(これはSMBusとのもう一つの非互換性です。SMBusデバイスは常にバスアドレスに応答する必要があります。)
EEPROM内の特定のアドレスから読み出すには、複合メッセージを使用します。STARTの後、コントローラはまず方向ビットをクリアした状態でそのチップのバスアドレスを書き込み(書き込み)、次にEEPROMデータアドレスの2バイトを書き込みます。その後、(繰り返し)STARTと方向ビットをセットした状態でEEPROMのバスアドレスを送信します(読み出し)。EEPROMは、指定されたEEPROMデータアドレスから始まるデータバイトで応答します。これは、書き込みと読み出しを組み合わせた複合メッセージです。コントローラは、最後のバイトを除く各読み出しバイトの後にACKを発行し、その後STOPを発行します。EEPROMは、転送された各データバイトの後にアドレスをインクリメントします。マルチバイト読み出しでは、1つの複合メッセージを使用してEEPROMの内容全体を取得できます。

物理層では、SCL 線と SDA 線はどちらもオープンドレイン( MOSFET ) またはオープンコレクタ( BJT ) バス設計であるため、各線にプルアップ抵抗が必要です。論理 0 は、線をグランドにプルダウンすることで出力され、論理 1 は、線をフローティング (出力高インピーダンス) にしてプルアップ抵抗でハイにプルアップすることで出力されます。線がアクティブにハイに駆動されることはありません。この配線により、信号競合による短絡を起こすことなく、複数のノードをバスに接続できます。高速システム (およびその他のシステム) では、バス容量を大きくして立ち上がり時間を短縮するために、抵抗の代わりに電流源を使用して SCL のみ、または SCL と SDA の両方をプルアップする場合があります。
このことの重要な結果として、複数のノードが同時に回線を駆動する可能性がある。いずれかのノードが回線をローに駆動している場合、そのノードはローになる。論理値1を送信しようとしているノード(つまり、回線をハイにフローティングさせているノード)はこれを検知し、同時に別のノードがアクティブになっていると判断する可能性がある。
SCLで使用される場合、これはクロックストレッチングと呼ばれ、ターゲットに対するフロー制御メカニズムです。SDAで使用される場合、これはアービトレーションと呼ばれ、一度に1つの送信機のみが存在することを保証します。
アイドル状態では、両方のラインがハイです。トランザクションを開始するには、SDAをローにプルダウンし、SCLはハイのままにします。SDAを解放して再びハイにフローティングさせることでストップマーカーを送信することは違法です[ 3 ] : 14 (ただし、このような無効なメッセージは通常無害です)。そのため、次のステップはSCLをローにプルダウンすることです。
スタート信号とストップ信号を除き、SDAラインはクロックがローレベルの間だけ変化します。データビットを送信するには、クロックラインをハイレベルにパルス出力し、データラインを所望のレベルに維持する必要があります。
SCLがローレベルの間、送信機(最初はコントローラ)はSDAを目的の値に設定し、(値が伝搬するまでのわずかな遅延の後)SCLをハイレベルにフローティングさせます。その後、コントローラはSCLが実際にハイレベルになるまで待ちます。この待ち時間は、SCL信号の有限な立ち上がり時間(プルアップ抵抗のRC時定数とバスの寄生容量)によって遅延し、さらにターゲットのクロックストレッチによって遅延する可能性もあります。
SCLがハイレベルになると、コントローラは受信側がビットを認識したことを確認するために最小時間( 標準速度のI2Cでは4μs )待機し、その後SCLをローレベルに戻します。これで1ビットの送信が完了します。
片方向で8ビットのデータを送信するごとに、反対方向に確認応答ビットが送信されます。送信側と受信側は1ビットの間役割を交代し、元の受信側は1ビットの0(ACK)を返信します。送信側が代わりに1ビット(NACK)を受信した場合、次のことが分かります。
確認応答ビットの実行中のみSDAラインの方向が変わり、SCLは常にコントローラによって制御されます。
承認ビットの後、クロックラインはローレベルになり、コントローラは次の3つのうちいずれかを実行する可能性があります。
I2Cプロトコルの重要な機能の一つにクロックストレッチングがあります。アドレス指定されたターゲットデバイスは、1バイトを受信(または送信)した後、クロックライン(SCL)をローレベルに保持することがあります。これは、まだ次のデータを処理する準備ができていないことを示します。ターゲットと通信しているコントローラは、現在のビットの送信を完了せず、クロックラインが実際にハイレベルになるまで待機する必要があります。ターゲットがクロックストレッチングを行っている場合、接続がオープンドレインであるため、クロックラインはローレベルのままになります。2つ目の低速コントローラが同時にクロックを駆動しようとした場合も同様です。(コントローラが複数ある場合、通常は1つを除くすべてのコントローラがアービトレーションで敗北します。)
コントローラは、クロックラインがハイになることを観測するまで待機し、さらに最小限の時間(標準の100 kbit/s I 2 Cの場合は4 μs )待ってから、クロックを再びローにする必要があります。
コントローラはSCLラインを必要なだけローに保持することもできますが(これは プロトコルのRev.6以降では許可されていません – サブセクション3.1.1)、クロックストレッチという用語は通常、ターゲットがそれを行う場合にのみ使用されます。理論的にはどのクロックパルスでもストレッチできますが、一般的には確認応答ビットの前後の間隔が使用されます。たとえば、ターゲットがマイクロコントローラの場合、そのI2Cインターフェースは、ソフトウェアが肯定応答を送信するかNACKを送信するかを決定するまで、各バイトの後にクロックをストレッチできます。
クロックストレッチは、I 2 C においてターゲットが SCL を駆動する唯一の場面です。多くのターゲットはクロックストレッチを必要としないため、SCL を駆動回路を持たない単なる入力として扱います。カスタムASIC内部にあるような一部のコントローラはクロックストレッチをサポートしていない場合があり、そのようなデバイスは I 2 Cではなく2 線インターフェースとしてラベル付けされることがよくあります。
バスのスループットを最大化するために、SMBusはクロックの引き延ばしに制限を設けています。これらの制限に従うホストとターゲットは、バスへのアクセスを短時間以上ブロックすることはできません。これは、純粋なI2Cシステムでは保証されない点です。
各コントローラはバスのスタートビットとストップビットを監視し、他のコントローラがバスをビジー状態にしている間はメッセージを開始しません。ただし、2 つのコントローラがほぼ同時に送信を開始する場合があります。この場合、アービトレーションが発生します。コントローラが複数のターゲットにアドレス指定する場合、ターゲット送信モードもアービトレーションされる可能性がありますが、これはあまり一般的ではありません。再送を発行する前にランダムなバックオフ遅延を使用するプロトコル (イーサネットなど) とは対照的に、I 2 C は決定論的なアービトレーション ポリシーを採用しています。各送信機はデータ ライン (SDA) のレベルをチェックし、期待するレベルと比較します。一致しない場合、その送信機はアービトレーションに敗れ、このプロトコルのやり取りから脱落します。
一方の送信機がSDAを1(信号を駆動しない)に設定し、もう一方の送信機がSDAを0(接地)に設定すると、結果としてラインはローになります。最初の送信機は、ラインのレベルが予想と異なることを観測し、別のノードが送信していると結論付けます。このような違いに最初に気づいたノードがアービトレーションに敗れ、SDAの駆動を停止します。コントローラの場合は、SCLの駆動も停止し、STOPを待ちます。その後、メッセージ全体を再送信しようとする場合があります。その間、もう一方のノードはSDAの予想レベルと実際のレベルに違いに気付かないため、送信を継続します。これまでの信号はまさに予想どおりであり、他の送信機がメッセージを妨害していないため、問題なく送信を継続できます。
2つのコントローラが異なる宛先にメッセージを送信する場合、アドレス段階では、宛先アドレスの小さい方のコントローラが常に仲裁に勝ちます。しかし、2つのコントローラが同じ宛先アドレスにメッセージを送信する可能性があり、またアドレスが複数の宛先を指す場合もあるため、仲裁はデータ段階まで継続する必要がある場合があります。
アービトレーションは非常にまれにしか発生しませんが、マルチコントローラを適切にサポートするためには不可欠です。クロックストレッチングと同様に、すべてのデバイスがアービトレーションをサポートしているわけではありません。サポートしているデバイスは、一般的にマルチコントローラ通信をサポートしていると明記しています。
マルチコントローラI2C実装において、コントローラ同士の通信を慎重に処理する必要があるケースの一つは、コントローラが受信メッセージに対してアービトレーションに敗れた場合です。その場合、コントローラは自身のアドレスを応答するために、時間内にコントローラからターゲットへと役割を切り替える必要があります。
極めてまれなケースとして、2つのコントローラが同時に同一のメッセージを送信した場合、両方のコントローラは通信が成功したとみなしますが、ターゲット側では1つのメッセージしか認識されません。このため、ターゲットが複数のコントローラからアクセス可能な場合、ターゲットが認識するすべてのコマンドは冪等性を持つか、または2つのコントローラから同時に発行されないことが保証されている必要があります。(例えば、1つのコントローラからのみ発行されるコマンドは冪等性を持つ必要はなく、また、相互排他メカニズムによって特定のコマンドを一度に1つのコントローラのみが発行することが保証されている場合は、そのコマンドが冪等性を持つ必要もありません。)
I2Cはコントローラ間でのみ調停を行うのに対し、 SMBusは複数のターゲットがコントローラに応答し、そのうちの1つがメッセージを通過させるという、さらに3つの状況で調停を使用します。
PMBusバージョン 1.3 では、ゾーン読み取りプロトコルで SMBus アラート応答プロトコルが拡張されています。[ 7 ]ターゲットはゾーンにグループ化でき、ゾーン内のすべてのターゲットに応答するようにアドレス指定できます。応答はマスク(不要な情報を省略)、反転(必要な情報が 0 ビットとして送信され、アービトレーションで勝敗が決まる)、または並べ替え(最も重要な情報が最初に送信される)されます。アービトレーションにより、最も優先度の高い応答がコントローラに最初に返されることが保証されます。
PMBusは、ゾーンの読み取りと書き込み用に、それぞれI2Cアドレス0x28と0x37を予約しています。
I2C通信にはいくつかの動作モードがあります。いずれも互換性があり、100kbit/sの標準モードは常に使用できますが、異なる機能を持つデバイスを同じバス上で組み合わせると、次のような問題が発生する可能性があります。
一部のベンダーは、最大1.4 Mbit/sの速度を実現する、いわゆる非標準のターボモードを提供しています。
すべてのモードで、クロック周波数はコントローラによって制御され、通常よりも長いバスはアンダークロックによって公称速度よりも遅い速度で動作させることができます。

I 2 C は、 ArduinoやRaspberry Piなどのプロトタイプシステムに周辺回路を接続するためによく使われています。I 2 C には標準化されたコネクタはありませんが、ボード設計者は I 2 C 相互接続用のさまざまな配線方式を作成しています。0.1 インチ ヘッダーを逆向きに差し込むことによる損傷を最小限に抑えるため、一部の開発者は、次の配線方式の信号と電源の接続を交互に使用することを提案しています。(GND、SCL、VCC、SDA) または (VCC、SDA、GND、SCL)。[ 8 ]
ほとんどのアプリケーションは、I 2 C を本来の設計どおりに使用しています。つまり、周辺 IC を同じプリント基板上のプロセッサに直接配線し、コネクタなしで1 フィート (30 cm)未満の比較的短い距離で通信します。しかし、差動ドライバを使用すると、I 2 C の別のバージョンはCAT5またはその他のケーブルを介して最大 20 メートル (場合によっては 100 メートル以上) まで通信できます。[ 9 ] [ 10 ]
Several standard connectors carry I2C signals. For example, the UEXT, the 10-pin iPack,[11] and the 6P6CLego Mindstorms NXT connectors carry I2C.[12][13][14][15] Every HDMI and most DVI and VGA connectors carry DDC2 data over I2C. Additionally, 8P8C connectors and a CAT5 cable normally used for the Ethernet physical layer can sometimes be used to carry differential-encoded[16] or boosted single-ended I2C signals.[17]
When there are many I2C devices in a system, there can be a need to include bus buffers or multiplexers to split large bus segments into smaller ones. This can be necessary to keep the capacitance of a bus segment below the allowable value or to allow multiple devices with the same address to be separated by a multiplexer. Many types of multiplexers and buffers exist and all must take into account the fact that I2C lines are specified to be bidirectional. Multiplexers can be implemented with analog switches, which can tie one segment to another. Analog switches maintain the bidirectional nature of the lines but do not isolate the capacitance of one segment from another or provide buffering capability.
Buffers can be used to isolate capacitance on one segment from another and/or allow I2C to be sent over longer cables or traces. Buffers for bi-directional lines such as I2C must use one of several schemes for preventing latch-up. I2C is open-drain, so buffers must drive a low on one side when they see a low on the other. One method for preventing latch-up is for a buffer to have carefully selected input and output levels such that the output level of its driver is higher than its input threshold, preventing it from triggering itself. For example, a buffer may have an input threshold of 0.4 V for detecting a low, but an output low level of 0.5 V. This method requires that all other devices on the bus have thresholds which are compatible and often means that multiple buffers implementing this scheme cannot be put in series with one another.
あるいは、電流増幅器を実装したり、状態(つまり、どちらの側がバスをローに駆動したか)を追跡してラッチアップを防ぐ他のタイプのバッファも存在する。状態方式では、通常、片方の側がバスをローに駆動し、次に他方の側がローに駆動し、その後最初の側が解放されるというハンドオフ中に意図しないパルスが発生する(これはI2Cの応答でよく見られる)。
コントローラが1つしかない場合、複数のI2Cバスが同じSCLラインを共有することが可能です。 [ 18 ] [ 19 ]各バス上のパケットは、1つずつ順番に送信されるか、同時に送信されます。これは、各バス上の通信を、高SCLの短い期間と低SCLの短い期間を交互に繰り返すように分割できるためです。また、1つのバスが1つの状態をより長く維持する必要がある場合は、クロックを延長することができます。
利点としては、同じアドレスを持つターゲットデバイスを同時に使用できること、複数のデータラインを同時に使用することで接続数を節約したり、スループットを向上させたりできることが挙げられます。
これらの表は、 I2Cメッセージ中に発生する可能性のあるさまざまな原子状態とビット操作を示しています。
8つのアドレスからなる2つのグループが、特別な行事のために予約されています。
0000 000宛先:0000 1111111 000宛先:1111 111さらに、残りの112個のアドレスは特定の種類のデバイスに割り当てられており、その一部は関連規格や一般的な使用法によってさらに予約されている。
SMBusはいくつかの追加アドレスを予約しています。具体的には、0001 000はSMBusホスト用に予約されており、コントローラ対応デバイスが使用できます。0001 100は、帯域外割り込み後にホストによってポーリングされるSMBusアラート応答アドレスであり、 は、1100 001動的アドレス割り当てが可能なデバイスが最初に使用するデフォルトアドレスです。
MSBは1111デバイスIDと10ビットターゲット(スレーブ)アドレス指定用に予約されていますが、ポインティングデバイスなどのVESA DDCディスプレイ依存デバイスでも使用されています。[ 23 ]
I2Cトランザクションは、 1つ以上のメッセージで構成されます。各メッセージは開始シンボルで始まり、トランザクションは停止シンボルで終わります。最初の開始シンボル以降に続く、メッセージを開始するがトランザクションを開始しない開始シンボルは、繰り返し開始シンボルと呼ばれます。
各メッセージは読み取りまたは書き込みのいずれかです。単一のメッセージで構成されるトランザクションは、読み取りトランザクションまたは書き込みトランザクションと呼ばれます。複数のメッセージで構成されるトランザクションは、複合トランザクションと呼ばれます。複合トランザクションの最も一般的な形式は、デバイス内アドレス情報を提供する書き込みメッセージに続いて読み取りメッセージが送信される形式です。
多くのI²Cデバイスは、結合されたトランザクションと、同じメッセージを個別のトランザクションとして送信した場合を区別しませんが、すべてがそうではありません。デバイスIDプロトコルでは単一のトランザクションが必須であり、ターゲットは停止シンボルを検出すると応答を禁じられます。ターゲットが異常な応答を示すような構成、キャリブレーション、または自己テストモードも、トランザクションの終了時に自動的に終了されることがよくあります。

誤ったマーカー検出を避けるため、SCLの立ち下がりエッジとSDAの変化の間、およびSDAの変化とSCLの立ち上がりエッジの間には、最小遅延時間が設けられています。この最小遅延時間は、使用するデータ転送速度によって異なります。なお、nビットのデータ(確認応答を含む)を含むI2Cメッセージは、n +1個のクロックパルスから構成されます。
I²Cはバスドライバソフトウェアの設計に適しています。接続されたデバイス用のソフトウェアは、実際の低レベルI²Cハードウェアを処理するバスドライバを呼び出すように記述されます。これにより、接続されたデバイス用のドライバコードを、ビットバンギング設計を含む他のハードウェアに容易に移植できます。
GENERICGENERIC。I2Cを使用したシステムの開発やトラブルシューティングを行う際には、ハードウェア信号レベルでの可視性が重要となる場合があります。
Linux、Mac 、 WindowsなどのホストコンピュータにI2Cコントローラまたはターゲットを接続するためのI2Cホストアダプタハードウェアソリューションは数多く存在します。ほとんどのオプションはUSB -I2Cアダプタです。これらのすべてが独自のドライバやAPIを必要とするわけではありません。
I2Cプロトコルアナライザは、I2Cバスをサンプリングし、電気信号をデコードすることで、バス上で伝送されているデータのより高レベルなビューを提供するツールです。
I2Cバスの開発やトラブルシューティングを行う際、ハードウェア信号の解析は非常に重要です。ロジックアナライザは、信号の収集、解析、デコード、保存を行うツールであり、高速波形をじっくりと確認できます。ロジックアナライザは、各信号レベルの変化のタイムスタンプを表示するため、プロトコルの問題を特定するのに役立ちます。ほとんどのロジックアナライザは、バス信号を高レベルのプロトコルデータにデコードし、ASCIIデータを表示する機能を備えています。
さまざまな市販モジュールには、いくつかの主要なコネクタとピン配置があります: [ 30 ]
ターゲット アドレスの割り当ては I 2 C の弱点です。 7 ビットでは、数千もの利用可能なデバイス間でアドレスの衝突を防ぐには少なすぎます。 異なるベンダー間でのアドレス衝突の問題を軽減し、複数の同一デバイスへの接続を可能にするのは、メーカーがデバイスごとにターゲット アドレスをいくつかのアドレス オプションのいずれかに設定するために使用できるピンを専用に用意することです。 2 つまたは 3 つのピンが一般的で、多くのデバイスでは、アドレス ピンごとに 3 つ以上の配線オプションがあります。[ 36 ] [ 37 ] [ 38 ]
10ビットのI2Cアドレスはまだ広く使用されておらず、多くのホストオペレーティングシステムではサポートされていません。[ 39 ]また、アドレスを動的に割り当てるための複雑なSMBus ARPスキームも、(SMBusが存在するPCIカードを除いて、必須ではありません)。
自動バス構成は関連する問題です。特定のアドレスは、さまざまなシステムでプロトコルが互換性のない複数のデバイスによって使用される可能性があり、実行時にデバイスの種類を検出できるものはほとんどありません。たとえば、アドレスが互換性のないアドレス指定を持つ0x5124LC02 または 24C32 EEPROMによって使用される場合や、PCF8563 RTCによって使用される場合があり、PCF8563 RTC は (デバイスの状態を変更しない限り、どちらとも確実に区別できません。デバイスの状態変更は許可されない可能性があります)。ホストが利用できる唯一の信頼できる構成メカニズムは、システムファームウェアによって提供されるテーブルなど、利用可能なデバイスを一覧表示する帯域外メカニズムです。この問題は、特にベンダーおよび製品識別子が使用される場合、SMBus システムの ARP によって部分的に解決できますが、あまり普及していません。I 2 C 仕様の Rev. 3 バージョンでは、デバイス ID メカニズムが追加されています。
I²Cは限られた速度範囲しかサポートしていません。マルチメガビット速度をサポートするホストは稀です。Fm+ 1 Mbit/s速度のサポートはより広く普及しています。これは、その電子回路が低速で使用されるものの単純なバリエーションであるためです。多くのデバイスは400 kbit/s速度をサポートしていません (SMBus がまだそれをサポートしていないことが一因です)。専用ハードウェアではなくソフトウェアで実装された I²C ノードは、100 kbit/s 速度さえサポートしていない可能性があります。そのため、仕様で定義されている全範囲が実際に使用できることはほとんどありません。すべてのデバイスは、使用される最高速度を少なくとも部分的にサポートする必要があります。そうでない場合、デバイス アドレスを誤って検出する可能性があります。
デバイスは、それぞれのニーズに合わせてクロックサイクルを延長することができますが、これにより高速デバイスに必要な帯域幅が不足したり、他のデバイスアドレスとの通信時の遅延が増加したりする可能性があります。また、バス容量も転送速度を制限する要因となります。特に、電流源を使用して信号の立ち上がり時間を短縮しない場合は、その影響が顕著になります。
I 2 C は共有バスであるため、いずれかのデバイスに障害が発生してバス全体がハングアップする可能性があります。たとえば、いずれかのデバイスが SDA または SCL ラインをローに保持すると、コントローラが START または STOP コマンドを送信してバスをリセットできなくなります。[ 40 ]そのため、バス デバイスをリセットするための外部方法を提供するリセット信号を含む設計が一般的です。ただし、多くのデバイスには専用のリセット ピンがないため、設計者はデバイスをリセットする必要がある場合に電源を再投入できるようにする回路を組み込む必要があります。
これらの制限(アドレス管理、バス構成、潜在的な障害、速度)のため、I²Cバスセグメントに12個以上のデバイスが接続されているものはほとんどありません。その代わりに、システムでは複数の小さなセグメントを使用するのが一般的です。1つは低遅延の電力管理のために高速デバイス専用に使用され、もう1つは遅延やスループットが重要ではない少数のデバイスを制御するために使用され、さらに別のセグメントはアドオンカード( DRAMスティックで使用されるSPD規格など)を記述するEEPROMチップを読み取るためだけに使用されます。
超低消費電力システムでは、プルアップ抵抗器が、設計全体の他の部分の合計消費電力よりも多くの電力を消費することがあります。このようなシステムでは、抵抗器はマイクロコントローラのDIOなどの切り替え可能な電圧源から給電されることがよくあります。プルアップ抵抗器はバスの速度を制限するだけでなく、わずかな追加コストも伴います。そのため、一部の設計者は、I3CやSPIなど、プルアップ抵抗器を必要としない他のシリアルバスに目を向けています。
I 2 C は、 ACCESS.bus、VESAディスプレイデータチャネル(DDC) インターフェイス、システム管理バス(SMBus)、電源管理バス(PMBus)、およびインテリジェントプラットフォーム管理バス (IPMB、 IPMIのプロトコルの 1 つ)の基盤となっています。これらのバリアントは、電圧とクロック周波数の範囲が異なり、割り込み線を持つ場合があります。
高可用性システム(AdvancedTCA、MicroTCA)は、棚管理に双方向冗長I2Cを使用します。これらのシステムでは、マルチコントローラI2C機能が必須です。
TWI (Two-Wire Interface) または TWSI (Two-Wire Serial Interface) は、基本的にAtmelや他のベンダーのさまざまなシステム オン チップ プロセッサに実装されているバスと同じです。 [ 41 ]ベンダーは、2014 年 11 月 7 日現在、I 2 C が登録商標ではないにもかかわらず、TWI という名前を使用しています。 [ 42 ]商標保護はそれぞれのロゴ (右上隅を参照) にのみ存在し、I 2 C の特許は現在失効しています。Microchip Technologyによると、TWI と I2C にはいくつかの違いがあります。その 1 つは、TWI が START バイトをサポートしていないことです。[ 43 ]
場合によっては、 「2線式インターフェース」という用語の使用は、I²C仕様の実装が不完全であることを示しています。アービトレーションやクロックストレッチングをサポートしていないことはよくある制限事項ですが、クロックストレッチングを行わない単純なターゲットと通信する単一のコントローラにとっては依然として有用です。
MIPI I3Cセンサーインターフェース規格(I3C)はI2Cの発展形であり、2017年に開発が進められた。[ 44 ]
のスレーブアドレスの7ビット部分は0010_000bです。
static u_int8_t probe_val[256];