科学・計算関連

I2Cとは?通信の仕組み・規格・プロトコルをわかりやすく解説(SDA・SCL・オープンドレイン・マスター・スレーブ・データ転送・クロック・信号・通信速度・アドレス・信号条件・スタート・ストップ・ACK・NACK・名称の由来・読み方)

I2C通信の概要
当サイトでは記事内に広告を含みます
技術ブログ特化メルマガはこちら

I2Cは、センサー、メモリー、表示器、マイコンなどを少ない配線で接続するために広く使われるシリアル通信方式です。

電子工作から組み込み機器の製品開発まで登場する規格ですが、SDAやSCL、ACK、オープンドレインといった言葉が多く、最初は信号の流れをつかみにくいかもしれません。

この記事では、I2C通信の基本構造とデータ転送のルールを、配線、アドレス、通信速度、信号条件の順にわかりやすく整理します。

読み方や名称の由来も確認しながら、回路設計やプログラム作成で迷いやすいポイントまで見通せる内容を目指します。

I2C通信の概要

I2C通信の概要

それではまずI2C通信の概要について解説していきます。

I2Cの意味と読み方

I2CはInter Integrated Circuitの略称で、一般にはアイツーシー、またはアイアイシーと読まれます。

正式表記ではIの後に上付きの2を置くI²Cが使われることもありますが、ソースコード、部品表、技術資料ではI2Cと記載されるのが一般的です。

名称には、同じ電子機器の内部にあるIC同士を相互接続するという目的が表れています。

もともとはフィリップス社が提案した通信バスであり、現在では多くの半導体メーカーが対応デバイスを提供しています。

センサー用IC、RTC、EEPROM、ADコンバーター、OLED表示器など、低速から中速の制御データをやり取りする部品で特によく見られる方式です。

二本の信号線による接続

I2Cでは、基本的にSDAとSCLという二本の信号線を複数のデバイスで共有します。

SDAはSerial Dataの略で、アドレスや送受信データを運ぶ線です。

SCLはSerial Clockの略で、データを読み取るタイミングを決めるクロック信号を運びます。

電源線とGNDは別途必要ですが、通信専用線が二本で済むため、端子数や配線量を抑えやすい点が大きな特徴でしょう。

信号名 役割 主な内容
SDA データ信号 アドレス、読み書き指定、データ、ACKやNACK
SCL クロック信号 ビットの区切りと通信タイミング
GND 基準電位 各デバイス間の電圧基準
VDD 電源 ICの動作電圧とプルアップ電圧

ただし、二本だけで接続できるからといって、どの長さでも安定通信できるわけではありません。

配線容量、ノイズ、プルアップ抵抗、電圧レベルを考慮する必要があります。

マスターとスレーブの関係

I2C通信では、通信の開始とクロックの生成を担当する側をマスター、呼び出されて応答する側をスレーブと呼びます。

近年はコントローラーとターゲットという呼び方も使われますが、資料やライブラリーにはマスターとスレーブの用語が多く残っています。

典型的な構成では、マイコンがマスターとなり、温湿度センサーや外部メモリーがスレーブになります。

マスターは通信したい相手のアドレスを送信し、スレーブは自分のアドレスと一致した場合に応答する仕組みです。

I2Cでは、一台のマスターに対して複数のスレーブを同じSDAとSCLへ接続できます。

部品ごとに専用の通信線を増やさずに済むことが、I2Cが多用される理由の一つです。

SDAとSCLの信号条件

続いてはSDAとSCLの信号条件を確認していきます。

オープンドレイン出力

I2CのSDAとSCLは、通常のプッシュプル出力ではなく、オープンドレインまたはオープンコレクターの考え方で扱われます。

各デバイスは信号線をLowへ引き下げることはできますが、自分からHighを出力するのではなく、プルアップ抵抗によってHighへ戻します。

この構造により、複数のICが同じ線につながっていても、HighとLowを強くぶつけ合う危険を抑えられます。

誰か一台でもLowを出力すれば、バス全体はLowになります。

全員が線を解放したときだけ、抵抗を通じてHighになる仕組みです。

プルアップ抵抗の役割

プルアップ抵抗は、SDAとSCLを電源電圧へ弱く接続するための抵抗です。

これがなければ、デバイスがLowを出力していないときの信号線は電位が定まらず、正常な通信ができません。

抵抗値を大きくしすぎると、LowからHighへ戻る立ち上がりが遅くなります。

反対に小さくしすぎると、Lowを出力するICに流れる電流が増え、消費電力や許容電流の面で不利になります。

プルアップ抵抗の選定では、配線容量と目標通信速度を確認します。

通信速度を上げるほど、信号を十分な速さでHighへ戻せる抵抗値が求められます。

