| タイプ | シリアル通信バス | ||
|---|---|---|---|
| 生産履歴 | |||
| デザイナー | フィリップス・セミコンダクターズ(現NXPセミコンダクターズ) | ||
| 設計 | 1980年[ 1 ] (1980年) | ||
| データ | |||
| データ信号 | オープンコレクタまたはオープンドレイン | ||
| 幅 | 1ビット(SDA)と別クロック(SCL) | ||
| ビットレート | 0.1、0.4、1.0、3.4またはモードに応じて5.0 Mbit/s | ||
| プロトコル | シリアル、半二重 | ||
| ピン配置 | |||
| SDA | データピン | ||
| SCL | 時計ピン | ||
I 2 C(インターインテグレーテッドサーキット、「アイスクエアードシー」または「アイツーシー」と発音)は、I2CやIICとも呼ばれ、 1980年にフィリップスセミコンダクターズ(現NXPセミコンダクターズ)によって発明された同期、マルチマスター/マルチスレーブ、シングルエンド、シリアル通信バスです。[ 1 ]プロセッサやマイクロコントローラに低速周辺集積回路(IC)を短距離の基板内通信で接続するために広く使用されています。
欧州特許EP0051332B1 Adでは、PMM Moelands氏とHerman Schutte氏がI2Cバスの発明者として挙げられています。両氏は1980年、アイントホーフェンにあるPhilips社の中央アプリケーションラボCABで開発エンジニアとして勤務しており、そこでI2Cバスは「複数のステーションを相互接続するためのクロック線とデータ線からなる2線式バスシステム」として開発されました。米国特許はUS 4689740A として取得されました。このバスの社内開発名は当初COMICでしたが、後にI2Cに変更されました。特許は両氏によってKoninklijke Philips NVに譲渡されました。
I 2 Cバスは、速度よりもシンプルさと製造コストの低さが重視される幅広い電子機器アプリケーションで使用されています。I 2 Cを使用するPCコンポーネントおよびシステムには、デュアルインラインメモリモジュール(DIMM)上のシリアルプレゼンス検出(SPD)EEPROMや、 VGA、DVI、HDMIコネクタを介したモニタの拡張ディスプレイ識別データ(EDID)などがあります。一般的なI 2 Cアプリケーションには、ハードウェアモニタ、センサー、リアルタイムクロックの読み取り、アクチュエータの制御、低速DACおよびADCへのアクセス、シンプルなLCDまたはOLEDディスプレイの制御、ディスプレイデータチャネルを介したコンピュータディスプレイ設定(バックライト、コントラスト、色相、カラーバランスなど)の変更、スピーカーの音量変更などがあります。
I2Cの大きな強みは、マイクロコントローラがわずか2本の汎用I/Oピンでデバイスチップのネットワークを制御できることです。同様のアプリケーションで使用される他の多くのバス技術、例えばシリアル・ペリフェラル・インターフェース・バス(SPI)などは、複数のデバイスを接続するためにより多くのピンと信号を必要とします。
システムマネジメントバス(SMBus)は、1994年にIntelとDuracellによって定義されたI²Cのサブセットであり、より厳密な用途を定義しています。SMBusの目的の一つは、堅牢性と相互運用性の向上です。そのため、現代のI²CシステムはSMBusのポリシーとルールの一部を取り入れており、I²CとSMBusの両方をサポートする場合もあります。コマンドまたは出力ピンの使用による最小限の再設定のみで済みます。PCシステムのシステム管理にはSMBusが使用され、そのピンは従来のPCIコネクタとPCI Expressコネクタの両方に割り当てられています。
.jpg/440px-I_O_Expander_-_MCP23008_(46357574392).jpg)
I2Cの特許と仕様では、 1980年から2021年まで「マスター/スレーブ」という用語が使用されていました。 [ 1 ] [ 3 ] 2021年、I2C仕様の改訂7では、この用語が「コントローラー/ターゲット」に変更されました。[ 3 ] [ 4 ]このようなデバイスの技術的な定義と、 I2Cバス上での役割は変更されていません。[ 4 ]

