科学・計算関連

I2Cアドレスとは?7ビットアドレスとスレーブ識別の仕組みを解説!(確認・割り当て)

I2Cアドレスの意味と7ビット識別の基本
当サイトでは記事内に広告を含みます
技術ブログ特化メルマガはこちら

I2Cアドレスとは?7ビットアドレスとスレーブ識別の仕組みを解説!(確認・割り当て)

I2Cは、センサーや表示器、メモリーなどを少ない配線で接続できる代表的な通信方式です。

そのI2Cで各デバイスを呼び分けるために使われる番号が、I2Cアドレスです。

アドレスの表記には7ビット形式と8ビット形式があり、資料やプログラムで数字が異なって見えるため、初めて扱うときには混乱しやすいでしょう。

この記事では、7ビットアドレスの考え方、スレーブの識別方法、確認手順、複数機器を接続するときの割り当てまでを順に説明します。

I2Cアドレスの意味と7ビット識別の基本

I2Cアドレスの意味と7ビット識別の基本

それではまずI2Cアドレスの意味と7ビットアドレスについて解説していきます。

バス上のスレーブを選ぶための番号

I2Cアドレスは、1本の通信バスにつながる複数のスレーブ機器から、通信相手を選ぶための識別番号です。

I2Cでは、マイコンなどのコントローラーが通信の開始時にアドレスを送り、該当する機器だけが応答します。

同じSDA線とSCL線を共有していても、アドレスが異なれば温度センサーとEEPROMを同じバスに接続できます。

SDAはデータを送る線で、SCLは通信のタイミングを合わせるクロック線です。

たとえばマイコン基板に温度センサー、気圧センサー、有機EL表示器を載せる場合、配線を機器ごとに増やさず2本の信号線へ並列に接続できます。

このとき、コントローラーは温度を読みたいときだけ温度センサーのアドレスを指定します。

指定されていない機器は通信に参加せず、SDA線を勝手に操作しません。

I2Cアドレスは機器そのものの名前ではなく、同じI2Cバス内で通信先を選ぶための番号です。

同じ型番の機器でも、設定ピンや内部レジスタによって異なるアドレスに変更できる場合があります。

ただし、アドレスが違っても電源電圧や通信速度の条件まで自動で一致するわけではありません。

接続前には、各部品の動作電圧、プルアップ抵抗の有無、対応するI2Cモードも確認する必要があります。

7ビットアドレスと利用可能な範囲

一般的なI2Cでは、スレーブを表す7ビットアドレスを使います。

7ビットで表現できる値は、2進数で0000000から1111111までの128通りです。

16進数で書くと、00から7Fまでの範囲になります。

しかし、この128通りのすべてを通常の周辺機器に自由に使えるわけではありません。

一部の値は予約済みアドレスとして定められており、一般的なスレーブ機器の割り当てには使わない扱いです。

実務では、部品のデータシートに記載された7ビットアドレスをそのまま確認し、予約領域ではないことも含めて判断します。

たとえばアドレス48の温度センサーは、2進数では1001000です。

この7桁だけで対象機器を示しており、読み出しか書き込みかという情報は含まれていません。

7ビットアドレスの表記例

2進数 1001000

16進数 48

10進数 72

7ビットアドレスそのものは、通信方向を含まない機器識別用の値です。

アドレスの数値を確認するときは、データシートの表見出しが7-bit addressなのか、read addressやwrite addressなのかを必ず見ます。

同じ48という値でも、資料の前提が違えばコードへそのまま書けないことがあるためです。

コントローラーとターゲットの役割

I2Cでは通信を始める側がアドレスを送信し、選ばれたスレーブが応答する仕組みです。

従来の説明では、通信を主導する機器をマスター、応答する周辺機器をスレーブと呼ぶことが多くありました。

近年の仕様や資料では、コントローラーとターゲットという表現も使われます。

呼び方は異なっても、最初にアドレスを出して通信を開始する側と、指定を受けて応答する側という役割は理解しておくと便利です。

温度センサーを読む場面では、マイコンがコントローラー、温度センサーがターゲットになります。

一方で複数コントローラーを扱える構成もあるため、機器の固定的な種類だけで役割が決まるわけではありません。