開発ボードにはプルアップ抵抗があらかじめ実装されていることも多いため、複数のモジュールを接続すると抵抗が並列になりすぎる場合があります。

回路図を確認し、バス全体での合成抵抗値を見る習慣が重要です。

HighとLowの判定条件

I2Cでは、LowとHighの電圧範囲、立ち上がり時間、立ち下がり時間、保持時間などが規格で定められています。

マイコンが3.3V動作で、周辺ICが5V動作の場合には、単純に同じバスへ接続できるとは限りません。

プルアップ先の電圧によっては、3.3V系マイコンの端子に過大な電圧が加わる可能性があります。

I2Cの信号電圧はプルアップ電圧で決まるため、デバイスごとの入出力許容範囲を必ず確認しましょう。

通信が不安定な場合は、ソフトウェアだけでなく、電圧、GND接続、プルアップ抵抗、配線長、配線容量を順番に点検することが有効です。

波形をオシロスコープで見ると、立ち上がり不足やノイズの影響を見つけやすくなります。

スタートとストップの信号手順

続いてはスタートとストップの信号手順を確認していきます。

スタートコンディション

I2Cでは、SCLがHighの状態でSDAがHighからLowへ変化すると、スタートコンディションとして認識されます。

これはバス上の全デバイスに対して、これから通信が始まることを知らせる合図です。

通常のデータ転送中は、SCLがHighの期間にSDAを変化させません。

そのため、SCLがHighのときのSDAの変化には特別な意味があり、スタートやストップを区別できます。

通信中にもう一度スタートコンディションを発生させる操作は、リピーテッドスタートと呼ばれます。

ストップコンディション

ストップコンディションは、SCLがHighの状態でSDAがLowからHighへ変化する信号です。

この信号によって、バスが使用中の状態から待機状態へ戻ります。

ストップを受け取ったスレーブは、次のアドレス送信を待つ状態になります。

読み出しと書き込みを連続させる場合には、途中でストップを送らず、リピーテッドスタートを使うデバイスもあります。

レジスターアドレスを指定してから値を読み出すセンサーでは、この手順がよく使われます。

データビットの転送タイミング

I2Cのデータは、基本的に8ビット単位で送られます。

SDAのデータはSCLがLowの期間に設定され、SCLがHighの期間に受信側が読み取ります。

最上位ビットから送るMSBファーストが標準です。

基本的な流れは、スタート、アドレスと読み書き指定、ACK、データ八ビット、ACKまたはNACK、ストップとなります。

データの後には必ず応答用の一ビットが追加されるため、一つのデータ単位は実質的に九クロックで進みます。

このタイミングを理解すると、ロジックアナライザーで取得した波形や通信ログを読みやすくなります。

SCLがHighの間にSDAを変えてはいけないという原則は、スタートとストップを除く基本ルールです。

アドレスとデータ転送

続いてはアドレスとデータ転送を確認していきます。

七ビットアドレスと十ビットアドレス

I2Cで広く使われるのは七ビットアドレスです。

マスターは、七ビットのスレーブアドレスに続けて、読み出しか書き込みかを示す一ビットを送信します。

データシートにはアドレスが十六進数で記載されますが、読み書きビットを含む表記と含まない表記があるため注意が必要です。

表記の種類 内容 確認ポイント
七ビットアドレス スレーブ本来の識別番号 多くのライブラリーで指定する値
送信バイト表記 七ビットアドレスにR/Wビットを加えた値 データシートの例で使われやすい値
十ビットアドレス より多くの機器を識別する拡張方式 対応するマイコンとICが必要

例えば、資料に書き込み時の値として示された数値を、そのままライブラリーへ渡すと通信に失敗することがあります。

使用するAPIが七ビットアドレスを要求するのかを、最初に確認しましょう。

書き込み通信の流れ

書き込み通信では、マスターがスタートを送った後、スレーブアドレスと書き込み指定を送信します。

対象スレーブが存在し、受信可能であればACKを返します。

続いて、レジスターアドレスや設定値などのデータを送り、そのたびにスレーブからACKを受け取ります。

最後にマスターがストップを送ることで、一連の書き込みは完了です。

温度センサーの測定周期を設定する場合は、スレーブアドレス、設定レジスター番号、設定データの順に送る構成が代表例です。

実際の並び順やデータ長はICごとに異なるため、必ずデータシートの通信例を参照します。

読み出し通信の流れ

読み出し通信では、最初に読みたいレジスターの位置を指定してから、データ受信へ移る場合が多くあります。

まず書き込み指定でレジスターアドレスを送り、リピーテッドスタートの後に読み出し指定を送信します。

スレーブはデータを送信し、マスターは続きのデータが必要ならACKを返します。

最終バイトを受け取ったときは、マスターがNACKを返して受信終了を伝え、その後にストップを送ります。