I 2 Cは、シリアルデータライン(SDA)とシリアルクロックライン(SCL)の2つの信号のみを使用します。どちらも双方向で、抵抗でプルアップされています。[ 3 ]一般的に使用される電圧は+5 Vまたは+3.3 Vですが、他の電圧のシステムも使用できます。
I 2 Cリファレンスデザインは7ビットのアドレス空間を持ち、まれに10ビットの拡張が加えられている。[ 5 ]一般的なI 2 Cバス速度は100 kbit/sの標準モードと400 kbit/sの高速モードがあります。10 kbit/sの低速モードもありますが、任意の低いクロック周波数も使用できます。I2Cの最新バージョンでは、より多くのノードをホストし、より高速な速度(400 kbit/sの高速モード、1 Mbit/sの高速モードプラス、3.4 Mbit/sの高速モード、5 Mbit/sの超高速モード)で動作できます。これらの速度は、PCよりも組み込みシステムで広く使用されています。
ビットレートは、クロックストレッチやその他のハードウェアオーバーヘッドを除いた、コントローラ(マスター)とターゲット(スレーブ)間の転送レートであることに注意してください。プロトコルオーバーヘッドには、ターゲットアドレス、場合によってはターゲットデバイス内のレジスタアドレス、そしてバイトごとのACK/NACKビットが含まれます。したがって、ユーザーデータの実際の転送レートは、これらのピークビットレートのみから推定されるよりも低くなります。例えば、ターゲットとのやり取りごとに1バイトのデータしか転送されないという非効率的な状況では、データレートはピークビットレートの半分未満になります。
特定のI2Cバス上に存在できるノード数は、アドレス空間と400pFという バス総容量によって制限されます。そのため、実用的な通信距離は数メートル程度に制限されます。比較的高いインピーダンスと低いノイズ耐性のため、共通のグランド電位が必要となり、これもまた、実用範囲を同一PCボード内または小規模なボードシステム内での通信に限定します。
| モード[ 3 ] | 最高速度 | 最大静電容量 | ドライブ | 方向 |
|---|---|---|---|---|
| 標準モード(Sm) | 100 kbit/s | 400 pF | 排水口を開く* | 双方向 |
| 高速モード(Fm) | 400 kbit/s | 400 pF | 排水口を開く* | 双方向 |
| 高速モードプラス(Fm+) | 1 メガビット/秒 | 550 pF | 排水口を開く* | 双方向 |
| 高速モード(Hs) | 1.7 メガビット/秒 | 400 pF | 排水口を開く* | 双方向 |
| 高速モード(Hs) | 3.4 メガビット/秒 | 100 pF | 排水口を開く* | 双方向 |
| 超高速モード(UFm) | 5 メガビット/秒 | ? | プッシュ・プル | 一方向 |
前述のリファレンスデザインは、7ビットのアドレス指定を持つクロック(SCL)ラインとデータ(SDA)ラインを備えたバスです。このバスは、ノードに対してコントローラ(マスター)とターゲット(スレーブ)の2つの役割を持ちます。
このバスはマルチコントローラーバスであるため、任意の数のコントローラーノードを接続できます。さらに、コントローラーとターゲットの役割は、メッセージ間(STOP送信後)で変更される可能性があります。
特定のバス デバイスには 4 つの動作モードが存在する可能性がありますが、ほとんどのデバイスは単一の役割とその 2 つのモードのみを使用します。
I2Cバスでは、0と1のデータビットに加えて、メッセージの区切りとして機能し、データビットとは区別される特別なSTART信号とSTOP信号を使用できます。(これは、タイミングによってのみデータビットと区別される 非同期シリアル通信で使用されるスタートビットとストップビットとは対照的です。)
コントローラは、最初に START を送信してコントローラ送信モードになり、通信するターゲットの 7 ビット アドレスが続き、最後にターゲットに書き込む (0) かターゲットから読み取る (1) かを表す 1 ビットが続きます。
ターゲットがバス上に存在する場合、そのアドレスに対してACKビット(アクティブロー:確認応答)で応答します。その後、コントローラは送信モードまたは受信モード(送信した読み取り/書き込みビットに基づいて)を継続し、ターゲットは相補モード(それぞれ受信または送信)を継続します。
アドレスとデータバイトは最上位ビットから送信されます。スタートコンディションは、SCLがハイの状態でSDAがハイからローに遷移することで示されます。ストップコンディションは、SCLがハイの状態でSDAがローからハイに遷移することで示されます。その他のSDAの遷移は、SCLがローの状態で行われます。
コントローラがターゲットに書き込みを行う場合、ターゲットがACKビットを送信している間、コントローラはバイトを繰り返し送信します。(この状況では、コントローラはコントローラ送信モード、ターゲットはターゲット受信モードです。)
コントローラがターゲットから読み取りを行う場合、ターゲットからバイトを繰り返し受信し、最後のバイトを除くすべてのバイトの後に ACK ビットを送信します。(この状況では、コントローラはコントローラ受信モード、ターゲットはターゲット送信モードです。)
I2Cトランザクションは複数のメッセージで構成される場合があります。コントローラは、トランザクションの終了時にSTOP条件を送信してメッセージを終了させるか、別のメッセージのためにバス制御を維持するために別のSTART条件を送信する場合があります(「複合形式」トランザクション)。
I 2 C は、START で始まり STOP で終わる基本的なトランザクション タイプを定義します。
複合トランザクションでは、各読み取りまたは書き込みはSTARTビットとターゲットアドレスで始まります。最初のSTARTビットに続くSTART条件は、反復STARTビットとも呼ばれます。反復STARTビットの前にはSTOP条件がないため、ターゲットは次のメッセージが同じトランザクションの一部であることを認識します。
特定のターゲットは、製品ドキュメントに指定されている特定のメッセージにのみ応答します。
純粋なI 2 Cシステムは任意のメッセージ構造をサポートします。SMBusでは、単一のターゲットに関係する読み取りワードNや書き込みワードNなど、9つの構造に制限されています。PMBusはSMBusをグループプロトコルで拡張し、複数のSMBusトランザクションを1つの結合メッセージで送信できるようにします。終了のSTOPは、グループ化されたアクションがいつ有効になるかを示します。例えば、1回のPMBus操作で3つの電源(3つの異なるI 2 Cターゲットアドレスを使用)を再構成すると、それらの新しい構成は同時に、つまりSTOPを受信した時点で有効になります。
ごくわずかな例外を除き、I2CもSMBusも、メッセージ内のデータバイトの意味といったメッセージセマンティクスを定義していません。それ以外のメッセージセマンティクスは製品固有です。これらの例外には、I2Cジェネラルコールアドレス(0x00)またはSMBusアラートレスポンスアドレス宛のメッセージ、および動的なアドレス割り当てと管理のためのSMBusアドレス解決プロトコル(ARP)に関連するメッセージが含まれます。
実際には、ほとんどのターゲットはリクエスト・レスポンス制御モデルを採用しており、書き込みコマンドに続く1バイト以上のバイトがコマンドまたはアドレスとして扱われます。これらのバイトによって、後続の書き込みバイトの処理方法、またはターゲットが後続の読み取りにどのように応答するかが決まります。ほとんどのSMBus操作は、1バイトのコマンドで行われます。

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

