|
| |||
| タイプ | シリアル通信 バス | ||
|---|---|---|---|
| 生産履歴 | |||
| デザイナー | NXPセミコンダクターズ(当時はフィリップスセミコンダクターズ) | ||
| 設計 | 1982年 | ||
| データ | |||
| データ信号 | オープンコレクターまたはオープンドレイン | ||
| 幅 | 1 ビット (SDA) と別のクロック (SCL) | ||
| ビットレート | 0.1、0.4、1.0、3.4またはモードに応じて5.0 Mbit/s | ||
| プロトコル | シリアル、半二重 | ||
| ピン配置 | |||
| SDA | データピン | ||
| SCL | 時計ピン | ||
I 2 C ( Inter-Integrated Circuit、「アイスクエアードシー」または「アイツーシー」と発音) は、I2CまたはIICとも呼ばれ、1982 年にPhilips Semiconductorsによって発明された同期、マルチコントローラ/マルチターゲット (歴史的にはマルチマスター/マルチスレーブと呼ばれていました)、シングルエンド、シリアル通信 バスです。これは、短距離のボード内通信で、 低速の周辺集積回路(IC) をプロセッサやマイクロコントローラに接続するために広く使用されています。
シーメンス、NEC、テキサス・インスツルメンツ、STマイクロエレクトロニクス、モトローラ、[1] ノルディック・セミコンダクター、インターシルなどの競合他社は、 1990年代半ば以降、互換性のあるI2C製品を市場に 投入してきました。
I 2 C バスは、速度よりもシンプルさと製造コストの低さが重要となる幅広い電子機器アプリケーションで使用されています。I 2 Cを使用するPCコンポーネントとシステムには、デュアル インライン メモリ モジュール(DIMM)上のシリアル プレゼンス検出(SPD) EEPROM 、 VGA、DVI、HDMIコネクタ経由のモニタ用拡張ディスプレイ識別データ(EDID)、 NVRAMチップへのアクセスなどがあります。一般的な I2C アプリケーションには、ハードウェア モニタ、センサー、リアルタイム クロックの読み取り、アクチュエータの制御、低速DACおよびADC へのアクセス、シンプルなLCDまたはOLEDディスプレイの制御、ディスプレイ データ チャネル経由のコンピュータ ディスプレイ設定 (バックライト、コントラスト、色相、カラー バランスなど) の変更、スピーカーの音量の変更などがあります。
I 2 Cの特に優れた点は、マイクロコントローラが2 つの汎用 I/Oピンとソフトウェアだけでデバイス チップのネットワークを制御できることです。シリアル ペリフェラル インターフェイス バス(SPI)など、同様のアプリケーションで使用される他の多くのバス テクノロジでは、複数のデバイスを接続するためにさらに多くのピンと信号が必要です。
システム管理バス(SMBus) は、1994 年に Intel と Duracell によって定義された I 2 Cのサブセットであり、より厳密な使用法を定義しています。SMBus の目的の 1 つは、堅牢性と相互運用性を促進することです。したがって、最新の I 2 C システムには、SMBus のポリシーとルールがいくつか組み込まれており、I 2 C と SMBus の両方をサポートする場合もあります。コマンドまたは出力ピンの使用による再構成は最小限で済みます。PC システムのシステム管理には、従来のPCI コネクタとPCI Expressコネクタ の両方にピンが割り当てられている SMBus が使用されます。
.jpg/500px-I_O_Expander_-_MCP23008_(46357574392).jpg)
デザイン

I 2 Cはシリアルデータライン(SDA)とシリアルクロックライン(SCL)の2つの信号のみを使用します。どちらも双方向で、抵抗でプルアップされています。[3]使用される一般的な電圧は+ 5Vまたは+3.3Vですが、他の電圧のシステムも許可されています。
I 2 Cリファレンスデザインは7ビットのアドレス空間を持ち、まれに10ビットの拡張が加えられている。[4]一般的な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 バイトのデータしか転送できない場合、データ レートはピーク ビット レートの半分未満になります。
特定の I 2 C バス上に存在できるノードの数は、アドレス空間と400 pFの合計バス容量によって制限され、実際の通信距離は数メートルに制限されます。比較的高いインピーダンスと低いノイズ耐性には共通の接地電位が必要であり、これもまた、実際の使用を同じ PC ボード内またはボードの小規模システム内での通信に制限します。
リファレンスデザイン
前述のリファレンス デザインは、7 ビット アドレス指定のクロック(SCL) ラインとデータ (SDA) ラインを備えたバスです。このバスには、コントローラ (マスター) またはターゲット (スレーブ) という 2 つのノードの役割があります。
- コントローラー (マスター) ノード: クロックを生成し、ターゲット (スレーブ) との通信を開始するノード。
- ターゲット (スレーブ) ノード: クロックを受信し、コントローラー (マスター) からアドレス指定されると応答するノード。
このバスはマルチコントローラ バスであるため、任意の数のコントローラ ノードが存在できます。また、コントローラとターゲットの役割は、メッセージ間で変更される可能性があります (STOP が送信された後)。
特定のバス デバイスには 4 つの動作モードが存在する可能性がありますが、ほとんどのデバイスでは 1 つのロールとその 2 つのモードのみが使用されます。
- コントローラー (マスター) 送信: コントローラー ノードがターゲット (スレーブ) にデータを送信しています。
- コントローラー (マスター) 受信: コントローラー ノードはターゲット (スレーブ) からデータを受信しています。
- ターゲット (スレーブ) 送信: ターゲット ノードがコントローラー (マスター) にデータを送信しています。
- ターゲット (スレーブ) 受信: ターゲット ノードはコントローラー (マスター) からデータを受信しています。
I 2 C バスでは、0 と 1 のデータ ビットに加えて、メッセージの区切りとして機能し、データ ビットとは区別される特別な START 信号と STOP 信号を使用できます (これは、タイミングによってのみデータ ビットと区別される非同期シリアル通信で使用されるスタート ビットとストップ ビットとは対照的です)。
コントローラは、最初にコントローラ送信モードになり、START の後に通信先のターゲットの 7 ビット アドレスを送信し、最後にターゲットに書き込む (0) かターゲットから読み取る (1) かを表す 1 ビットを送信します。
ターゲットがバス上に存在する場合、そのアドレスに対してACKビット (確認応答の場合はアクティブ ロー) で応答します。その後、コントローラは送信モードまたは受信モード (送信した読み取り/書き込みビットに応じて) を継続し、ターゲットは補完モード (それぞれ受信または送信) を継続します。
アドレスとデータ バイトは、最上位ビットから順に送信されます。開始条件は、SCL がハイの状態で SDA がハイからローに遷移することで示されます。停止条件は、SCL がハイの状態で SDA がローからハイに遷移することで示されます。その他の SDA 遷移はすべて、SCL がローの状態で行われます。
コントローラがターゲットに書き込む場合、ターゲットが ACK ビットを送信しながら、コントローラはバイトを繰り返し送信します。(この状況では、コントローラはコントローラ送信モードであり、ターゲットはターゲット受信モードです。)
コントローラがターゲットから読み取りを行う場合、コントローラはターゲットからバイトを繰り返し受信し、最後のバイトを除くすべてのバイトの後に ACK ビットを送信します。(この状況では、コントローラはコントローラ受信モードであり、ターゲットはターゲット送信モードです。)
I 2 C トランザクションは複数のメッセージで構成される場合があります。コントローラは、トランザクションの終了である場合は STOP 条件でメッセージを終了し、別のメッセージのためにバスの制御を維持するために別の START 条件を送信する場合があります (「複合形式」トランザクション)。
メッセージプロトコル
I 2 C は、START で始まり STOP で終わる基本的なトランザクション タイプを定義します。
- コントローラー (マスター) がターゲット (スレーブ) にデータを書き込む単一のメッセージ。
- コントローラー (マスター) がターゲット (スレーブ) からデータを読み取る単一のメッセージ。
- コントローラー (マスター) が 1 つ以上のターゲット (スレーブ) に対して少なくとも 2 つの読み取りまたは書き込みを発行する複合形式。
複合トランザクションでは、各読み取りまたは書き込みは 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 を受信したときに有効になります。
いくつかの例外を除き、I 2 C も SMBus も、メッセージ内のデータ バイトの意味などのメッセージ セマンティクスを定義していません。それ以外の場合、メッセージ セマンティクスは製品固有です。これらの例外には、I 2 Cジェネラル コールアドレス (0x00) または SMBusアラート応答アドレスに宛てられたメッセージ、および動的アドレス割り当てと管理のための SMBusアドレス解決プロトコル(ARP) に関連するメッセージが含まれます。
実際には、ほとんどのターゲットは要求応答制御モデルを採用しており、書き込みコマンドに続く 1 つ以上のバイトがコマンドまたはアドレスとして扱われます。これらのバイトによって、後続の書き込みバイトの処理方法や、後続の読み取りに対するターゲットの応答方法が決まります。ほとんどの SMBus 操作には、1 バイトのコマンドが含まれます。
メッセージング例: 24C32 EEPROM

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 でよく使用されます。
1 つのメッセージで EEPROM に書き込みます。START の後、コントローラは方向ビットをクリアした状態でチップのバス アドレスを送信し (書き込み)、次に EEPROM 内の 2 バイトのデータのアドレスを送信し、そのアドレスから書き込まれるデータ バイトを送信して、最後に STOP を送信します。複数のバイトを書き込む場合、すべてのバイトが同じ 32 バイト ページにある必要があります。それらのバイトをメモリに保存している間、EEPROM はそれ以上の I 2 C 要求に応答しません。(これは SMBus とのもう 1 つの非互換性です。SMBus デバイスは常にバス アドレスに応答する必要があります。)
EEPROM 内の特定のアドレスから読み取るには、複合メッセージを使用します。START の後、コントローラは最初に方向ビットをクリアした状態でそのチップのバス アドレスを書き込み ( write )、次に 2 バイトの EEPROM データ アドレスを書き込みます。次に、(繰り返しの) START と方向ビットをセットした状態で EEPROM のバス アドレスを送信します ( read )。すると EEPROM は、指定された EEPROM データ アドレスから始まるデータ バイトで応答します。これは、最初に write、次に read という複合メッセージです。コントローラは、最後のバイトを除く各読み取りバイトの後に ACK を発行し、次に STOP を発行します。EEPROM は、各データ バイトが転送されるたびにアドレスを増分します。マルチバイト読み取りでは、1 つの複合メッセージを使用して EEPROM の内容全体を取得できます。
物理層