コントローラーは開始条件を発行した後、アドレスと通信方向をバスへ送ります。

アドレスが一致したターゲットは、次のクロックでACKと呼ばれる応答を返します。

ACKが返らない場合は、配線不良、電源未投入、誤ったアドレス、通信条件の不一致などを疑う流れになります。

アドレス指定の直後にACKが得られるかどうかは、通信先が正しく選ばれたかを確かめる重要な手掛かりです。

ただしACKだけでは、読み出したデータの内容まで正しいとは判断できません。

この役割分担を理解すると、ロジックアナライザーの波形やプログラムの通信エラーも読み解きやすくなります。

アドレス送信と読み書きビットの仕組み

続いてはアドレス送信と読み書きビットの仕組みを確認していきます。

先頭バイトに含まれる通信方向

I2Cの通信開始直後には、7ビットアドレスの後ろへ読み書き方向を示す1ビットを付けて送信します。

この最後の1ビットはR/Wビットと呼ばれ、書き込みでは0、読み出しでは1になります。

そのため、バス上へ最初に流れる情報は合計8ビットです。

ここで重要なのは、8ビットで送られるからといって、機器固有のアドレスが8ビットであるとは限らない点です。

7ビットアドレス48の機器へ書き込む場合、先頭バイトは48を左へ1ビット移動した90になります。

同じ機器から読み出す場合は、最後のビットを1にするため91になります。

この90と91は通信で送るアドレスバイトであり、機器を表す基本アドレスは48です。

7ビットアドレス48の場合

書き込み時 48を左へ1ビット移動して90

読み出し時 90に1を加えて91

48は7ビットアドレス、90と91は通信開始時に送る8ビットの値です。

ライブラリーの関数が7ビット値を受け取る仕様なら、90や91を渡すと別の値として扱われて通信に失敗します。

逆に古い資料で8ビット値だけが示されているときは、右へ1ビット移動して7ビット値へ戻す必要があります。

開始条件とACK応答の流れ

I2Cでは開始条件、アドレスバイト、ACK応答という順序で通信相手を確定します。

バスが待機している状態では、SDAとSCLはどちらも高い電圧レベルです。

SCLが高い状態でSDAが高から低へ変化すると、開始条件として認識されます。

開始条件の後、コントローラーはSCLに合わせてアドレスビットを上位側から送ります。

続けてR/Wビットを送り、9番目のクロックでターゲットからのACKを待ちます。

アドレスが一致した機器は、このACKの区間でSDAを低レベルへ引き下げます。

複数の機器が同じアドレスだった場合は、複数機器が同時に応答する可能性があります。

ACKだけを見ると正常に見えても、後続データの出力が重なり、読み出し値が不安定になることがあります。

基本的な通信順序

開始条件

7ビットアドレス

R/Wビット

ターゲットからのACK

レジスタ番号またはデータ本体

停止条件

停止条件は、SCLが高い状態でSDAが低から高へ変化することで表されます。

この一連の順序を知っておけば、オシロスコープやロジックアナライザーで問題箇所を探す際にも役立つでしょう。

7ビット表記と8ビット表記の読み替え

資料に90や91が書かれている場合は、読み書きビットを含む8ビット表記かどうかを確認することが大切です。

特にデータシートには、Slave Address、Device Address、Write Addressなど、似た名称の欄が並ぶことがあります。

Write Addressが90、Read Addressが91と記載されていれば、7ビットアドレスは48です。

一方、Addressが48とだけ書かれている場合は、多くの場合で7ビットアドレスを示しています。

値を変換するときは、16進数の末尾だけを見て判断せず、ビット構成で確かめると誤りにくくなります。

90は2進数で10010000、91は10010001です。

先頭の7ビット1001000は両方共通で、最後の1ビットだけが異なります。

表記 16進数の値 意味 プログラムでの扱い
7ビットアドレス 48 機器を識別する基本値 多くのI2Cライブラリーへ渡す値
書き込みアドレスバイト 90 48に書き込み指定を付けた値 通常はライブラリー側が生成
読み出しアドレスバイト 91 48に読み出し指定を付けた値 通常はライブラリー側が生成