物理層では、SCL ラインと SDA ラインはどちらもオープンドレイン( MOSFET ) またはオープンコレクタ( BJT ) バス設計であるため、各ラインにプルアップ抵抗が必要です。論理 "0" はラインをグランドにプルダウンすることで出力され、論理 "1" はラインをフローティング (出力ハイインピーダンス) にしてプルアップ抵抗によってハイにプルアップすることで出力されます。ラインがアクティブにハイに駆動されることはありません。この配線により、信号の競合による短絡なしに複数のノードをバスに接続できます。高速システム (およびその他のシステム) では、抵抗ではなく電流源を使用してSCL のみ、または SCL と SDA の両方をプルアップすることで、より高いバス容量に対応し、立ち上がり時間を短縮できます。
この重要な帰結として、複数のノードが同時にラインを駆動する可能性があるという点が挙げられます。いずれかのノードがラインをLowレベルに駆動している場合、そのラインもLowレベルになります。論理1を送信しようとしているノード(つまり、ラインをHighレベルにフローティングさせているノード)はこれを検出し、同時に別のノードがアクティブであると判断できます。
SCLで使用される場合、これはクロックストレッチングと呼ばれ、ターゲットのフロー制御メカニズムです。SDAで使用される場合、これはアービトレーションと呼ばれ、一度に1つの送信機のみが存在することを保証します。
アイドル時は両方のラインがハイです。トランザクションを開始するには、SCLがハイのままSDAをローに引き下げます。SDAを再びハイに解放してストップマーカーを送信することは違法です(ただし、 このような「無効メッセージ」は通常無害です)。そのため、次のステップはSCLをローに引き下げることです。
開始信号と停止信号を除き、SDA ラインはクロックが低い間のみ変化します。データ ビットの送信は、データ ラインを目的のレベルに安定させながら、クロック ラインを高くパルス化することで行われます。
SCLがLowの間、トランスミッタ(最初はコントローラ)はSDAを目的の値に設定し、(値が伝播するまでのわずかな遅延の後)SCLをHighにフローティングさせます。その後、コントローラはSCLが実際にHighになるまで待機します。これは、SCL信号の有限な立ち上がり時間(プルアップ抵抗のRC時定数とバスの寄生容量)によって遅延され、ターゲットのクロックストレッチによってさらに遅延される可能性があります。
SCLがハイになると、コントローラはレシーバがビットを認識したことを確認するために最小時間(標準速度のI2Cでは4μs )待機し、その後SCLを再びローにします。これで1ビットの送信が完了します。
一方向のデータビット8つごとに、反対方向に「確認応答」ビットが送信されます。送信側と受信側は1ビットずつ役割を交代し、元の受信側は「0」ビット(ACK)を1つ返します。送信側が「1」ビット(NACK)を受け取った場合、送信側は以下のことを認識します。
確認ビット中に方向が変わるのは SDA ラインのみで、SCL は常にコントローラによって制御されます。
確認ビットの後、クロック ラインは低くなり、コントローラは次の 3 つのうちのいずれかを実行します。
I 2 Cプロトコルの重要な機能の一つは、クロックストレッチです。アドレス指定されたターゲットデバイスは、1バイトを受信(または送信)した後、クロックライン(SCL)をローレベルに保持することがあります。これは、まだ次のデータを処理する準備ができていないことを示します。ターゲットと通信しているコントローラは、現在のビットの送信を完了せず、クロックラインが実際にハイレベルになるまで待機する必要があります。ターゲットがクロックストレッチを実行している場合、クロックラインはローレベルのままです(接続がオープンドレインであるため)。2つ目の低速なコントローラが同時にクロックを駆動しようとした場合も同様です。(複数のコントローラがある場合、通常、1つを除くすべてのコントローラがアービトレーションに負けます。)
コントローラは、クロック ラインがハイになるのを確認してから、さらに最小限の時間 (標準の100 kbit/s I 2 C の場合は 4 μs) 待ってから、クロックを再びローに引き下げる必要があります。
コントローラはSCLラインを必要なだけローレベルに保持することもできます(これはプロトコルのRev. 6以降、サブセクション3.1.1で禁止されています)。ただし、「クロックストレッチ」という用語は通常、ターゲット側がこれを行う場合にのみ使用されます。理論上はどのクロックパルスでもストレッチ可能ですが、一般的には確認応答ビットの前後の間隔が使用されます。例えば、ターゲットがマイクロコントローラの場合、そのI2Cインターフェースは、ソフトウェアが肯定応答(PACK)を送信するかNACKを送信するかを決定するまで、各バイトの後にクロックをストレッチすることができます。
I 2 Cにおいて、ターゲットがSCLを駆動するのはクロックストレッチのみです。多くのターゲットではクロックストレッチは不要であり、SCLを駆動回路を持たない入力として扱います。カスタムASICに搭載されているものなど、一部のコントローラはクロックストレッチをサポートしていない場合があります。これらのデバイスは、I 2 C ではなく「2線式インターフェース」と表記されることがよくあります。
SMBusはバススループットを最大化するために、クロックのストレッチ範囲に制限を設けています。これらの制限を遵守するホストとターゲットは、短時間以上バスへのアクセスをブロックすることはできません。これは、純粋なI2Cシステムでは保証されません。
各コントローラはバスのスタートビットとストップビットを監視し、別のコントローラがバスをビジー状態にしている間はメッセージを開始しません。ただし、2つのコントローラがほぼ同時に送信を開始する場合があり、その場合は調停が行われます。ターゲット送信モードは、コントローラが複数のターゲットをアドレス指定する場合にも調停されますが、これはあまり一般的ではありません。再試行を発行する前にランダムなバックオフ遅延を使用するプロトコル(イーサネットなど)とは対照的に、 I²Cは決定論的な調停ポリシーを備えています。各トランスミッタはデータライン(SDA)のレベルをチェックし、それを期待するレベルと比較します。一致しない場合、そのトランスミッタは調停に負け、このプロトコルのやり取りから脱落します。
1 つのトランスミッタが SDA を 1 (信号を駆動しない) に設定し、2 番目のトランスミッタがそれを 0 (グランドにプル) に設定すると、結果としてラインは低くなります。最初のトランスミッタは、ラインのレベルが予想と異なることを観察して、別のノードが送信していると結論付けます。この違いに最初に気付いたノードがアービトレーションに負けます。つまり、SDA の駆動を停止します。それがコントローラの場合は、SCL の駆動も停止し、STOP を待機します。その後、メッセージ全体を再発行しようとする場合があります。その間、他のノードは SDA 上の予想レベルと実際のレベルの違いに気付いていないため、送信を続行します。これまでのところ信号は予想どおりであり、他のトランスミッタがメッセージを妨害していないため、問題なく送信を続行できます。
2つのコントローラが異なるターゲットにメッセージを送信する場合、ターゲットアドレスの小さい方を送信するコントローラが、アドレスステージでの調停で常に「勝利」します。2つのコントローラが同じターゲットアドレスにメッセージを送信する可能性があり、アドレスが複数のターゲットを参照する場合もあるため、調停はデータステージまで継続されることがあります。
アービトレーションは極めて稀にしか発生しませんが、マルチコントローラ通信を適切にサポートするためには不可欠です。クロックストレッチングと同様に、すべてのデバイスがアービトレーションをサポートしているわけではありません。サポートしているデバイスは、一般的に「マルチコントローラ」通信をサポートしていると謳っています。
マルチコントローラI2C実装において、特に注意して処理しなければならないケースの一つは、コントローラ同士が通信する場合です。あるコントローラが受信メッセージの調停に失敗すると、自身のアドレスを確認するために、コントローラからターゲットへと役割を変更する必要があります。
極めて稀なケースですが、2つのコントローラが同時に同一のメッセージを送信した場合、両方のコントローラは通信が成功したとみなしますが、ターゲットは1つのメッセージしか受信しません。そのため、ターゲットが複数のコントローラからアクセスできる場合、ターゲットが認識するすべてのコマンドは、べき等性を持つか、2つのコントローラから同時に発行されないことが保証されている必要があります。(例えば、1つのコントローラからのみ発行されるコマンドはべき等性を持つ必要はありません。また、相互排他メカニズムによって、特定のコマンドが常に1つのコントローラからのみ発行されることが保証されている場合、特定のコマンドはべき等性を持つ必要はありません。)
I 2 C はコントローラ間の仲裁のみを行いますが、SMBus は3 つの追加コンテキストで仲裁を使用し、複数のターゲットがコントローラに応答し、1 つのターゲットがメッセージを通過させます。
PMBusバージョン1.3は、SMBusアラート応答プロトコルを「ゾーン読み取り」プロトコルに拡張しました。[ 7 ]ターゲットは「ゾーン」にグループ化され、ゾーン内のすべてのターゲットが応答するようにアドレス指定できます。応答はマスク(不要な情報を省略)、反転(必要な情報を0ビットとして送信し、アービトレーションを優先)、または並べ替え(最も重要な情報が最初に送信される)されます。アービトレーションにより、最も優先度の高い応答がコントローラーに最初に返されることが保証されます。
PMBus は、ゾーンの読み取りと書き込み用にそれぞれ I 2 C アドレス 0x28 と 0x37 を予約しています。
I2C通信には複数の動作モードがあります。いずれのモードも100 kbit/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²Cは本来の設計通り、つまり周辺ICを同じプリント基板上のプロセッサに直接接続し、コネクタを使わずに1フィート(30cm)未満の比較的短い距離で通信する形で使用されています。しかし、差動ドライバを使用することで、I²Cの代替バージョンでは、CAT5などのケーブルを介して最大20メートル(場合によっては100メートル以上)の通信が可能です。 [ 9 ] [ 10 ]
いくつかの標準コネクタはI2C信号を伝送します。例えば、UEXT、10ピンiPack [ 11 ]、6P6CレゴマインドストームNXTコネクタはI2Cを伝送します。[ 12 ] [ 13 ] [ 14 ] [ 15 ]すべてのHDMIコネクタとほとんどのDVIおよびVGAコネクタは、 I2C経由でDDC2データを伝送します。さらに、通常イーサネット物理層に使用される8P8CコネクタとCAT5ケーブルは、差動符号化[ 16 ]またはブーストされたシングルエンドI2C信号を伝送するために使用できる場合があります。[ 17 ]
システム内に多数のI 2 Cデバイスが存在する場合、バスバッファまたはマルチプレクサを使用して、大きなバスセグメントを小さなセグメントに分割する必要がある場合があります。これは、バスセグメントの容量を許容値以下に抑えるため、または同じアドレスを持つ複数のデバイスをマルチプレクサによって分離できるようにするためです。マルチプレクサとバッファには多くの種類があり、いずれもI 2 Cラインが双方向に指定されているという事実を考慮する必要があります。マルチプレクサは、あるセグメントを別のセグメントに接続できるアナログスイッチを使用して実装できます。アナログスイッチはラインの双方向性を維持しますが、あるセグメントの容量を別のセグメントから分離したり、バッファリング機能を提供したりすることはできません。
バッファを使用すると、あるセグメントの容量を別のセグメントから分離したり、I2Cをより長いケーブルやトレースで送信したりすることができます。I2Cなどの双方向ラインのバッファは、ラッチアップを防止するためのいくつかの方式のいずれかを使用する必要があります。I2Cはオープンドレインであるため、バッファは、片側がローになっているときは、もう一方もローにする必要があります。ラッチアップを防止する1つの方法は、バッファの入力レベルと出力レベルを慎重に選択し、ドライバの出力レベルが入力しきい値よりも高くなるようにして、バッファ自体がトリガーされないようにすることです。たとえば、バッファはローを検出するための入力しきい値を0.4Vに設定できますが、出力ローレベルは0.5Vになります。この方法では、バス上の他のすべてのデバイスのしきい値に互換性がある必要があり、多くの場合、この方式を実装している複数のバッファを互いに直列に接続できないことを意味します。
あるいは、ラッチアップを防ぐために、電流増幅器を実装したり、状態(つまり、どちらの側がバスをLowに駆動したか)を追跡したりする他のタイプのバッファも存在します。状態追跡方式では、通常、片側がバスをLowに駆動し、次にもう片側がLowに駆動し、最初の側がLowに駆動した際に、ハンドオフ中に意図しないパルスが生成されます(これはI2Cの確認応答でよく発生します)。
単一のコントローラを使用する場合、複数のI2Cバスで同じSCLラインを共有することが可能です。 [ 18 ] [ 19 ]各バス上のパケットは、順番に送信されるか、同時に送信されます。これは、各バス上の通信を、SCLがHighの短い期間とLowの短い期間を交互に繰り返すように分割できるため可能です。また、あるバスで1つの状態が長く必要な場合は、クロックをストレッチすることができます。
利点は、同じアドレスを持つターゲット デバイスを同時に使用し、複数のデータ ラインを同時に使用することで接続を節約したり、スループットを高速化したりできることです。
これらの表は、I 2 C メッセージ中に発生する可能性のあるさまざまなアトミック状態とビット操作を示しています。
| タイプ | 非アクティブバス (名詞) | 始める (S) | アイドル (私) | 停止 (P) | クロックストレッチ (CS) |
|---|---|---|---|---|---|
| 注記 | 仲裁を請求する自由 | バスクレーム(コントローラー) | バスを要求しました(コントローラー) | バス解放(コントローラ) | ターゲットによって一時停止 |
| SDA | パッシブプルアップ | 立ち下がりエッジ(コントローラ) | 低く保持(コントローラー) | 立ち上がりエッジ(コントローラ) | 気にしない |
| SCL | パッシブプルアップ | パッシブプルアップ | パッシブプルアップ | パッシブプルアップ | 低く抑える(目標) |
| タイプ | 1データビットを送信(1)(0) (SDAは誤った状態検出を避けるためにSCLの後に設定/サンプリングされます) | 受信側はACKビットで応答する (送信者から受信したバイト) | 受信側はNACKビットで応答する (送信者からのバイトが受信されませんでした) | |||
|---|---|---|---|---|---|---|
| ビットセットアップ(Bs) | サンプル準備完了(Bx) | ビットセットアップ(Bs) | ACK(A) | ビットセットアップ(Bs) | ナック(A') | |
| 注記 | 送信者セットビット(コントローラ/ターゲット) | 受信機サンプルビット(コントローラ/ターゲット) | 送信機Hi-Z | 送信者はSDAが低いと認識する | 送信機Hi-Z | 送信者はSDAが高いと認識する |
| SDA | ビットを設定(SCLが立ち下がった後) | キャプチャビット(SCLの立ち上がり後) | 受信機によって低く保持される(SCLが落ちた後) | レシーバによってハイ(またはパッシブハイ)に駆動される(SCLが立ち下がった後) | ||
| SCL | 立ち下がりエッジ(コントローラ) | 立ち上がりエッジ(コントローラ) | 立ち下がりエッジ(コントローラ) | 立ち上がりエッジ(コントローラ) | 立ち下がりエッジ(コントローラ) | 立ち上がりエッジ(コントローラ) |
| タイプ | ACK/NACK後の(Sr)信号の設定 | 繰り返しスタート(Sr) | |||
|---|---|---|---|---|---|
| 注記 | ACKからここから始めましょう | 停止(P)状態を回避する | NACKから始めましょう | スタート(S)信号と同じ | |
| SDA | ACKのために低く抑えられた | 上昇エッジ | パッシブハイ | パッシブハイ | 立ち下がりエッジ(コントローラ) |
| SCL | 立ち下がりエッジ(コントローラ) | 低く抑えられた | 立ち上がりエッジ(コントローラ) | パッシブハイ | パッシブプルアップ |
| 分野: | S | I 2 Cアドレスフィールド | 読み書き | あ | I 2 C メッセージ シーケンス... | P | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| タイプ | 始める | バイト1 | 確認 | バイトXなど 残りの読み取りまたは書き込み ここにメッセージ | 停止 | |||||||
| バイトXのビット位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||
| 7ビットアドレス位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |||||
| 注記 | MSB | LSB | 1 = 読む | |||||||||
| 0 = 書き込み | ||||||||||||
| 分野: | S | 10ビットモードインジケーター | 上位アドレス | 読み書き | あ | 下部住所フィールド | あ | I 2 Cメッセージシーケンス | P | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| タイプ | 始める | バイト1 | 確認 | バイト2 | 確認 | バイトXなど 残りの読み取りまたは書き込み ここにメッセージ | 停止 | ||||||||||||||
| バイトXのビット位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||||
| ビット値 | 1 | 1 | 1 | 1 | 0 | X | X | X | X | X | X | X | X | X | X | X | |||||
| 10ビットアドレス位置 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |||||||||||
| 注記 | 10ビットモードを示します | MSB | 1 = 読む | LSB | |||||||||||||||||
| 0 = 書き込み | |||||||||||||||||||||
8 つのアドレスからなる 2 つのグループが特別な機能のために予約されています。
0000 000終了0000 1111111 000終了1111 111| 予約済みアドレスインデックス | 8ビットバイト | 説明 | ||
|---|---|---|---|---|
| 7ビットアドレス | R/W値 | |||
| MSB (4ビット) | LSB (3ビット) | 1ビット | ||
| 1 | 0000 | 000 | 0 | 一般呼び出し |
| 2 | 0000 | 000 | 1 | 開始バイト |
| 3 | 0000 | 001 | X | CBUSアドレス |
| 4 | 0000 | 010 | X | 異なるバス形式用に予約済み |
| 5 | 0000 | 011 | X | 将来の目的のために予約済み |
| 6 | 0000 | 1XX | X | HSモードコントローラコード |
| 7 | 1111 | 1XX | 1 | デバイスID |
| 8 | 1111 | 0XX | X | 10ビットのターゲット(スレーブ)アドレス指定 |
さらに、残りの 112 個のアドレスは特定のクラスのデバイス用に指定されており、その一部は関連規格または一般的な使用法によってさらに予約されています。
SMBusはいくつかの追加アドレスを予約しています。特に、0001 000SMBusホスト用に予約されているアドレスはコントローラ対応デバイスで使用できます。0001 100また、帯域外割り込み後にホストによってポーリングされる「SMBusアラート応答アドレス」として予約されており、1100 001動的アドレス割り当て機能を持つデバイスによって最初に使用されるデフォルトアドレスです。
| MSB(4ビット) | 典型的な使用法[ 20 ] [ 21 ] [ 22 ] [ 23 ] [ 24 ] |
|---|---|
| 0001 | デジタル受信機、SMBus |
| 0010 | TVビデオラインデコーダー、IPMB |
| 0011 | AVコーデック |
| 0100 | ビデオエンコーダー、GPIOエクスパンダー |
| 0101 | ACCESS.bus、PMBus |
| 0110 | VESA DDC、PMBus |
| 0111 | ディスプレイコントローラ |
| 1000 | テレビ信号処理、オーディオ処理、SMBus |
| 1001 | AVスイッチング、ADCおよびDAC、IPMB、SMBus |
| 1010 | ストレージメモリ、リアルタイムクロック |
| 1011 | AVプロセッサー |
| 1100 | PLLおよびチューナー、変調器および復調器、SMBus |
| 1101 | AVプロセッサおよびデコーダ、オーディオパワーアンプ、SMBus |
| 1110 | AVカラースペースコンバータ |
MSBは1111デバイスIDと10ビットターゲット(スレーブ)アドレス指定用に予約されていますが、ポインティングデバイスなどのVESA DDCディスプレイ依存デバイスでも使用されます。[ 23 ]
I2Cトランザクションは1つ以上のメッセージで構成されます。各メッセージはスタートシンボルで始まり、トランザクションはストップシンボルで終了します。最初のスタートシンボルの後に続くスタートシンボルは、メッセージは開始しますがトランザクションは開始しません。これらのシンボルは繰り返しスタートシンボル と呼ばれます。
各メッセージは読み取りまたは書き込みです。単一のメッセージで構成されるトランザクションは、読み取りトランザクションまたは書き込みトランザクションと呼ばれます。複数のメッセージで構成されるトランザクションは、複合トランザクションと呼ばれます。複合トランザクションの最も一般的な形式は、デバイス内アドレス情報を提供する書き込みメッセージに続いて読み取りメッセージが続くものです。
多くのI2Cデバイスは、結合されたトランザクションと、同じメッセージが別々のトランザクションとして送信されたことを区別しませんが、すべてのデバイスがそうであるとは限りません。デバイスIDプロトコルは単一のトランザクションを必要とし、ターゲットは停止シンボルを検出した場合、応答を禁止されます。ターゲットに異常な応答を引き起こす設定、キャリブレーション、またはセルフテストモードも、トランザクションの終了時に自動的に終了されることがよくあります。

マーカーの誤検出を防ぐため、SCLの立ち下がりエッジとSDAの変化の間、およびSDAの変化とSCLの立ち上がりエッジの間には最小遅延が設けられています。最小遅延時間は、使用するデータ転送速度に依存します。nビットのデータ(確認応答を含む)を含むI2Cメッセージには、n + 1個のクロックパルスが含まれることに注意してください。
I 2 Cは「バスドライバ」ソフトウェア設計に適しています。接続デバイスのソフトウェアは、実際の低レベルI 2 Cハードウェアを処理する「バスドライバ」を呼び出すように記述されます。これにより、接続デバイスのドライバコードは、ビットバンギング設計を含む他のハードウェアに容易に移植できます。
GENERICGENERIC。I 2 Cを使用してシステムを開発またはトラブルシューティングする場合、ハードウェア信号レベルでの可視性が重要になることがあります。
Linux、Mac 、またはWindowsを搭載したホストコンピュータにI2Cコントローラーまたはターゲット接続を行うためのI2Cホストアダプターハードウェアソリューションは数多く存在します。そのほとんどはUSB -I2Cアダプターです。すべてが独自のドライバーやAPIを必要とするわけではありません。
I 2 C プロトコル アナライザーは、I 2 C バスをサンプリングし、電気信号をデコードして、バス上で送信されるデータの高レベルのビューを提供する ツールです。
I2Cバスの開発やトラブルシューティングにおいては、ハードウェア信号の検査が非常に重要です。ロジックアナライザは、信号を収集、解析、デコード、保存するツールであり、高速波形をいつでも観測することができます。ロジックアナライザは、信号レベルの変化ごとにタイムスタンプを表示するため、プロトコルの問題の発見に役立ちます。ほとんどのロジックアナライザは、バス信号を高レベルプロトコルデータにデコードし、ASCIIデータを表示する機能を備えています。
市販の様々なモジュールには、いくつかの主要なコネクタとピン配置があります。[ 30 ]
ターゲットアドレスの割り当てはI2Cの弱点です。7ビットでは、数千種類ものデバイス間でのアドレス衝突を防ぐには少なすぎます。異なるベンダー間のアドレス衝突の問題を軽減し、複数の同一デバイスへの接続を可能にするのは、メーカーがデバイスごとにターゲットアドレスをいくつかのアドレスオプションのいずれかに設定するためのピンを専用に用意していることです。通常は2~3本のピンが使用され、多くのデバイスではアドレスピンごとに3つ以上の配線オプションが存在します。[ 36 ] [ 37 ] [ 38 ]
10ビットのI2Cアドレスはまだ広く使用されていないため、多くのホストオペレーティングシステムはそれをサポートしていません。[ 39 ]アドレスを動的に割り当てる複雑なSMBus「ARP」方式も同様です(SMBus搭載のPCIカードの場合は必須です)。
自動バス構成も関連する問題です。特定のアドレスは、さまざまなシステムのプロトコル非互換のデバイスによって使用される可能性があり、実行時にデバイスタイプを検出することはほとんどできません。たとえば、は、互換性のないアドレス指定を持つ0x5124LC02 または 24C32 EEPROMによって使用される可能性があります。または、どちらとも確実に区別できない PCF8563 RTCによって使用される可能性があります (デバイス状態を変更しなければ、これは許可されていない可能性があります)。ホストで使用できる唯一の信頼性の高い構成メカニズムは、システムファームウェアによって提供され、使用可能なデバイスを一覧表示するテーブルなどの帯域外メカニズムです。この問題も、特にベンダーおよび製品識別子が使用されている場合、SMBus システムの ARP によって部分的に対処できますが、あまり普及していません。I2C 仕様の Rev. 3 バージョンでは、デバイスID メカニズムが追加されています。
I 2 Cは限られた速度範囲をサポートします。マルチメガビット速度をサポートするホストは稀です。Fm+ 1 Mbit/s速度のサポートは、その電子回路が低速で使用されるものの単純な派生型であるため、より広く普及しています。多くのデバイスは400 kbit/s速度をサポートしていません(SMBusがまだサポートしていないことが一因です)。専用ハードウェアではなくソフトウェアで実装されたI 2 Cノードは、 100 kbit/s速度さえサポートしていない可能性があります。そのため、仕様で定義されている範囲全体を使用できることはほとんどありません。すべてのデバイスは、使用される最高速度を少なくとも部分的にサポートする必要があります。そうしないと、デバイスアドレスを誤って検出する可能性があります。
デバイスは特定のニーズに合わせてクロックサイクルを延長できますが、これにより高速デバイスに必要な帯域幅が不足し、他のデバイスアドレスとの通信時にレイテンシが増加する可能性があります。また、バス容量も転送速度の制限となり、特に電流源を用いて信号の立ち上がり時間を短縮しない場合に顕著になります。
I2Cは共有バスであるため、いずれかのデバイスに障害が発生し、バス全体がハングする可能性があります。例えば、いずれかのデバイスがSDAまたはSCLラインをローレベルに保持すると、コントローラはバスをリセットするためのSTARTコマンドまたはSTOPコマンドを送信できなくなります。[ 40 ]そのため、バスデバイスを外部からリセットするためのリセット信号を設計に含めることが一般的です。しかし、多くのデバイスには専用のリセットピンがないため、設計者はリセットが必要な場合にデバイスの電源を入れ直すための回路を組み込む必要があります。
これらの制限(アドレス管理、バス構成、潜在的な障害、速度)のため、I2Cバスセグメントに12個ものデバイスが含まれることはほとんどありません。その代わりに、システムは複数の小さなセグメントで構成されるのが一般的です。1つのセグメントは、高速デバイスによる低レイテンシの電源管理専用に使用されます。別のセグメントは、レイテンシとスループットが重要でない少数のデバイスを制御するために使用されます。さらに別のセグメントは、アドオンカードを記述するEEPROMチップ( DRAMスティックで使用されるSPD規格など)の読み取り専用に使用される場合があります。
非常に低消費電力のシステムでは、プルアップ抵抗が設計全体の消費電力を合わせたよりも多くの電力を消費することがあります。このようなシステムでは、プルアップ抵抗はマイクロコントローラのDIOなど、スイッチング可能な電圧源から供給されることがよくあります。また、プルアップはバス速度を制限し、わずかな追加コストも発生します。そのため、一部の設計者は、I3CやSPIなど、プルアップを必要としない他のシリアルバスに注目しています。
I 2 Cは、 ACCESSバス、VESAディスプレイデータチャネル(DDC)インターフェース、システムマネジメントバス(SMBus)、電源マネジメントバス(PMBus)、そしてインテリジェントプラットフォームマネジメントバス(IPMB、 IPMIのプロトコルの1つ)の基盤となっています。これらのバリアントは、電圧とクロック周波数の範囲が異なり、割り込みラインを備えている場合があります。
高可用性システム(AdvancedTCA、MicroTCA)では、シェルフ管理に双方向冗長I2Cを使用します。これらのシステムでは、マルチコントローラI2C機能が必須です。
TWI(2線式インターフェース)またはTWSI(2線式シリアルインターフェース)は、Atmel社や他のベンダーの様々なシステムオンチッププロセッサに実装されているものと本質的に同じバスです。[ 41 ]ベンダーは、 I2Cが2014年11月7日時点で登録商標ではないにもかかわらず、TWIという名称を使用しています。 [ 42 ]商標保護はそれぞれのロゴ(右上隅を参照)に対してのみ存在し、I2Cの特許は現在失効しています。Microchip Technology社によると、TWIとI2Cにはいくつかの違いがあります。その1つは、TWIがSTARTバイトをサポートしていないことです。[ 43 ]
場合によっては、「2線式インターフェース」という用語の使用は、I2C仕様の実装が不完全であることを意味することがあります。アービトレーションやクロックストレッチをサポートしていないことはよくある制限の一つですが、クロックストレッチを行わない単純なターゲットと通信する単一のコントローラーであれば、依然として有用です。
MIPI I3Cセンサーインターフェース規格(I3C)は、2017年に開発が進められているI2Cの発展型である。 [ 44 ]
| 年 | バージョン | 注記 | 参照 |
|---|---|---|---|
| 1980 | 特許 | 1980年、「Philips Nv」はオランダで特許を出願しました。1981年には、「US Phillips Corp」が米国で特許を出願し、後に1987年に米国特許4,689,740として譲渡されました。 | [ 1 ] [ 45 ] [ 46 ] |
| 1982 | オリジナル | 100 kbit/s I 2 Cシステムは、さまざまな Philips チップを使用して制御電子機器を構築するためのシンプルな内部バス システムとして作成されました。 | 該当なし |
| 1992 | 1 | 400 kbit/sの高速モード(Fm)と10ビットのアドレス指定モード を追加し、容量を1008ノードまで増加しました。これが最初の標準化バージョンでした。 | 該当なし |
| 1998 | 2 | 電圧・電流の省電力化に対応した 3.4Mbit/s高速モード(Hs)を追加しました。 | [ 47 ] |
| 2000 | 2.1 | 大きな機能変更なしでバージョン 2 を明確化しました。 | [ 48 ] |
| 2007 | 3 | 1 Mbit/s高速モード プラス (Fm+) (20 mA ドライバを使用) とデバイス ID メカニズム を追加しました。 | [ 49 ] |
| 2012 | 4 | プルアップ抵抗なしのプッシュプルロジックを使用した新しいUSDA(データ)およびUSCL(クロック)ラインに5Mbit/s Ultra Fast-mode(UFm)を追加し、割り当てられたメーカーIDテーブルを追加しました。これは単方向バスのみです。 | [ 50 ] |
| 2012 | 5 | 間違いを修正しました。 | [ 51 ] |
| 2014 | 6 | 2つのグラフを修正しました。 | [ 52 ] |
| 2021 | 7 | I3Cバス仕様に合わせて、 「マスター/スレーブ」という用語を「コントローラ/ターゲット」に変更しました。表5のメーカーIDの割り当てを更新しました。セクション9にI3Cバスの概要を追加しました。これが現在の標準です。 | [ 3 ] |
{{citation}}: CS1 maint: ISBNによる作業パラメータ(リンク)のスレーブアドレスの7ビット部分は0010_000bです。
static u_int8_t probe_val[256];