このNACKは異常ではなく、必要なデータを受信し終えたという正常な合図として使われる点が重要です。

ACKとNACKの応答方式

続いてはACKとNACKの応答方式を確認していきます。

ACKの意味

ACKはAcknowledgeの略で、アクノリッジ、またはアックと呼ばれます。

送信側が八ビットを送った後、九番目のクロックで受信側がSDAをLowに引き下げると、ACKが成立します。

これは、データを受け取れたこと、またはアドレスに応答するデバイスが存在することを示す信号です。

アドレス送信直後のACKが得られない場合、配線ミス、アドレス違い、電源未投入、バス電圧不一致などが疑われます。

NACKの意味

NACKはNot Acknowledgeの略で、ナックと呼ばれます。

九番目のクロックでSDAがHighのままなら、送信側はNACKを受け取ったと判断します。

スレーブがアドレスへ応答しない場合のほか、受信側が追加データを受け取れない場合にもNACKが使われます。

読み出しの最後にマスターがNACKを返すのは、次のバイトを送らなくてよいとスレーブへ伝えるためです。

ACKは受信確認、NACKは非応答または受信終了の意思表示として働きます。

NACKが出た場所を確認すると、アドレス、レジスター指定、データ転送のどこで問題が起きたかを絞り込みやすくなります。

通信エラーの確認項目

I2Cが動かないときは、まずSDAとSCLの配線が入れ替わっていないかを確認します。

次に、GNDが共通になっているか、プルアップ抵抗が存在するか、電源電圧が適切かを見ます。

アドレス設定ピンを持つセンサーでは、ピンの接続状態によってアドレスが変わることもあります。

ライブラリーの初期化順序、通信速度、レジスター番号、送信データの並び順も確認対象です。

NACKは原因ではなく、通信相手が期待どおりに応答できなかった結果と考えると、落ち着いて切り分けられるでしょう。

通信速度と規格の種類

続いては通信速度と規格の種類を確認していきます。

標準モードと高速モード

I2Cには複数の通信速度モードがあり、代表的なものとして標準モード、ファストモード、ファストモードプラス、高速モードがあります。

標準モードはおおむね100kHz、ファストモードは400kHzで使われます。

マイコンの設定画面やライブラリーで100000や400000という値を見るのは、このクロック周波数を示しているためです。

モード 代表的な最大クロック 主な用途
標準モード 100kHz 一般的なセンサーや低速制御
ファストモード 400kHz 比較的多いデータ転送や表示制御
ファストモードプラス 1MHz 対応部品による高速な制御通信
高速モード 3.4MHz 高速対応デバイスを使う構成

ただし、バス上に接続するすべてのデバイスが、その速度へ対応している必要があります。

一台でも100kHzまでしか対応しないICがあれば、全体はその条件に合わせるのが安全です。

クロックストレッチの仕組み

スレーブは処理時間が必要な場合に、SCLをLowのまま保持してマスターを待たせることがあります。

この仕組みはクロックストレッチと呼ばれます。

たとえば内部変換やメモリー処理が終わっていない場合に、スレーブが一時的に通信速度を調整できます。

一方で、すべてのマイコンやソフトウェア実装がクロックストレッチへ十分対応しているとは限りません。

特定のデバイスだけ通信が止まる場合は、対応状況とタイムアウト設定を確認するとよいでしょう。

配線長とバス容量

I2Cは基板内や機器内部の比較的短い配線を想定した通信方式です。

ケーブルを長くすると寄生容量や外来ノイズが増え、Highへの立ち上がりが遅くなったり、誤ったビットを読んだりする恐れがあります。

通信速度を下げる、配線を短くする、適切なプルアップ抵抗へ調整するなどが基本的な対策になります。

I2Cは長距離通信向けの規格ではないため、離れた装置間を接続する用途では、CAN、RS-485、UART変換なども検討対象です。

同じ基板上でも、SDAとSCLをノイズ源の近くへ長く引き回さないようにすると、安定性の向上につながります。

I2C通信のまとめ

I2CはSDAとSCLの二本を共有し、複数のICを接続できるシリアル通信方式です。

マスターがスタート信号を出し、アドレスで相手を指定し、クロックに合わせてデータを送受信します。

オープンドレイン方式とプルアップ抵抗によって、一つのバスを複数デバイスで安全に共有できる点が特徴です。

通信を理解するうえでは、スタート、ストップ、アドレス、ACK、NACKの役割を順に押さえることが近道になります。

とくにアドレス表記の違い、プルアップ電圧、通信速度の上限は、実装時のつまずきやすいポイントです。

データシートの通信例と波形を照らし合わせながら確認すれば、I2Cの設定や不具合調査をよりスムーズに進められるでしょう。