表記の違いは、機器のアドレスが変化したことを意味しません。

使用する開発環境の公式ドキュメントと、部品のデータシートを同じ基準で見比べることが確実です。

スレーブアドレスの確認方法

続いてはスレーブアドレスの確認方法を確認していきます。

データシートのアドレス表記

スレーブアドレスを確認する最も確実な資料は、接続する部品のデータシートです。

データシートでは、I2C interface、serial interface、device addressなどの章にアドレス情報が載っています。

固定アドレスの部品なら、7ビット形式の値が表や本文で示されます。

設定可能な部品では、A0、A1、A2のようなアドレス選択ピンと、対応するアドレス一覧が掲載されるのが一般的です。

たとえば3本の選択ピンを持つ部品では、各ピンを高または低へ接続する組み合わせにより複数の候補から選べます。

ただし、選択ピンの高低がアドレスビットへそのまま対応するとは限りません。

ピンを未接続にすると、ノイズで状態が不安定になり、意図しないアドレスになるおそれがあります。

アドレス設定ピンは、データシートで指定された電源側またはGND側へ確実に接続します。

基板のシルク印刷やモジュール販売ページだけで決めず、搭載ICの資料も確認する姿勢が重要です。

また、同じモジュールでも製造時期や搭載チップの変更により、設定方法が異なる場合があります。

部品番号を確認してから資料を探すと、別製品の説明を誤って適用する失敗を防げます。

I2Cスキャナーによる検出

I2Cスキャナーは、候補となるアドレスへ順に通信を試み、ACKを返す機器を探すための確認用プログラムです。

マイコン用のサンプルプログラムでは、一般にアドレスを順番に指定して通信開始を試します。

応答があった値をシリアルモニターへ表示すれば、現在バス上で認識されているアドレスを把握できます。

部品を接続した直後にスキャナーを実行すると、配線や電源が正しいかを短時間で点検できます。

温度センサーを48で想定していたのに49が見つかるなら、アドレス選択ピンの接続状態が想定と違う可能性があります。

ただし、スキャナーでACKが返ることは、その機器の全機能が正常である証明にはなりません。

通信速度が低い設定でのみ動作する機器や、初期化後に特定レジスタの設定が必要な機器もあります。

スキャン結果 考えられる状態 次に確認する項目
想定した1件を検出 アドレス応答は正常 レジスタ読書きと測定値
何も検出しない 電源、配線、プルアップ、アドレスの問題 SDA、SCL、GNDの接続
想定外の値を検出 設定ピンまたは資料の表記違い 7ビットと8ビットの区別
複数の値を検出 複数機器の接続、または別モジュールの存在 配線構成と部品一覧

スキャナーの結果は、7ビット表記で出力されることが多いものの、使用するコードの表示方法は事前に確認しましょう。

問題の切り分けでは、接続機器を1個に減らしてから再度スキャンする方法も有効です。

波形観測による通信状態の判断

スキャナーで原因が分からないときは、SDAとSCLの波形を観測すると通信のどこで止まっているかを判断できます。

ロジックアナライザーは、I2Cとして信号を復号し、アドレス、R/Wビット、ACK、データを画面上へ表示できる計測器です。

オシロスコープでも、開始条件やクロック信号の有無、電圧レベル、立ち上がり時間を確認できます。

開始条件の後にアドレスが送られていてACKがなければ、まずアドレス設定か接続先の電源を見直します。

SCLがまったく動かない場合は、プログラムの初期化漏れや、別の機能へピンが割り当てられている状態も考えられます。

SDAが低いまま戻らない場合は、配線短絡、故障、通信途中でバスを保持した機器などが候補です。

I2Cはオープンドレイン方式を使うため、信号を高レベルに戻すプルアップ抵抗が必要です。

プルアップがなければ高レベルが形成されず、波形が不安定になって通信できません。

一方で、複数モジュールのプルアップ抵抗をそのまま重ねると、合成抵抗が低くなりすぎることがあります。

波形の確認ではアドレスだけでなく、電圧の振幅と立ち上がり形状も見ると原因を絞り込みやすくなります。

