I2C・SPI・UARTの違い:配線・速度・使い分けを比較

この3つは、組み込みの開発で最初に出会うシリアル通信です。UARTは、共通のクロックがない、1対1のシンプルな通信です。SPIは4本の線を使う高速なバスで、マスターがチップセレクトの線で相手を選びます。I2Cは2本の線を多くのデバイスで共有し、アドレスで相手を選びます。使い分けの軸は、主に速度(SPI)、ピン数(I2C)、簡単さ(UART)です。

項目UARTSPII2C
配線信号線2本(TXとRX)とグランド信号線4本(SCLK、MOSI、MISO)に加えて、デバイスごとにチップセレクト(CS)1本共有の2本(SDAとSCL)とグランド。プルアップ抵抗が必要
クロック非同期。クロック線がなく、双方でボーレートを合わせる同期。マスターがクロックを出す同期。マスターがクロックを出す
接続形態2つのデバイスの1対1マスター1つとスレーブ複数。スレーブごとにCS線が必要マスターもスレーブも複数で、1本のバスを共有する
アドレスなしチップセレクトの線で相手を選ぶ通信の最初に7ビット(10ビットも可)のアドレスを送る
一般的な速度9,600〜115,200 bit/sから、数Mbit/sまで1〜50 MHzのことが多く、それ以上の部品もある100 kHz(標準)、400 kHz(高速)、1 MHz(ファストモードプラス)、3.4 MHz(ハイスピード)
通信方向全二重全二重半二重
誤り検出パリティビットとフレーミングの確認(任意)仕組みとしては持たない1バイトごとにACK/NACKを返す
デバイスが増えたときのピン数通信相手が増えるごとに2本増えるデバイスが増えるごとにCSが1本増える増えない
距離RS-232やRS-485のドライバを使えば長くできる短い。同じ基板上短い。同じ基板上
主な用途デバッグ用のコンソール、GPSやBluetoothのモジュール、基板間の接続フラッシュメモリ、SDカード、ディスプレイ、高速なADCやセンサー低速のセンサー、EEPROM、リアルタイムクロック、チップの設定

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

UART
2つのデバイスを最も簡単につなぎたいとき、デバッグ用のコンソール、シリアル通信のあるモジュールに使うとき。
SPI
速度が必要なとき。メモリ、ディスプレイ、高速なコンバータなど。デバイスが増えるとピンも増えるのが欠点です。
I2C
低速のデバイスが多く、ピンが少ないとき。センサー、小さなメモリ、設定用のレジスタなど。速度に限りがあり、プルアップ抵抗が必要です。

よくある質問

I2CとSPIではどちらが速いですか?

SPIです。1〜50 MHz以上で動くことが多く、I2Cは、一般的なモードで100 kHz〜1 MHz、ハイスピードモードで3.4 MHzです。

なぜI2Cにはプルアップ抵抗が必要なのですか?

I2Cのデバイスは、線をLowに引き下げるか、手放してHighにするだけなので、抵抗で線を引き上げます。これで、多くのデバイスが2本の線を安全に共有できます。

UARTにはクロック線が必要ですか?

必要ありません。UARTは非同期なので、双方で同じボーレートに設定する必要があります。ボーレートが少しずれると、文字化けすることがあります。

SPIで多くのデバイスをつなぐと、何本のピンが必要ですか?

SPIは、共有のSCLK、MOSI、MISOに加えて、デバイスごとにチップセレクトが1本必要なので、デバイスが増えるとピンも増えます。I2Cは、デバイスの数にかかわらず2本です。

理解度チェック

UARTによるシリアル通信の特徴として正しいものはどれか。

  1. A送る側がクロックの線を出し、受ける側はそのクロックでデータを読む
  2. Bクロックの線を使わず、送る側と受ける側が同じ通信速度(ボーレート)に合わせ、スタートビットで区切りを知らせる
  3. C1本の線に多数の機器をつなぎ、アドレスで相手を選ぶ
答えと解説を見る

正解:B. クロックの線を使わず、送る側と受ける側が同じ通信速度(ボーレート)に合わせ、スタートビットで区切りを知らせる

UARTは、送信と受信の2本の線(とグラウンド)で通信する非同期式のシリアル通信です。何も送らないときは1の状態で、0のスタートビットで文字の始まりを知らせ、データのビットに続いて1のストップビットで終わります。クロックを送らないので、両方が115200 bpsなどの同じ速度に設定しておく必要があります。デバッグ用の出力やGPS、無線のモジュールとの接続によく使われます。

SPI通信の特徴として正しいものはどれか。

  1. Aクロックを使わない非同期式で、2本の線だけでつなぐ
  2. Bマスタがクロックを出す同期式で、送信と受信を同時に行え、チップセレクトの線で相手を選ぶ
  3. Cアドレスで相手を選ぶので、何台つないでも線は2本で済む
答えと解説を見る

正解:B. マスタがクロックを出す同期式で、送信と受信を同時に行え、チップセレクトの線で相手を選ぶ

SPIは、マスタが出すクロックに合わせて、マスタからスレーブへの線とスレーブからマスタへの線で同時にデータを送り合う同期式の通信です。相手ごとにチップセレクト(CS)の線を用意し、0にした相手とだけ通信します。仕組みが単純でクロックを数十MHzまで上げられるので、フラッシュメモリや表示装置、ADCなどの高速な部品とよく接続されます。

I2C通信の特徴として正しいものはどれか。

  1. A機器ごとに専用のチップセレクトの線が必要である
  2. B送信と受信の線が別々で、両方向に同時に送れる
  3. Cクロック(SCL)とデータ(SDA)の2本の線に複数の機器をつなぎ、アドレスで通信の相手を選ぶ
答えと解説を見る

正解:C. クロック(SCL)とデータ(SDA)の2本の線に複数の機器をつなぎ、アドレスで通信の相手を選ぶ

I2Cは、SCLとSDAの2本だけで複数の機器をつなぐ同期式のシリアル通信です。マスタは最初に相手の7ビットのアドレスを送り、そのアドレスの機器だけが応答します。線はオープンドレインで、プルアップ抵抗で1に引き上げ、どの機器も0に引き下げられるようにしています。温度センサや加速度センサ、EEPROMなど、速さより配線の少なさが大切な部品に向いています。

  1. 115200 bpsのUARTで、データ8ビット・パリティなし・ストップビット1(8N1)の形式で送るとき、1秒間に送れるバイト数に最も近いものはどれか。
  2. SPIで一般に使われる4本の信号の組み合わせとして正しいものはどれか。
  3. I2Cで、データを1バイト受け取った側が、受け取ったことを知らせる方法として正しいものはどれか。

組込み・ファームウェアの練習問題へ

関連する用語の解説

UART
クロックの線を使わず、送る側と受ける側が同じボーレートに合わせて通信する非同期式のシリアル通信の回路。スタートビットとストップビットで文字を区切る。
SPI
マスタが出すクロックに合わせて送受信を同時に行う同期式のシリアル通信。チップセレクトの線で相手を選び、高速な部品の接続に使う。
I2C
クロック(SCL)とデータ(SDA)の2本の線に複数の機器をつなぎ、アドレスで相手を選ぶ同期式のシリアル通信。線はオープンドレインでプルアップする。
GPIO
汎用入出力(General Purpose Input/Output)の端子。ソフトウェアで入力にも出力にも設定でき、スイッチの読み取りやLEDの点灯などに使う。

関連する比較