物理層では、SCL ラインと SDA ラインの両方がオープン ドレイン( MOSFET ) またはオープン コレクタ( BJT ) バス設計であるため、各ラインにプルアップ抵抗が必要です。ラインをグランドにプルダウンすると論理 "0" が出力され、ラインをフローティング (出力高インピーダンス) にしてプルアップ抵抗によってハイにプルアップすると論理 "1" が出力されます。ラインがアクティブにハイに駆動されることはありません。この配線により、信号の競合による短絡なしに複数のノードをバスに接続できます。高速システム (およびその他のシステム) では、抵抗の代わりに電流源を使用してSCL のみ、または SCL と SDA の両方をプルアップし、バスの容量を高めて立ち上がり時間を短縮する場合があります。
この重要な結果は、複数のノードが同時にラインを駆動する可能性があることです。いずれかのノードがラインを低く駆動している場合、そのラインは低くなります。論理 1 を送信しようとしているノード (つまり、ラインを高くフロートさせるノード) はこれを検出し、別のノードが同時にアクティブであると判断できます。
SCL で使用される場合、これはクロック ストレッチと呼ばれ、ターゲットのフロー制御メカニズムです。SDA で使用される場合、これはアービトレーションと呼ばれ、一度に 1 つの送信機のみが存在するようにします。
アイドル状態のときは、両方のラインがハイです。トランザクションを開始するには、SCL がハイのままである間に SDA をローに引き下げます。SDA を解放して再びハイに浮動させて停止マーカーを送信することは違法です(ただし 、このような「無効なメッセージ」は通常は無害です)。そのため、次のステップは SCL をローに引き下げることです。
開始信号と停止信号を除き、SDA ラインはクロックが低い間のみ変化します。データ ビットの送信は、データ ラインを目的のレベルに安定させながらクロック ラインを高くパルス化することで行われます。
SCL が低い間、トランスミッタ (最初はコントローラ) は SDA を目的の値に設定し、(値が伝搬されるまでのわずかな遅延の後) SCL をフロート ハイにします。次に、コントローラは SCL が実際にハイになるまで待機します。これは、SCL 信号の有限の立ち上がり時間 (プルアップ抵抗のRC 時間定数とバスの寄生容量) によって遅延され、ターゲットのクロック ストレッチによってさらに遅延される可能性があります。
SCL がハイになると、コントローラは最小時間 (標準速度の I 2 C の場合は 4 μs) 待機して、受信機がビットを認識したことを確認し、その後 SCL を再びローにします。これで 1 ビットの送信が完了します。
一方向のデータ ビットが 8 ビット送信されるごとに、反対方向に「確認」ビットが送信されます。送信側と受信側は 1 ビットずつ役割を交代し、元の受信側は 1 つの「0」ビット (ACK) を返します。送信側が代わりに「1」ビット (NACK) を受信した場合、次のことが分かります。
- (コントローラがターゲットに送信している場合) ターゲットはデータを受け入れることができません。そのようなターゲットがないか、コマンドが理解されていないか、またはこれ以上データを受け入れることができません。
- (ターゲットがコントローラに送信する場合) コントローラは、このデータ バイトの後に転送を停止することを希望します。
確認ビット中に方向が変わるのは SDA ラインのみで、SCL は常にコントローラによって制御されます。
確認ビットの後、クロック ラインは低くなり、コントローラは次の 3 つのうちのいずれかを実行します。
- 次のバイトのデータ転送を開始します。送信機は SDA を設定し、コントローラーは SCL をハイにパルスします。
- 「停止」を送信します。SDA を低く設定し、SCL を高くしてから、SDA を高くします。これにより、I 2 C バスが解放されます。
- 「繰り返し開始」を送信します。SDA をハイに設定し、SCL をハイにしてから、SDA を再びローにします。これにより、バスを解放せずに新しい I 2 C バス メッセージが開始されます。
SCL を使用したクロックストレッチ
I 2 C プロトコルの重要な機能の 1 つは、クロック ストレッチです。アドレス指定されたターゲット デバイスは、バイトを受信 (または送信) した後、クロック ライン (SCL) を低く保持し、さらにデータを処理する準備がまだできていないことを示します。ターゲットと通信しているコントローラは、現在のビットの送信を完了しない可能性があり、クロック ラインが実際に高くなるまで待機する必要があります。ターゲットがクロック ストレッチを行っている場合、クロック ラインは低いままです (接続がオープン ドレインであるため)。2 つ目の低速コントローラが同時にクロックを駆動しようとした場合も同様です (コントローラが複数ある場合、通常、1 つを除くすべてのコントローラが調停に負けます)。
コントローラは、クロック ラインがハイになるのを検知するまで待機し、さらに最小限の時間 (標準の100 kbit/s I 2 C の場合は 4 μs) 待ってから、クロックを再びローに引き下げる必要があります。
コントローラは、SCL ラインを必要なだけ低く保持することもできますが (これはプロトコルの Rev. 6 以降では許可されていません - サブセクション 3.1.1)、「クロック ストレッチ」という用語は通常、ターゲットがこれを行う場合にのみ使用されます。理論上はどのクロック パルスでもストレッチできますが、一般的に使用されるのは確認応答ビットの前または後の間隔です。たとえば、ターゲットがマイクロコントローラの場合、その I 2 C インターフェイスは、ソフトウェアが肯定応答を送信するか NACK を送信するかを決定するまで、各バイトの後にクロックをストレッチできます。
クロック ストレッチは、I 2 C でターゲットが SCL を駆動する唯一のタイミングです。多くのターゲットではクロック ストレッチは不要で、SCL を駆動する回路のない入力としてのみ扱います。カスタムASIC内にあるような一部のコントローラはクロック ストレッチをサポートしない場合があります。多くの場合、これらのデバイスは I 2 C ではなく「2 線式インターフェイス」としてラベル付けされます。
バスのスループットを最大化するために、SMBus はクロックをどこまで延長できるかに制限を設けています。これらの制限に従うホストとターゲットは、短時間以上バスへのアクセスをブロックすることはできませんが、これは純粋な I 2 C システムでは保証されません。
SDAを使用した仲裁
各コントローラはバスのスタート ビットとストップ ビットを監視し、別のコントローラがバスをビジー状態にしている間はメッセージを開始しません。ただし、2 つのコントローラがほぼ同時に送信を開始する場合があり、この場合は調停が行われます。コントローラが複数のターゲットをアドレス指定する場合、ターゲット送信モードも調停されますが、これはあまり一般的ではありません。再試行を発行する前にランダムなバックオフ遅延を使用するプロトコル (イーサネットなど) とは対照的に、I 2 C には決定論的な調停ポリシーがあります。各トランスミッタはデータ ライン (SDA) のレベルをチェックし、それを予想されるレベルと比較します。一致しない場合、そのトランスミッタは調停を失い、このプロトコルのやり取りから脱退します。
1 つのトランスミッタが SDA を 1 (信号を駆動しない) に設定し、2 番目のトランスミッタがそれを 0 (接地) に設定すると、結果としてラインは低くなります。最初のトランスミッタは、ラインのレベルが予想と異なることに気づき、別のノードが送信していると結論付けます。このような違いに最初に気付いたノードが調停に負けます。つまり、SDA の駆動を停止します。それがコントローラの場合は、SCL の駆動も停止し、STOP を待機します。その後、メッセージ全体を再発行しようとする場合があります。その間、他のノードは SDA の予想レベルと実際のレベルの違いに気付かないため、送信を続けます。これまでのところ、信号は予想どおりであり、他のトランスミッタがメッセージを妨害していないため、問題なく送信を続行できます。
2 つのコントローラが 2 つの異なるターゲットにメッセージを送信する場合、より低いターゲット アドレスを送信するコントローラが常にアドレス ステージでの調停に「勝ちます」。2 つのコントローラが同じターゲット アドレスにメッセージを送信することがあり、アドレスが複数のターゲットを参照することがあるため、調停はデータ ステージまで続行されることがあります。
調停はめったに発生しませんが、適切なマルチコントローラのサポートには必要です。クロック ストレッチと同様に、すべてのデバイスが調停をサポートしているわけではありません。サポートしているデバイスは、通常、「マルチコントローラ」通信をサポートしていると自称しています。
マルチコントローラ I 2 C 実装で慎重に処理する必要があるケースの 1 つは、コントローラが相互に通信する場合です。1 つのコントローラが着信メッセージに対する調停を失う可能性があり、自分のアドレスを確認するために、時間内にコントローラからターゲットに役割を変更する必要があります。
非常にまれなケースですが、2 つのコントローラが同時に同一のメッセージを送信した場合、両方のコントローラは通信が成功したとみなしますが、ターゲットは 1 つのメッセージしか認識しません。このため、ターゲットが複数のコントローラからアクセスできる場合、ターゲットが認識するすべてのコマンドはべき等であるか、2 つのコントローラから同時に発行されないことが保証されている必要があります。(たとえば、1 つのコントローラからのみ発行されるコマンドはべき等である必要はありません。また、相互排他メカニズムによって、特定のコマンドを一度に 1 つのコントローラのみから発行することが保証されている場合は、特定のコマンドがべき等である必要もありません。)
SMBusにおける仲裁
I 2 C はコントローラ間の調停のみを行いますが、SMBus は3 つの追加コンテキストで調停を使用し、複数のターゲットがコントローラに応答し、1 つのターゲットがメッセージを受け取ります。
- 概念的にはシングル コントローラ バスですが、「ホスト通知プロトコル」をサポートするターゲット デバイスは、通知を実行するコントローラとして機能します。このデバイスはバスを占有し、予約済みの「SMBus ホスト」アドレス (0x08) に 3 バイトのメッセージを書き込み、そのアドレスと 2 バイトのデータを渡します。2 つのターゲットが同時にホストに通知しようとすると、そのうちの 1 つが調停を失い、再試行が必要になります。
- 代替のターゲット通知システムでは、別の SMBALERT# 信号を使用して注意を要求します。この場合、ホストは予約済みの「SMBus アラート応答アドレス」(0x0C) から 1 バイトの読み取りを実行します。これは一種のブロードキャスト アドレスです。アラートを発しているすべてのターゲットは、自身のアドレスを含むデータ バイトで応答します。ターゲットが自身のアドレスを正常に送信した場合 (他のターゲットに対して調停に勝利した場合)、その割り込みは発生しなくなります。この場合と前の両方のケースでは、調停によって 1 つのターゲットのメッセージが受信され、他のターゲットは再試行する必要があることを認識します。
- SMBus は「アドレス解決プロトコル」もサポートしており、デバイスは 16 バイトの「一意のデバイス識別子」(UDID) を返します。複数のデバイスが応答する場合がありますが、UDID が最も低いデバイスが調停に勝ち、認識されます。
PMBus における仲裁
PMBusバージョン 1.3 では、SMBus アラート応答プロトコルが「ゾーン読み取り」プロトコルに拡張されています。[6]ターゲットは「ゾーン」にグループ化され、ゾーン内のすべてのターゲットが応答するようにアドレス指定され、応答はマスク (不要な情報を省略)、反転 (必要な情報が 0 ビットとして送信され、アービトレーションが優先される)、または並べ替え (最も重要な情報が最初に送信される) されます。アービトレーションにより、最も優先度の高い応答が最初にコントローラに返されることが保証されます。
PMBus は、ゾーンの読み取りと書き込み用にそれぞれ I 2 C アドレス 0x28 と 0x37 を予約します。
モードの違い
I 2 C 通信には、いくつかの動作モードがあります。100 kbit/s 標準モードは常に使用できるという点ではすべて互換性がありますが、同じバス上で異なる機能を持つデバイスを組み合わせると、次のような問題が発生する可能性があります。
- 高速モードは互換性が高く、タイミング パラメータのいくつかを厳しくするだけで400 kbit/s の速度を実現できます。高速モードは I 2 C ターゲット デバイスで広くサポートされているため、バスの容量とプルアップ強度が許容する限り、コントローラは高速モードを使用できます。
- 高速モード プラスは、より強力な (20 mA) ドライバとプルアップを使用して最大1 Mbit/s を実現し、立ち上がり時間と立ち下がり時間を短縮します。標準モード デバイスと高速モードデバイス (3 mA プルダウン機能付き) との互換性は、通信時にプルアップの強度を下げる方法があれば実現できます。
- 高速モード( 3.4 Mbit/s ) は、同じバス上の通常の I 2 C デバイスと互換性がありますが、コントローラには、高速転送中に有効になるクロック ライン上のアクティブ プルアップが必要です。最初のデータ ビットは、通常のオープン ドレインの立ち上がりクロック エッジで転送され、引き伸ばされる可能性があります。残りの 7 つのデータ ビットと ACK については、コントローラが適切なタイミングでクロックをハイに駆動し、ターゲットが引き伸ばすことはできません。すべての高速転送の前に、高速または標準速度の 1 バイトの「コントローラ コード」が続きます。このコードには、次の 3 つの目的があります。
- 高速ターゲットデバイスに高速タイミングルールに変更するように指示します。
- 高速または通常速度のデバイスが転送に参加しないようにします(アドレスが一致しないため)。
- コントローラを識別するため (コントローラ コードは 8 つあり、各コントローラは異なるコードを使用する必要があります)、転送の高速部分の前に調停が完了することが保証され、高速部分でその機能を考慮する必要がありません。
- 超高速モードは、基本的に書き込み専用の I 2 C サブセットであり、既存の I 2 C インターフェイス ハードウェア設計に簡単にサポートを追加できるという点を除いて、他のモードとは互換性がありません。 コントローラは 1 つだけ許可され、常にデータ ラインをアクティブに駆動して5 Mbit/s の転送速度を実現します。 クロック ストレッチ、アービトレーション、読み取り転送、および確認応答はすべて省略されます。 このモードは主に、転送エラーが発生しても重要でない短時間の視覚的な不具合しか発生しないアニメーションLED ディスプレイを対象としています。他の I 2 C バス モードとの類似点は、次の点に限られます。
- 開始条件と終了条件は転送を区切るために使用されます。
- I 2 Cアドレス指定により、 SPIバススタイルのターゲット選択信号なしで複数のターゲットデバイスがバスを共有できるようになり、
- 送信されるバイトごとに 9 番目のクロック パルスが送信され、未使用の確認応答ビットの位置がマークされます。
一部のベンダーは、最大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)。[7]
ほとんどのアプリケーションでは、I2Cを本来の設計どおりに使用しています。つまり、周辺ICを同じプリント基板上のプロセッサに直接配線し、コネクタなしで1フィート(30cm)未満の比較的短い距離で通信します。ただし、差動ドライバを使用すると、I2Cの代替バージョンは、CAT5またはその他のケーブルを介して最大20メートル(場合によっては100メートル以上)まで通信できます。[8] [9]
いくつかの標準コネクタは I 2 C 信号を伝送します。たとえば、UEXTコネクタは I 2 C を伝送します。10 ピン iPack コネクタは I 2 C を伝送します。[10] 6P6C Lego Mindstorms NXT コネクタはI 2 C を伝送します。 [ 11] [12] [13] [14]少数の人々は、通常イーサネット物理層に使用される 8P8C コネクタと CAT5 ケーブルを使用して、代わりに差動エンコードされた I 2 C 信号[15]またはブーストされたシングルエンド I 2 C 信号を伝送します。[16]また、すべてのHDMI コネクタとほとんどのDVIおよびVGA コネクタは、 I 2 C 経由でDDC2データを伝送します。
バッファリングと多重化
システム内に多数の I 2 C デバイスがある場合、バスバッファまたはマルチプレクサを組み込んで、大きなバス セグメントを小さなセグメントに分割する必要がある場合があります。これは、バス セグメントの静電容量を許容値以下に抑えたり、同じアドレスを持つ複数のデバイスをマルチプレクサで分離したりするために必要になることがあります。マルチプレクサとバッファには多くの種類がありますが、そのすべてにおいて、I 2 C ラインは双方向に指定されているという事実を考慮する必要があります。マルチプレクサは、1 つのセグメントを別のセグメントに接続できるアナログ スイッチを使用して実装できます。アナログ スイッチは、ラインの双方向性を維持しますが、1 つのセグメントの静電容量を別のセグメントから分離したり、バッファリング機能を提供したりはしません。
バッファを使用すると、あるセグメントの容量を別のセグメントから分離したり、I 2 C をより長いケーブルやトレースで送信したりすることができます。I 2 Cなどの双方向ラインのバッファは、ラッチアップを防止するためのいくつかの方式のいずれかを使用する必要があります。I 2 C はオープン ドレインであるため、バッファは、片側がローになったときに、もう一方にローを駆動する必要があります。ラッチアップを防止する 1 つの方法は、バッファの入力レベルと出力レベルを慎重に選択して、ドライバの出力レベルが入力しきい値よりも高くなるようにし、バッファがトリガーされないようにすることです。たとえば、バッファの入力しきい値はローを検出するための 0.4 V ですが、出力ロー レベルは 0.5 V です。この方法では、バス上の他のすべてのデバイスのしきい値に互換性がある必要があり、多くの場合、この方式を実装する複数のバッファを互いに直列に接続できないことを意味します。
あるいは、ラッチアップを防ぐために、電流増幅器を実装したり、状態 (つまり、どちらの側がバスをローに駆動したか) を追跡したりする他のタイプのバッファも存在します。状態方式では通常、片側がバスをローに駆動し、次にもう一方がローに駆動し、最初の側が解放すると、ハンドオフ中に意図しないパルスが生成されます (これは、I 2 C 確認応答中によく発生します)。
複数のバス間でSCLを共有する
コントローラが 1 つしかない場合、複数の I 2 C バスで同じ SCL ラインを共有することができます。[17] [18]各バス上のパケットは、次々に送信されるか、同時に送信されます。これは、各バス上の通信を、SCL が高い短い期間と SCL が低い短い期間を交互に繰り返すことで分割できるため可能です。また、1 つのバスが 1 つの状態でより多くの時間を必要とする場合は、クロックを延長することができます。
利点は、同じアドレスを持つターゲット デバイスを同時に使用し、複数のデータ ラインを同時に使用することで接続を節約したり、スループットを高速化したりできることです。
ライン状態テーブル
これらの表は、I 2 C メッセージ中に発生する可能性のあるさまざまなアトミック状態とビット操作を示しています。
アドレス構造
7ビットアドレス指定
10ビットアドレス指定
7ビットアドレス空間の予約アドレス
それぞれ 8 つのアドレスの 2 つのグループが特別な機能のために予約されています。
- から:
0000 000まで0000 111 - から:
1111 000まで1111 111
さらに、残りの 112 個のアドレスは特定のデバイス クラス用に指定されており、その一部は関連規格または一般的な使用法によってさらに予約されています。
SMBus は、いくつかの追加アドレスを予約しています。特に、0001 000コントローラ対応デバイスによって使用される可能性のある SMBus ホスト用に予約されているのは、0001 100帯域外割り込み後にホストによってポーリングされる「SMBus アラート応答アドレス」であり、1100 001動的アドレス割り当てが可能なデバイスによって最初に使用されるデフォルト アドレスです。
7ビットアドレス空間内の非予約アドレス
MSBは1111デバイスIDと10ビットターゲット(スレーブ)アドレス指定用に予約されていますが、ポインティングデバイスなどのVESA DDCディスプレイ依存デバイスでも使用されます。[22]
取引形式
I 2 Cトランザクションは1 つ以上のメッセージで構成されます。各メッセージは開始シンボルで始まり、トランザクションは停止シンボルで終了します。最初の開始シンボルの後の、メッセージは開始しますがトランザクションは開始しない開始シンボルは、繰り返し開始シンボルと呼ばれます。
各メッセージは読み取りまたは書き込みです。 1 つのメッセージで構成されるトランザクションは、読み取りトランザクションまたは書き込みトランザクションと呼ばれます。 複数のメッセージで構成されるトランザクションは、複合トランザクションと呼ばれます。 後者の最も一般的な形式は、デバイス内アドレス情報を提供する書き込みメッセージと、それに続く読み取りメッセージです。
多くの I 2 C デバイスは、結合されたトランザクションと、別々のトランザクションとして送信された同じメッセージを区別しませんが、すべてのデバイスが区別するわけではありません。デバイス ID プロトコルでは単一のトランザクションが必要です。ターゲットは、停止シンボルを検出した場合、応答を禁止されます。ターゲットが異常に応答する原因となる構成、調整、またはセルフテスト モードも、トランザクションの終了時に自動的に終了されることがよくあります。
タイミング図