複数デバイスにおけるアドレス割り当て

続いては複数デバイスにおけるアドレス割り当てを確認していきます。

アドレス重複による通信不良

同一I2Cバス内で同じアドレスの機器を複数接続すると、個別に選択できないため正常な通信が難しくなります。

同じアドレスを持つ2個の温度センサーを並列に接続すると、コントローラーがそのアドレスを指定したときに両方が応答します。

書き込みでは両方へ同じ設定が入る可能性があります。

読み出しでは、両方の機器がSDA線へデータを出そうとするため、値が壊れたり、片方の状態に依存した不規則な結果になったりします。

偶然同じデータを返す場面もあるため、一見すると動いているように見えるのが厄介な点です。

量産前の試作では1個だけで正常だったのに、同型センサーを増設した瞬間に問題が出る場合は、重複を最初に疑うとよいでしょう。

アドレスが一致しているかは、データシートの初期値と設定ピンの実装状態を一覧化して確認します。

モジュール上のジャンパーを切断または半田付けして変更する製品では、作業後の導通確認も必要です。

機器の名前や接続順序は、I2C上の識別には使われません。

バスに参加する各機器が異なるアドレスを持つことが、基本条件になります。

設定ピンと内部設定による変更

アドレスを変更できる機器では、設定ピン、ジャンパー、または内部レジスタを使って重複を避けます。

設定ピン方式は、A0やADDRといった端子をGNDまたは電源へ接続して、起動時からアドレスを決める方法です。

基板上のはんだジャンパーは、この設定ピンの接続先を切り替えるために使われます。

ピンの組み合わせとアドレスの対応は製品ごとに異なるので、別の部品で使った規則を流用してはいけません。

内部レジスタ方式では、通信で設定を書き込んだ後にアドレスを変更できるものもあります。

ただし、変更直後にどのアドレスへ切り替わるか、電源を切ると初期値へ戻るかは部品によって違います。

設定中に複数機器が同じ初期アドレスなら、個別に変更するために1個ずつ接続する必要があります。

変更方法 設定する時期 利点 注意点
アドレス設定ピン 配線、基板組み立て時 起動直後から識別可能 選択できる数が限られる
はんだジャンパー 基板実装時、改造時 小型モジュールでも変更可能 設定状態を外観だけで誤認しやすい
内部レジスタ 初期化プログラム実行時 配線変更を減らせる 初期アドレスの重複回避が必要
I2Cマルチプレクサ 回路設計時 同一アドレスの機器を分離できる 制御手順と部品が増える

設計資料には、実装したアドレス値と設定方法を残しておくと、後から基板を保守するときに役立ちます。

特に同型機器を複数使う装置では、基板番号とアドレスの対応表を作ると作業ミスを減らせます。

マルチプレクサを使ったバス分離

アドレスを変更できない同一機器を複数使う場合は、I2Cマルチプレクサでバスを分ける方法があります。

I2Cマルチプレクサは、コントローラー側の1本のI2Cバスを複数の下流バスへ切り替える部品です。

コントローラーはまずマルチプレクサのアドレスを指定し、使用する下流チャネルを選択します。

その後、選んだチャネル上にあるセンサーへ通常どおりのアドレスで通信します。

別のチャネルに同じアドレスのセンサーがあっても、同時にはバスへ接続されないため、個別に制御できます。

たとえば同一アドレス固定の距離センサーを4か所に配置したい場合、各センサーを別チャネルへつなぐ構成が考えられます。

この方法は、距離の離れた機器ごとの配線容量を分けたい場合にも役立ちます。

一方で、読み出す前にチャネル選択を行う処理が増えるため、プログラムの管理は少し複雑になります。

マルチプレクサ自身にもI2Cアドレスがあるため、上流バスで他機器と重複しないように設計します。

アドレスを変更できるなら設定ピンだけで済むこともあるため、必要な台数と将来の増設計画を比べて選びましょう。

I2C通信の実装時に見る注意点

続いてはI2C通信の実装時に見る注意点を確認していきます。

ライブラリーごとのアドレス指定

プログラムでは、使用するライブラリーが7ビットアドレスと8ビットアドレスのどちらを受け取るかを確認します。

