シリアルバス(I2C・SPI・UART)
基板上のチップ間配線に迷わなくなる。I2C・SPI・UART の信号線・速度・配線数・同期非同期を原理から並べ、どれをいつ選ぶかを判断できるようになる。
- 1.UART はクロック線を持たない非同期。両端が同じボーレートを事前合意し、スタート/ストップビットで1バイトずつ同期を取り直す2線(TX/RX)の1対1通信。
- 2.SPI はクロック線を持つ同期。SCLK/MOSI/MISO の共有3線+スレーブ毎の CS で全二重・高速だが、スレーブが増えると CS 線が増える。
- 3.I2C はクロック線を持つ同期。SDA/SCL の2線だけで7ビットアドレスにより多デバイスをぶら下げられるが、半二重・オープンドレインで速度は控えめ。
チップ間をつなぐ3つの近距離バス
1枚の基板に載ったマイコン・センサ・EEPROM・ディスプレイは、互いに配線でつながって通信します。ここで多数のピンを使う並列バスは配線が太くなりすぎるため、近距離では 数本の線でビットを時系列に送るシリアルバス が主流です。その代表が UART・SPI・I2C の3つで、いずれも「基板内〜せいぜい数十cm」を想定した低速〜中速の相互接続です。
3者を分ける最も本質的な軸は クロック線を共有するか(同期)/しないか(非同期) と、接続トポロジ(1対1か、複数デバイスをぶら下げるか) です。この2軸を押さえると、信号線数・速度・アドレッシングの違いはすべてそこから導けます。
UART:クロックを持たない非同期通信
UART(Universal Asynchronous Receiver/Transmitter)は、送信 TX と受信 RX の2本だけで結ぶ1対1の全二重通信です(相手の TX を自分の RX へ、たすき掛けで結線)。最大の特徴は クロック線が無い こと。受信側は送られてくる信号のエッジからタイミングを推定するしかありません。
そのため両端はあらかじめ ボーレート(例:9600・115200 bps)を合意しておきます。回線はアイドル時に High で、送信は必ず1本の Low の スタートビット で始まります。受信側はこの立ち下がりを検知して内部で時計を起動し、1ビット時間の中央付近を狙って TX を等間隔にサンプリングします。データビット(通常8ビット、LSB ファースト)の後に任意のパリティビット、最後に1本以上の High の ストップビット が続きます。
UART 1フレーム(8N1: データ8, パリティなし, ストップ1):
アイドル D0 D1 D2 D3 D4 D5 D6 D7 アイドル
──High──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐ ┌──High──
└──┘ │ │ │ │ │ │ │ └──┘
Start └─── 8 データビット(LSB先) ───┘ Stop
立ち下がりで受信側クロック始動 → 各ビット中央をサンプル
このスタート/ストップにより、フレームごとに同期を取り直すので、送信側と受信側のクロックが完全一致していなくても通信できます。ただし1フレーム分の間はズレが蓄積するため、両端のクロック誤差はおおむね数%以内に収める必要があります。またクロックを送らない分、フレームあたり2ビット以上(スタート+ストップ)のオーバーヘッドが常に乗ります。
UART はロジックレベル(0/3.3V など)の信号フォーマットそのものを指し、RS-232 はそれを±数Vへ電圧変換した物理規格です。UART の「スタート/ストップで区切る」方式は調歩同期(start-stop)方式と呼ばれ、非同期でありながらフレーム内は自己同期する仕組みになっています。
SPI:クロックを共有する高速同期通信
SPI(Serial Peripheral Interface)は専用クロック線 SCLK を持つ同期方式です。マスタが SCLK を叩き、その各エッジに合わせてデータを1ビットずつ動かすため、受信側はタイミングを推定する必要がなく、数十MHz級の高速化が容易です。信号線は次の4本が基本です。
| 信号線 | 方向 | 役割 |
|---|---|---|
| SCLK | マスタ→スレーブ | クロック。全ビットの転送タイミングを供給 |
| MOSI | マスタ→スレーブ | マスタが送るデータ(Master Out Slave In) |
| MISO | スレーブ→マスタ | スレーブが返すデータ(Master In Slave Out) |
| CS/SS | マスタ→スレーブ | チップ選択。Low の間だけ当該スレーブが応答(デバイス毎に1本) |
MOSI と MISO が独立しているため 全二重(送受信同時)です。動作は単純なシフトレジスタの交換で、マスタが1クロック出すたびにマスタとスレーブのレジスタが1ビットずつ押し出し合い、8クロックで1バイトを相互に交換します。クロックの極性(CPOL)と位相(CPHA)の組み合わせで4つの モード(0〜3) があり、送受で一致させないとビットがずれます。
複数スレーブは、SCLK・MOSI・MISO の3線を共有しつつ CS を1本ずつ追加 して選びます。したがってスレーブが N 台なら線は 3 + N 本必要で、デバイスが増えるほど CS ピンを消費するのが弱点です。アドレスの概念は無く、選択は純粋に「どの CS を Low にするか」で決まります。
クロックを相手に配って同期を取るので、UART のような自己同期のためのビット(スタート/ストップ)が不要で、フレーム区切りのオーバーヘッドがありません。全二重かつプロトコル上の待ち合わせが少なく、SD カード・液晶・高速 ADC/DAC・フラッシュメモリなどスループット重視の周辺で好まれます。
I2C:2線で多デバイスをぶら下げる
I2C(Inter-Integrated Circuit)はクロック SCL とデータ SDA のわずか2本を全デバイスで共有し、その上に多数のスレーブをつなぐバスです。SPI と同じ同期方式ですが、線を増やさずデバイスを増やせる点が根本的に異なります。それを可能にするのが アドレッシング と オープンドレイン の2つの工夫です。
各スレーブは固有の 7ビットアドレス(拡張で10ビット)を持ちます。マスタは通信開始の合図として、SDA が High のまま SCL を叩く通常状態とは違う スタートコンディション(SCL が High の間に SDA を High→Low)を出し、続けて「7ビットアドレス+R/W ビット」を送出します。自分のアドレスと一致したスレーブだけが1クロック分 SDA を Low に引く ACK を返し、以降そのスレーブとだけ送受信します。終了は ストップコンディション(SCL が High の間に SDA を Low→High)です。
I2C 書き込みの流れ(マスタ→スレーブ):
S | A6..A0 R/W=0 | ACK | DATA(8bit) | ACK | ... | P
─────────────────────────────────────────────────────
S = スタート ACK = 受信側が SDA を Low に引く応答
A6..A0 = 7bitアドレス P = ストップ
該当アドレスのスレーブのみ ACK を返し、以降の転送に参加
配線は SDA・SCL とも オープンドレイン で、各デバイスは線を Low に引く(プルダウンする)ことしかできず、High はバス両端の プルアップ抵抗 が作ります。この「誰も引かなければ High、誰かが引けば Low」という論理積(ワイヤードAND)構造のおかげで、複数マスタが同時に喋っても衝突を検出でき(アービトレーション)、遅いスレーブは SCL を Low に保持して待たせる クロックストレッチング ができます。半面、High へは抵抗経由で戻るため立ち上がりが鈍く、これが速度の上限(標準100kHz、ファスト400kHz、ファストプラス1MHz 程度)を規定します。線を共有する分、通信は 半二重 です。
I2C の最高速度は、プルアップ抵抗値と配線・デバイスの総容量で決まる立ち上がり時定数に強く縛られます。スレーブを増やしたり配線を伸ばしたりすると容量が増え、波形が鈍って通信が不安定になります。プルアップ値・バス長・接続数はデータシートの許容範囲内で設計する必要があり、闇雲にデバイスを追加できるわけではありません。
3方式の使い分け
同じ「シリアルバス」でも、設計上のトレードオフは明確に分かれます。まとめると次の通りです。
| 観点 | UART | SPI | I2C |
|---|---|---|---|
| 同期方式 | 非同期(クロック線なし) | 同期(SCLK 共有) | 同期(SCL 共有) |
| 信号線数 | 2(TX/RX) | 3 + スレーブ数(CS) | 2(SDA/SCL) |
| トポロジ | 1対1 | 1マスタ多スレーブ(CS選択) | 多マスタ多スレーブ(アドレス選択) |
| 全二重/半二重 | 全二重 | 全二重 | 半二重 |
| デバイス選択 | なし(相手固定) | CS 線 | 7/10ビットアドレス |
| 典型速度 | 〜数百kbps〜数Mbps | 数十MHz級 | 100k/400k/1M Hz 程度 |
| 主な用途 | PC 連携・GPS・デバッグコンソール | 液晶・SDカード・フラッシュ・高速ADC | 各種センサ・EEPROM・RTC・電源IC |
原理から選択の指針を引き出すと——PC やモジュールと1対1でつなぐ、あるいはクロック線を引きたくないなら UART。とにかく速く、全二重で大量のデータを流したいなら SPI(ただしスレーブ分の CS を用意する)。多数の小さなセンサやメモリを最少の線でぶら下げたいなら I2C(速度は割り切る)。速度と全二重が欲しい SPI、配線本数とデバイス数の柔軟さが欲しい I2C、クロック共有を要らずケーブル1本で完結させたい UART、という三者三様の最適点があるわけです。
「同期か非同期か」で UART(非同期)と SPI/I2C(同期)を即答できることが第一。次に「線が一番少ないのは?」→ UART と I2C が2本、SPI は 3+CS。「多数のデバイスをアドレスで選ぶのは?」→ I2C。「全二重なのは?」→ UART と SPI(I2C は半二重)。この対応表を、信号線名(UART: TX/RX、SPI: SCLK/MOSI/MISO/CS、I2C: SDA/SCL)とセットで覚えるのが定石です。
これらのバスはいずれもマイコン内蔵のペリフェラルとして提供され、CPU から見ればレジスタ操作と割り込みで扱う入出力です。より広い周辺回路やクロック・信号処理の観点は /hardware-components/ や /dsp-control/ が扱います。近距離の相互接続を「同期/非同期」と「1対1/バス」の2軸で捉え直すと、無数にある通信規格も同じ地図の上に並べて理解できます。
組込み・IoT Article
シリアルバス(I2C・SPI・UART)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
I2C
比較で見る軸
難易度: advanced / カテゴリ: 組込み・IoT / タグ数: 6
導入後に効く点
SPI はクロック線を持つ同期。SCLK/MOSI/MISO の共有3線+スレーブ毎の CS で全二重・高速だが、スレーブが増えると CS 線が増える。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 組込み・IoT
- タグ数
- 6
判断チェックリスト
- 自社の用途が「I2C / SPI」に近いか確認する。
- 強みである「UART はクロック線を持たない非同期。両端が同じボーレートを事前合意し、スタート/ストップビットで1バイトずつ同期を取り直す2線(TX/RX)の1対1通信。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。