- データ転送は、SCL がハイのままで SDA が低く引き下げられることによって通知される開始条件 (S) で開始されます。
- SCL は低く引き下げられ、SDA は SCL を低く保ったまま最初のデータ ビット レベルを設定します (青いバーの時間中)。
- データは、最初のビット (B1) の SCL が立ち上がったときにサンプリング (受信) されます。ビットが有効であるためには、SCL の立ち上がりエッジとそれに続く立ち下がりエッジ (緑色のバーの時間全体) の間で SDA が変化してはなりません。
- このプロセスは繰り返され、SCL が低い間に SDA が遷移し、SCL が高い間にデータが読み取られます (B2 から Bn)。
- 最後のビットの後にはクロック パルスが続き、その間に SDA はストップビットの準備のためにローに引き下げられます。
- SCL が立ち上がり、続いて SDA が立ち上がると、停止条件 (P) が通知されます。
誤ったマーカー検出を回避するために、SCL の立ち下がりエッジと SDA の変化の間、および SDA の変化と SCL の立ち上がりエッジの間には最小の遅延があります。最小遅延時間は、使用するデータ転送速度によって異なります。n データ ビット (確認応答を含む) を含む I 2 Cメッセージには、 n + 1クロック パルスが含まれることに注意してください。
ソフトウェア設計
I 2 C は、「バス ドライバー」ソフトウェア設計に適しています。接続されたデバイスのソフトウェアは、実際の低レベル I 2 C ハードウェアを処理する「バス ドライバー」を呼び出すように記述されます。これにより、接続されたデバイスのドライバー コードを、ビット バンギング設計を含む他のハードウェアに簡単に移植できます。
Iのビットバンギングの例2Cプロトコル
以下は、 I2Cコントローラ(マスター)としてI2Cプロトコルをビットバンギングする例です。この例は疑似Cで書かれています。これは、前に説明したすべてのI2C機能(クロックストレッチ、アービトレーション、スタート/ストップビット、ACK/NACK)を示しています。 [ 24]
// カスタマイズする必要があるハードウェア固有のサポート関数:
#I2CSPEED 100 を定義します
I2C_delay を無効にします。
bool read_SCL ( void ); // SCLラインの現在のレベル(0または1)を返す
bool read_SDA ( void ); // SDAラインの現在のレベル(0または1)を返す
void set_SCL ( void ); // SCLを駆動しない(ピンをハイインピーダンスに設定する)
void clear_SCL ( void ); // SCL信号をアクティブにローにする
void set_SDA ( void ); // SDAを駆動しない(ピンをハイインピーダンスに設定する)
void clear_SDA ( void ); // SDA信号をアクティブにローに駆動する
void仲裁_lost ( void );
bool started = false ; // グローバルデータ
void i2c_start_cond ( void )
{
if (開始) {
// 開始された場合は、再起動条件を実行します
// SDAを1に設定
set_SDA ();
I2C_遅延();
set_SCL ();
while ( read_SCL () == 0 ) { // クロックストレッチ
// このループにタイムアウトを追加する必要があります
}
// 繰り返し開始セットアップ時間、最小 4.7us
I2C_遅延();
}
read_SDA ( ) == 0の場合
仲裁負け();
}
// SCL がハイの場合、SDA を 1 から 0 に設定します。
クリアSDA ();
I2C_遅延();
clear_SCL ();
開始= true ;
}
i2c_stop_cond は、次の式で定義されます。
{
// SDAを0に設定する
クリアSDA ();
I2C_遅延();
set_SCL ();
// クロックストレッチ
read_SCL ( ) == 0の間
// このループにタイムアウトを追加します。
}
// ストップビットのセットアップ時間、最小 4us
I2C_遅延();
// SCLがハイなので、SDAを0から1に設定する
set_SDA ();
I2C_遅延();
read_SDA ( ) == 0の場合
仲裁負け();
}
開始= false ;
}
// I2Cバスにビットを書き込む
void i2c_write_bit (ブールビット)
{
if (ビット) {
set_SDA ();
}それ以外{
クリアSDA ();
}
// SDA変更伝播遅延
I2C_遅延();
// 新しい有効なSDA値が利用可能であることを示すためにSCLをハイに設定します
set_SCL ();
// ターゲットによって SDA 値が読み取られるのを待機します。標準モードでは最小 4us です。
I2C_遅延();
while ( read_SCL () == 0 ) { // クロックストレッチ
// このループにタイムアウトを追加する必要があります
}
// SCL がハイなので、データが有効です
// SDAが高い場合は、他に誰もSDAを駆動していないことを確認する
if (ビット&& ( read_SDA () == 0 )) {
仲裁負け();
}
// 次の変更に備えて SCL を低くクリアします
clear_SCL ();
}
// I2Cバスからビットを読み取る
ブールi2c_read_bit ( void )
{
boolビット;
// ターゲットドライブにデータを転送する
set_SDA ();
// ターゲットによって SDA 値が書き込まれるのを待機します。標準モードでは最小 4us です。
I2C_遅延();
// 新しい有効なSDA値が利用可能であることを示すためにSCLをハイに設定します
set_SCL ();
while ( read_SCL () == 0 ) { // クロックストレッチ
// このループにタイムアウトを追加する必要があります
}
// ターゲットによって SDA 値が書き込まれるのを待機します。標準モードでは最小 4us です。
I2C_遅延();
// SCLがハイ、ビットを読み出す
ビット= read_SDA ();
// 次の操作に備えて SCL をローに設定します
clear_SCL ();
ビットを返す;
}
// I2C バスにバイトを書き込みます。ターゲットから ack が返された場合は 0 を返します。
ブールi2c_write_byte (ブールsend_start 、
ブール送信停止、
符号なし文字バイト)
{
符号なしビット;
ブールナック;
if (送信開始) {
i2c_start_cond ();
}
(ビット= 0 ;ビット< 8 ; ++ビット) {
i2c_write_bit ((バイト& 0x80 ) != 0 );
バイト<<= 1 ;
}
i2c_read_bitを読み取り専用にします。
送信停止の場合
i2c_stop_cond ();
}
nackを返します。
}
// I2Cバスから1バイトを読み込む
符号なしchar i2c_read_byte ( bool nack 、bool send_stop )
{
符号なしcharバイト= 0 ;
unsigned charビット;
(ビット= 0 ;ビット< 8 ; ++ビット) {
バイト= (バイト<< 1 ) | i2c_read_bit ();
}
i2c_write_bit (ナック);
送信停止の場合
i2c_stop_cond ();
}
バイトを返します。
}
I2C_delayを空にする
{
揮発性int v ;
整数i ;
( i = 0 ; i < I2CSPEED / 2 ; ++ i )の場合{
ヴ;
}
}
オペレーティングシステムのサポート
- AmigaOSでは、 AmigaOS 4.xおよびMorphOS 3.x用のi2c.resourceコンポーネント[25]、または古いシステム用のWilhelm Noekerによる共有ライブラリi2c.libraryを使用できます。
- Arduino開発者は「Wire」ライブラリを使用できます。
- CircuitPythonおよびMicroPython開発者は、それぞれ busio.I2C または machine.I2C クラスを使用できます。
- Maximite は、MMBasic の一部としてI 2 C 通信をネイティブにサポートします。
- PICAXE はi2c および hi2c コマンドを使用します。
- eCos は、いくつかのハードウェア アーキテクチャのI 2 C をサポートしています。
- ChibiOS/RT は、いくつかのハードウェア アーキテクチャのI 2 C をサポートしています。
- FreeBSD、NetBSD、OpenBSDも I 2 C フレームワークを提供し、多くの一般的なコントローラーとセンサーをサポートしています。
- OpenBSD 3.9 (2006 年 5 月 1 日リリース)以降、中央のi2c_scanサブシステムは、アドホックな重み付けスキームと、I 2 C ターゲットからレジスタ値を読み取るためのローカル キャッシュ機能を使用して、起動時にすべての可能なセンサー チップを一度にプローブします。 [26]これにより、ユーザーによる構成や顕著なプローブ遅延なしで、起動時に汎用の市販の i386/amd64 ハードウェア上のセンサーをプローブできます。個々のドライバーのマッチング手順は、マッチングに文字列ベースの「フレンドリ名」のみに頼る必要があります。[27]その結果、ほとんどの I 2 C センサー ドライバーは、安定性に悪影響を与えることなく、適用可能なアーキテクチャでデフォルトで自動的に有効になります。I 2 C とそれ以外の両方の個々のセンサーは、sysctl hw.sensorsフレームワークを通じてユーザーランドにエクスポートされます。 2019 年 3 月現在、OpenBSD には、 hw.sensorsフレームワークを通じて何らかのセンサーをエクスポートする I2C上のデバイス ドライバーが 20 個以上あり、これらのドライバーの大部分はOpenBSD の i386/amd64 カーネルでデフォルトで完全に有効化されています。 [アップデート]
GENERIC - NetBSDには、ハードウェア監視センサーを備えた 20 を超える I 2 C ターゲット デバイスが存在し、sysmon envsysフレームワークを通じてプロパティ リストとしてアクセスできます。汎用ハードウェアでは、各ドライバーが独自のプローブを実行する必要があるため、NetBSD の i386/amd64 ビルドでは、I 2 C ターゲットのすべてのドライバーがデフォルトで無効になっています
GENERIC。
- OpenBSD 3.9 (2006 年 5 月 1 日リリース)以降、中央のi2c_scanサブシステムは、アドホックな重み付けスキームと、I 2 C ターゲットからレジスタ値を読み取るためのローカル キャッシュ機能を使用して、起動時にすべての可能なセンサー チップを一度にプローブします。 [26]これにより、ユーザーによる構成や顕著なプローブ遅延なしで、起動時に汎用の市販の i386/amd64 ハードウェア上のセンサーをプローブできます。個々のドライバーのマッチング手順は、マッチングに文字列ベースの「フレンドリ名」のみに頼る必要があります。[27]その結果、ほとんどの I 2 C センサー ドライバーは、安定性に悪影響を与えることなく、適用可能なアーキテクチャでデフォルトで自動的に有効になります。I 2 C とそれ以外の両方の個々のセンサーは、sysctl hw.sensorsフレームワークを通じてユーザーランドにエクスポートされます。 2019 年 3 月現在、OpenBSD には、 hw.sensorsフレームワークを通じて何らかのセンサーをエクスポートする I2C上のデバイス ドライバーが 20 個以上あり、これらのドライバーの大部分はOpenBSD の i386/amd64 カーネルでデフォルトで完全に有効化されています。 [アップデート]
- Linuxでは、I 2 C は特定のデバイス用のデバイス ドライバーと、それが接続されている I 2 C (またはSMBus ) アダプター用の別のデバイス ドライバーで処理されます。このようなドライバーは数百種類あり、現在の Linux カーネル リリースに含まれています。
- Mac OS Xには、電圧、電流、温度、動き、その他の物理的状態を読み取るためにセンサーと通信する I2C カーネル拡張機能が約24 個あります。
- Microsoft Windowsでは、I2Cは業界で利用可能なハードウェアの多くに対応するデバイスドライバーによって実装されています。HID組み込み/SoCデバイスの場合、 Windows 8以降にはI²Cバスドライバーが統合されています。[28]
- Windows CEでは、I 2 C は業界で入手可能なハードウェアの多くに対応するデバイス ドライバーによって実装されています。
- IoT 向け POSIX RTOS である Unison OS は、複数の MCU および MPU ハードウェア アーキテクチャの I 2 C をサポートしています。
- RISC OSでは、I 2 CはIOコントローラからの汎用I 2 Cインターフェースで提供され、OSモジュールシステムからサポートされます。
- Sinclair QDOSおよびMinerva QL オペレーティング システムでは、 I 2 C は TF サービスによって提供される拡張機能のセットによってサポートされています。
- Zephyr OSでは、I2Cはi2cデバイスドライバAPIを通じてサポートされています。[29]このAPIはI2Cデバイスと通信するための汎用インターフェースを提供し、幅広いI2Cデバイスをサポートできるようにします。
開発ツール
I 2 C を使用してシステムを開発またはトラブルシューティングする場合、ハードウェア信号レベルでの可視性が重要になることがあります。
ホストアダプタ
Linux、Mac、またはWindowsを実行しているホスト コンピューターにI 2 C コントローラーまたはターゲット接続を行うための I 2 C ホスト アダプター ハードウェア ソリューションは多数あります。ほとんどのオプションはUSBから I 2 C へのアダプターです。すべてが独自のドライバーやAPI を必要とするわけではありません。
プロトコルアナライザー
I 2 C プロトコル アナライザーは、I 2 C バスをサンプリングし、電気信号をデコードして、バス上で送信されるデータの高レベルのビューを提供する ツールです。
ロジックアナライザ
I 2 C バスの開発やトラブルシューティングを行う場合、ハードウェア信号の検査が非常に重要です。ロジック アナライザは、信号を収集、分析、デコード、保存するツールであり、ユーザーは高速波形を自由に表示できます。ロジック アナライザは、各信号レベルの変化のタイムスタンプを表示するため、プロトコルの問題を見つけるのに役立ちます。ほとんどのロジック アナライザには、バス信号を高レベルのプロトコル データにデコードし、ASCII データを表示する機能があります。
人気のケーブルシステム
市販のさまざまなモジュールには、いくつかの主要なコネクタとピン配置があります。[30]
- Qwiic : 2017年にSparkfunによって導入され、4ピンJST SH 1.0mmコネクタを採用しています[31]
- ピン配置: GND、Vcc (3.3V)、SDA、SCL
- STEMMA QT : 2018年にAdafruitによって導入されましたが、より広い電圧範囲(3V~5V)を可能にするため、必ずしもQwiicと互換性があるわけではありません[32]。デバイスボードのサイズは標準化されています。
- ピン配置: GND、Vcc (3V~5V)、SDA、SCL
- STEMMA : Adafruit製、4ピンJST PH 2.0mmコネクタを使用(3ピンコネクタはアナログ/PWM用)[33]
- ピン配置: GND、Vcc (3V~5V)、SDA、SCL
- Grove : Seeed Studio製、A2005シリーズまたは1125S-4Pと呼ばれる4ピン2.0mmの専用コネクタを採用[34]
- ピン配置: GND、Vcc (3.3/5V)、SDA、SCL
- Gravity : DFRobot製、4ピンJST PH 2.0mmコネクタを使用、STEMMAと同じコネクタだがピンの使用が異なる[35]
- ピン配置: SDA、SCL、GND、Vcc (3.3/5V)
- nodeLynkインターフェース: 4ピンMolex SL 70553シリーズ2.54mmコネクタを使用
- ピン配置: SCL、SDA、Vcc (5V)、GND
- Breakout Garden : Pimoroni製。1.6mm 厚の回路基板に5 ピン 2.54mmエッジ コネクタを採用。Raspberry Pi ヘッダーとピン配置が互換。
- ピン配置: Vcc (2V ~ 6V)、SDA、SCL、未使用/割り込み、GND
- UEXT : Olimex 社製は、I2C、 SPI、 UARTを統合した 5x2 2.54mm シュラウド ヘッダー コネクタです。
- Pmod インターフェース: Digilent社製、6 ピン シングルライン 2.54mm ヘッダー コネクタ、I2C、SPI、UART 用。FPGAボード
- ピン配置 (「タイプ 6」、I2C バリアント): 未使用/GPIO/スレーブからマスターへの割り込み、未使用/GPIO/リセット、SCL、SDA、GND、Vcc (3.3V)
制限事項
ターゲット アドレスの割り当ては I 2 Cの弱点です。7ビットでは、利用可能な何千ものデバイス間でのアドレスの衝突を防ぐには少なすぎます。異なるベンダー間のアドレス衝突の問題を軽減し、複数の同一デバイスに接続できるようにするには、メーカーがデバイスごとにいくつかのアドレス オプションの 1 つにターゲット アドレスを設定するために使用できるピンを専用に用意します。2 つまたは 3 つのピンが一般的ですが、多くのデバイスでは、アドレス ピンごとに 3 つ以上の配線オプションがあります。[36] [37] [38]
10ビットのI2Cアドレスはまだ広く使用されていないため、多くのホストオペレーティングシステムはこれをサポートしていません。[39]アドレスを動的に割り当てる複雑なSMBus「ARP」方式も同様です(SMBus搭載のPCIカードの場合は必須)。
自動バス構成も関連する問題です。特定のアドレスは、さまざまなシステムでプロトコル非互換のさまざまなデバイスによって使用される可能性があり、実行時にデバイス タイプを検出することはほとんどできません。たとえば、は、互換性のないアドレス指定を持つ0x5124LC02 または 24C32 EEPROMによって使用される可能性があります。または、どちらとも確実に区別できない PCF8563 RTCによって使用される可能性があります (デバイスの状態を変更しなければ、これは許可されない可能性があります)。ホストで使用できる唯一の信頼性の高い構成メカニズムは、システム ファームウェアによって提供される、使用可能なデバイスをリストするテーブルなどの帯域外メカニズムです。この問題も、SMBus システムの ARP によって部分的に対処できますが、特にベンダー ID と製品 ID が使用されている場合はそうですが、あまり普及していません。I 2 C仕様の Rev. 3 バージョンでは、デバイス ID メカニズムが追加されています。
I 2 C は限られた範囲の速度をサポートしています。マルチメガビットの速度をサポートするホストはまれです。Fm+ 1 Mbit/s速度のサポートは、その電子機器が低速で使用されるものの単純なバリエーションであるため、より広く普及しています。多くのデバイスは400 kbit/s速度をサポートしていません (SMBus がまだサポートしていないため)。専用ハードウェアではなくソフトウェアで実装されたI 2 C ノードは、 100 kbit/s速度をサポートしていない可能性があります。そのため、仕様で定義されている範囲全体が使用できることはほとんどありません。すべてのデバイスは、使用される最高速度を少なくとも部分的にサポートする必要があります。そうしないと、デバイス アドレスが誤って検出される可能性があります。
デバイスは、特定のニーズに合わせてクロック サイクルを延長できますが、これにより、より高速なデバイスに必要な帯域幅が不足し、他のデバイス アドレスと通信する際の待ち時間が長くなる可能性があります。また、バスの静電容量によっても転送速度が制限されます。これは、特に電流源を使用して信号の立ち上がり時間を短縮しない場合に顕著です。
I 2 C は共有バスであるため、いずれかのデバイスに障害が発生し、バス全体が停止する可能性があります。たとえば、いずれかのデバイスが SDA または SCL ラインを低く保持すると、コントローラはバスをリセットするための START コマンドまたは STOP コマンドを送信できなくなります。そのため、設計にはバス デバイスをリセットするための外部方法を提供するリセット信号が含まれるのが一般的です。ただし、多くのデバイスには専用のリセット ピンがないため、リセットが必要な場合にデバイスの電源をオン/オフできる回路を設計者が組み込む必要があります。
これらの制限 (アドレス管理、バス構成、潜在的な障害、速度) のため、デバイスが 12 個もある I 2 C バス セグメントはほとんどありません。代わりに、システムにはいくつかの小さなセグメントがあるのが一般的です。1 つは、低レイテンシの電力管理のために高速デバイス専用に使用されます。もう 1 つは、レイテンシとスループットが重要ではないいくつかのデバイスを制御するために使用されます。さらに別のセグメントは、アドオン カードを記述する EEPROM チップ ( DRAM スティックで使用されるSPD標準など) の読み取り専用に使用される場合があります。
非常に低電力のシステムでは、プルアップ抵抗器は、設計全体の合計よりも多くの電力を消費することがあります。これらのシステムでは、抵抗器は、マイクロコントローラの DIO などの切り替え可能な電圧源によって電力を供給されることがよくあります。また、プルアップはバスの速度を制限し、わずかな追加コストがかかります。そのため、一部の設計者は、プルアップを必要としないI3CやSPIなどの他のシリアル バスに目を向けています。
派生技術
I 2 C は、 ACCESS.bus、VESA ディスプレイ データ チャネル(DDC) インターフェイス、システム管理バス(SMBus)、電源管理バス(PMBus)、インテリジェント プラットフォーム管理バス (IPMB、 IPMIのプロトコルの 1 つ)の基礎です。これらのバリアントは、電圧とクロック周波数の範囲が異なり、割り込み ラインを持つ場合があります。
高可用性システム ( AdvancedTCA、MicroTCA ) では、シェルフ管理に 2 ウェイ冗長 I 2 C を使用します。これらのシステムでは、マルチコントローラ I 2 C 機能が必須です。
TWI (2線式インターフェース) または TWSI (2線式シリアルインターフェース) は、Atmelや他のベンダーのさまざまなシステムオンチッププロセッサに実装されているバスと本質的に同じです。[40]ベンダーは、I 2 C が2014-11-07 時点で登録商標ではないにもかかわらず、TWI という名前を使用しています。 [41]商標保護はそれぞれのロゴ (右上隅を参照) に対してのみ存在し、I 2 C の特許は現在失効しています。[要出典] Microchip Technologyによると、TWI と I2C にはいくつかの違いがあります。その 1 つは、TWI が START バイトをサポートしていないことです。[42]
場合によっては、「2 線式インターフェイス」という用語の使用は、I 2 C 仕様の実装が不完全であることを示します。アービトレーションやクロック ストレッチをサポートしていないことは一般的な制限の 1 つですが、クロックをストレッチしない単純なターゲットと通信する単一のコントローラには依然として役立ちます。
MIPI I3Cセンサーインターフェース規格(I3C)は、2017年に開発が進められているI2Cの発展型である。 [43]
改訂
参照
参考文献
- ^ 「Financial Press Releases-NXP」. investors.nxp.com . 2018年4月29日閲覧。
- ^ “MCP23008”. Microchip . 2021年5月26日. 2021年5月26日時点のオリジナルよりアーカイブ。
- ^ abcde 「I2Cバス仕様 Rev 7」(PDF)。NXP Semiconductors。2021年10月1日。2022年10月6日時点のオリジナル(PDF)よりアーカイブ。
- ^ 「7 ビット、8 ビット、および 10 ビットの I2C スレーブ アドレス指定」。Total Phase。2013年 6 月 1 日のオリジナルからアーカイブ。2018年 4 月 29 日に取得。
- ^ 「8-Kbit serial I2C bus EEPROM (PDF)」(PDF) 。STMicroelectronics。 2017年10月。 2019年10月18日時点のオリジナルよりアーカイブ(PDF) 。2019年11月19日閲覧。
- ^ ZONE_READ および ZONE_WRITE プロトコルの使用(PDF) (アプリケーション ノート)。リビジョン 1.0.1。システム管理インターフェイス フォーラム。2016 年 1 月 7 日。AN001。2017年 9 月 22 日にオリジナルからアーカイブ(PDF) 。
- ^ 「決定的な I2C ピン配置のガイダンスはありますか? 「標準」を探しているわけではありません」。StackExchange。
- ^ NXP アプリケーション ノート AN11075: PCA9605 を使用したツイスト ペア ケーブル経由の I2C バス信号の駆動(PDF) 、2017-08-16、2017-08-16のオリジナル(PDF)からアーカイブ
- ^ Vasquez, Joshua (2017-08-16) 「Taking the leap off board: An introduction to I2C over long wires」、2017-08-16 のオリジナルからアーカイブ
- ^ iPack Stackable Board Format、2017-08-19、2017-08-19のオリジナルからアーカイブ
- ^フェラーリ、マリオ; フェラーリ、ジュリオ ( 2018-04-29 ). LEGO Mindstorms NXT を使ったロボット作り。Syngress。pp. 63– 64。ISBN 97800805543342018年4月29日時点のオリジナルよりアーカイブ。
- ^ Gasperi, Michael; Hurbain, Philippe (2010)、「第 13 章: I2C バス通信」、Extreme NXT: LEGO MINDSTORMS NXT を次のレベルに拡張、ISBN 9781430224549
- ^ Philo. 「NXT コネクタ プラグ」 2017 年 8 月 20 日にWayback Machineにアーカイブ
- ^ Sivan Toledo. 「I2C インターフェース パート 1: デジタル I/O ポートの追加」2017 年 8 月 12 日にWayback Machineにアーカイブ。2006 年
- ^ 「Cat5 ケーブルで I2C を確実に送信する」2017-08-18 に Wayback Machineでアーカイブ
- ^ 「I2C バス コネクタとケーブル」 2017-08-18 にWayback Machineでアーカイブ
- ^ 「複数の I2C バス · Testato/SoftwareWire Wiki」。GitHub。
- ^ 「I2C バスの共有 | Microchip」。
- ^ 「I2C アドレス割り当て表」(PDF) (選択ガイド)。Philips Semiconductors。1999年 8 月 24 日。2017年 10 月 16 日のオリジナル(PDF)からアーカイブ。2017年 10 月 1 日に取得。
- ^ データ ハンドブック IC12: I2C 周辺機器、Philips 注文コード 9397 750 00306
- ^ 「System Management Bus (SMBus) 仕様」(PDF)。バージョン 3.0。System Management Interface Forum。2014 年 12 月 20 日。pp. 81 ~ 82。2016年 1 月 29 日のオリジナルからアーカイブ(PDF) 。2017 年 12 月 1 日に取得。
- ^ ab 「 VESAディスプレイ データ チャネル コマンド インターフェイス (DDC/CI) 標準」(PDF)。バージョン 1.1。VESA。2004年 10 月 29 日。pp. 15 ~ 16。2016年 9 月 9 日にオリジナルからアーカイブ(PDF)されました。2017年 12 月 1 日に取得。
- ^ 「インテリジェント プラットフォーム管理インターフェイス仕様第 2 世代 V2.0」(PDF)。ドキュメント リビジョン 1.1。Intel、NEC、Hewlett-Packard、Dell。2013 年 10 月 1 日。p. 563。2016年 3 月 27 日にオリジナルからアーカイブ(PDF) 。2017年 12 月 1 日に取得。BMC
のスレーブ アドレスの 7 ビット部分は 0010_000b です。
- ^ TWI マスター ビット バンド ドライバー; Atmel; 2012 年 7 月 Archived 2017-03-29 at the Wayback Machine .
- ^ i2c.resource コンポーネントAmigaOS 4.x のWayback Machineで 2011-07-24 にアーカイブされました。
- ^ テオ・デ・ラート(2015-05-29)。 「/sys/dev/i2c/i2c_scan.c#probe_val」。スーパーユーザーの BSD クロスリファレンス。OpenBSD 。2019年3月4日に取得。
static u_int8_t probe_val[256]; - ^ Constantine A. Murenin (2010-05-21). 「5.2. i2c_scan.c による I 2 C バス スキャン」。OpenBSD ハードウェア センサー — 環境モニタリングとファン制御 ( MMath論文)。ウォータールー大学: UWSpace。hdl : 10012/5234。ドキュメント ID: ab71498b6b1a60ff817b29d56997a418。
- ^ I2C 経由の HID の紹介
- ^ https://docs.zephyrproject.org/latest/hardware/peripherals/i2c.html
- ^ https://hackaday.com/2022/05/04/the-connector-zoo-i2c-ecosystems/
- ^ https://www.sparkfun.com/qwiic
- ^ 「Qwiic Connect System — よくある質問」www.sparkfun.com . SparkFun Electronics . 2024年12月20日閲覧。
- ^ https://learn.adafruit.com/introducing-adafruit-stemma-qt
- ^ https://www.cable-tester.com/i2c-pin-out-grove-from-seeed-studio/
- ^ https://www.cable-tester.com/i2c-pin-out-from-gravity-dfrobot/
- ^ Linear Technology の LTC4151 (2017-08-09 にアーカイブ)には、アドレス選択用のピンが 2 つあり、各ピンをハイまたはローに接続したり、未接続のままにしたりすることができ、9 つの異なるアドレスが提供されます。
- ^ Maxim の MAX7314 Archived 2017-07-13 at the Wayback Machineには、アドレス選択用のピンが 1 つあり、ハイまたはローに接続するか、SDA または SCL に接続して、4 つの異なるアドレスを提供します。
- ^ TI の UCD9224 Archived 2017-11-07 at the Wayback Machine は、それぞれ 12 レベルを識別する 2 つの ADC チャネルを使用して、有効な 7 ビット アドレスを選択します。
- ^ Delvare, Jean (2005-08-16). 「Re: [PATCH 4/5] i2c_probe_device と i2c_remove_device を追加」. linux-kernel (メーリング リスト). 2016-08-17 にオリジナルからアーカイブされました。
- ^ avr-libc: 2線式インターフェース (TWI) を使用した例。Wayback Machineで 2007-05-27 にアーカイブされています。
- ^ 「TESS -- エラー」。tmsearch.uspto.gov 。 2018年4月29日閲覧。[永久リンク切れ ]
- ^ 「TWI とは何か? I2C 通信用に TWI を構成する方法」(PDF)。Microchip Technology。2018 年。
- ^ Thornton, Scott (2017-11-29). 「改良されたインターインテグレーテッド回路 (I3C)」.マイクロコントローラのヒント. 2018-02-03 のオリジナルからアーカイブ。
- ^ 米国特許 4689740、「多数のステーションを相互接続するためのクロック線とデータ線を含む 2 線式バス システム」、1987 年 8 月 25 日発行、US Philips Corporation に譲渡
- ^ 「フィリップスがI2Cバス特許侵害でさらに8社を訴える」EE Times 2001年10月17日。2021年4月2日時点のオリジナルよりアーカイブ。
- ^ I2C バス仕様 Rev 2.0; Philips Semiconductors; 1998 年 12 月; アーカイブ済み。
- ^ I2C バス仕様 Rev 2.1; Philips Semiconductors; 2000 年 1 月; アーカイブ済み。
- ^ I2C バス仕様 Rev 3; NXP Semiconductors; 2007 年 6 月 19 日; アーカイブ済み。
- ^ I2C バス仕様 Rev 4; NXP Semiconductors; 2012 年 2 月 13 日; アーカイブ済み。
- ^ I2C バス仕様 Rev 5; NXP Semiconductors; 2012 年 10 月 9 日; アーカイブ済み。
- ^ 「I2Cバス仕様 Rev 6」(PDF) 。NXP Semiconductors。2014年4月4日。2021年4月26日時点のオリジナル(PDF)からアーカイブ。
さらに読む
- Himpe, Vincent (2011)。I 2 C バスのマスター。Elektor International Media。ISBN 978-0-905705-98-9。(248ページ)
- パレット、ドミニク (1997)。I2Cバス: 理論から実践まで。Wiley。ISBN 978-0-471-96268-7。(314ページ)
外部リンク
- 公式 I2C 仕様 Rev 6 (無料) - NXP
- 詳細な I2C の紹介と入門
- I2C プルアップ抵抗の計算 - TI
- I2C プルアップ抵抗の変化による影響 (9 種類の異なるプルアップ抵抗を持つ 5V I2C のスコープ キャプチャ)