Arduino系のWireライブラリーでは、一般に7ビットアドレスを指定します。

そのため、データシートに書き込みアドレス90と読み出しアドレス91が示されていても、関数へ渡す値は48です。

LinuxのI2C関連ツールや多くの組み込み向けライブラリーでも、7ビット表記を使うことが一般的です。

ただし、古いドライバー、独自ライブラリー、特定の通信IC向けAPIでは、送信バイト全体を指定する設計もあります。

コード例を別の環境へ移植するときは、数値だけをコピーせず、関数の引数仕様を確認しましょう。

7ビット指定を使う一般的な考え方

データシートの7ビットアドレスが48なら、プログラムにも48を指定します。

ライブラリーが通信開始時に、書き込み用90または読み出し用91を自動で作ります。

アドレスを16進数で書くか10進数で書くかは、値が同じなら通信結果へ影響しません。

ただし、周辺機器の資料が16進数中心なら、コードや設計書でも16進数に統一すると照合しやすくなります。

通信速度と電気的条件

正しいアドレスを指定しても、通信速度や電圧条件が合わなければI2C通信は安定しません。

I2Cには100 kHz級の標準モードや400 kHz級の高速モードなどがあり、対応範囲は部品ごとに異なります。

すべての接続機器が高速モードへ対応しているとは限らないため、最も制約の大きい機器に合わせて設定します。

また、SDAとSCLはオープンドレイン出力であるため、通常は電源側へ引き上げるプルアップ抵抗を使います。

配線が長いほど容量が増え、信号の立ち上がりが遅くなります。

立ち上がりが遅い状態で通信速度だけを上げると、ビット判定の余裕が小さくなり、アドレス認識に失敗することがあります。

3.3 V専用の部品へ5 Vのプルアップを接続すると、アドレス以前に電気的な損傷につながるおそれがあります。

異なる電圧系を接続する場合は、入出力の耐圧とレベル変換の要否を確認します。

短い配線で低い速度から試し、通信が安定してから必要な条件へ広げると、原因の切り分けがしやすくなります。

予約アドレスと10ビットアドレス

7ビットアドレスには予約済みの値があり、特殊用途の10ビットアドレスという拡張方式も存在します。

予約アドレスは、一般の周辺機器を識別するために勝手に割り当てるものではありません。

部品メーカーが通常のI2Cデバイスとして提供する製品なら、データシートに安全な既定アドレスや選択範囲が示されています。

自作のI2Cターゲットを設計する場合も、予約領域を避けることが必要です。

10ビットアドレスは、7ビット形式より多くの機器を識別できる方式です。

ただし、通信開始時の手順が異なり、対応していないコントローラーやライブラリーもあります。

一般的なセンサーや表示器を扱う工作では、7ビットアドレスだけで十分なケースがほとんどです。

10ビット対応を前提にすると、部品選定、ドライバー、計測器の復号設定まで確認範囲が広がります。

特別な理由がない限りは、標準的な7ビット対応機器を選び、アドレス設定やマルチプレクサで構成するほうが扱いやすいでしょう。

I2Cアドレスとスレーブ識別のまとめ

I2Cアドレスは、共有されたSDA線とSCL線の中から通信したいスレーブ機器を選ぶための識別番号です。

一般的に使うのは7ビットアドレスであり、読み出しと書き込みを示すR/Wビットは別に付加されます。

7ビット値48に対して、通信時の書き込みバイトが90、読み出しバイトが91となる関係を理解すると、資料とコードの数字の違いを整理できます。

アドレスはまずデータシートで確認し、必要に応じてI2Cスキャナーや波形観測で実際の応答を調べます。

複数機器を同じバスへ接続するときは、同一アドレスの重複を避けることが欠かせません。

設定ピン、ジャンパー、内部設定、I2Cマルチプレクサを状況に応じて使い分けましょう。

さらに、通信速度、プルアップ抵抗、電圧レベルも確認すれば、アドレスだけでは見つからない不具合を防ぎやすくなります。

接続する部品の7ビット表記を一覧にし、1台ずつスキャンしてから組み合わせる手順で、落ち着いて確認してみてください。