科学・計算関連

I2CとSPIの違いは?通信方式・配線数・用途の特徴を比較!(UART)

I2CとSPIとUARTの違い
当サイトでは記事内に広告を含みます
技術ブログ特化メルマガはこちら

I2C、SPI、UARTは、マイコンとセンサー、メモリ、ディスプレイなどをつなぐ代表的なシリアル通信方式です。

名称は聞いたことがあっても、配線数や速度、複数デバイスへの接続方法まで理解すると、どれを選ぶべきか迷う場面も多いでしょう。

特にI2CとSPIは組み込み開発で並べて検討されることが多く、UARTも含めると用途の違いが分かりにくくなります。

この記事では、通信方式の基本、信号線の構成、速度、メリットと注意点を整理し、部品選定や回路設計に役立つ判断基準を解説します。

I2CとSPIとUARTの違い

I2CとSPIとUARTの違い

それではまずI2CとSPIとUARTの全体的な違いについて解説していきます。

結論からいえば、少ない配線で複数の低速デバイスをつなぐならI2C、高速通信や安定した連続転送を重視するならSPI、機器間の単純なデータ送受信にはUARTが向いています。

ただし、最適な方式は通信速度だけで決まるものではありません。

接続するデバイスの数、基板上の配線距離、マイコンの利用可能な端子数、使用する周辺ICの対応規格まで確認することが重要です。

通信方式 基本的な配線数 同期方式 複数接続 主な用途
I2C 2本 同期通信 アドレスで接続 センサー、RTC、EEPROM
SPI 3本から4本以上 同期通信 個別の選択線で接続 高速ADC、液晶、フラッシュメモリ
UART 2本 非同期通信 原則として1対1 PC通信、GPS、Bluetoothモジュール

I2Cの特徴

I2CはInter Integrated Circuitの略称で、SCLとSDAという2本の信号線を使う同期式の通信規格です。

SCLはクロック信号、SDAはデータ信号を担当し、マスターがクロックを供給しながら通信を進めます。

同じ2本の線に複数のスレーブデバイスを並列接続できるため、端子数を節約しやすい点が大きな魅力です。

各デバイスは固有のアドレスで区別され、マスターが通信相手を指定してからデータを送受信します。

温度センサー、加速度センサー、照度センサー、RTCなどをまとめて扱いたい場合に、I2Cは扱いやすい選択肢になります。

一方で、信号線にはプルアップ抵抗が必要であり、配線容量が大きい環境では立ち上がり時間の影響を受けます。

SPIの特徴

SPIはSerial Peripheral Interfaceの略称で、クロックに同期して高速にデータを転送する通信方式です。

一般的にはSCLK、MOSI、MISO、CSまたはSSの信号線を使用します。

MOSIはマスターからスレーブへの送信、MISOはスレーブからマスターへの送信を担当し、送受信を同時に行える全二重通信が可能です。

SPIでは通信相手をCS信号で選択するため、スレーブを増やすほど選択線も増える傾向があります。

それでも、通信手順が比較的単純で、高速化しやすいことから、画面表示用のディスプレイや高速メモリを制御する場面で広く使われています。

デバイスごとにクロック極性と位相の設定が異なる場合があるため、SPIモードの確認も欠かせません。

UARTの特徴

UARTはUniversal Asynchronous Receiver Transmitterの略称で、クロック線を使わない非同期式のシリアル通信です。

基本的には送信線TXと受信線RXの2本を接続し、送信側と受信側でボーレートを合わせて通信します。

スタートビット、データビット、必要に応じたパリティビット、ストップビットという形式で1文字ずつデータを送る仕組みです。

配線や実装が分かりやすく、パソコンとのシリアル通信、デバッグ出力、GPSモジュールとの接続などに適しています。

ただし、I2Cのようにアドレスで多数の機器を選択する機能は基本的に備えていません。

UARTは単純な1対1通信を手軽に実現したい場面に向く規格と考えると理解しやすいでしょう。

I2Cは配線数の少なさと複数接続、SPIは高速性、UARTは単純な機器間通信に強みがあります。

通信規格の名前だけで選ぶのではなく、必要な転送量と接続構成から判断することが大切です。

通信方式と信号線の構成

続いては通信方式と信号線の構成を確認していきます。

同じシリアル通信でも、同期の取り方と信号線の役割には明確な違いがあります。

回路図を読むときやブレッドボードで配線するときは、まずどの信号が必須なのかを把握しましょう。

I2Cの同期通信

I2CはSCLのクロックに合わせてSDAのデータを読み取る同期通信です。

一般的に、SCLがHighの安定した期間にSDAの値を判定し、クロックの変化に合わせてビットが送られます。

通信の開始を示すスタートコンディションと、終了を示すストップコンディションも、SCLとSDAの状態変化で表現されます。

アドレス送信の後には読み書き方向を示すビットが続き、受信側はACKまたはNACKで応答します。

この応答確認があるため、接続先がデータを受け取ったかを通信中に確認しやすい点もI2Cの特徴です。

複数のマスターを許容する設計もありますが、一般的な小規模機器では1台のマイコンをマスターにする構成がよく採用されます。

SPIの全二重通信

SPIではクロック信号に合わせて、MOSIとMISOでデータを同時にやり取りできます。

たとえばマスターが1バイトを送信している間に、スレーブ側からも1バイトを返すことが可能です。

この性質により、読み出しと書き込みを連続的に行うデバイスで高い効率を発揮します。

ただし、読み取りだけを行うつもりでも、クロックを発生させるためにダミーデータを送信する実装が必要になることがあります。

SPIの通信量を見積もる際は、データ本体だけでなく、コマンド、アドレス、ダミーバイトも考慮するとよいでしょう。

SPIで8ビットのデータを転送し、クロック周波数が8MHzの場合、理論上の転送時間はおおむね1マイクロ秒です。

実際にはCSの切り替え、命令送信、ソフトウェア処理などの時間も加わるため、システム全体の速度は余裕を見て設計します。

UARTの非同期通信

UARTには共通のクロック線がないため、送信側と受信側は事前にボーレートやフレーム形式を一致させます。

代表的な設定には9600bps、115200bpsなどがあり、データビット8、パリティなし、ストップビット1の設定はよく使われます。

ボーレートが異なると、受信側はビットの区切りを正しく判断できず、文字化けや受信エラーにつながります。

UARTのTXとRXは通常、交差させて接続します。

つまり一方のTXを相手のRXへ、相手のTXを一方のRXへつなぐ構成です。

GNDも共通化しないと基準電位がそろわないため、信号線だけでなくグランド接続も必須と覚えておきましょう。

配線数と複数デバイスの接続

続いては配線数と複数デバイスの接続方法を確認していきます。

マイコンのGPIOには限りがあるため、必要な端子数は通信方式を選ぶ重要な要素です。

特にセンサーや表示器を多数搭載する製品では、配線の増加が基板面積や設計難易度に直結します。

I2Cのバス接続

I2Cでは、複数のスレーブがSCLとSDAの2本を共有します。

新しいセンサーを追加する場合も、基本的には既存のバスに並列で接続できるため、マイコン側の端子を増やさずに済みます。

ただし、同じI2Cアドレスを持つデバイスを複数つなぐ場合は注意が必要です。

アドレス変更端子を利用できるか、I2Cマルチプレクサを挟めるか、別バスを使えるかを確認します。

また、バスに接続するモジュールごとにプルアップ抵抗が実装されていると、抵抗値が並列になって小さくなりすぎることがあります。

プルアップ抵抗はバス全体で適切な値になるよう確認することが、安定通信の基本です。

SPIのチップセレクト接続

SPIではSCLK、MOSI、MISOを複数のスレーブで共有できる一方、通常は各スレーブに専用のCS信号が必要です。

たとえば3個のSPIデバイスを接続するなら、共有する3本に加えて、3本のCS線を用意する構成になります。

読み出し専用のデバイスなどではMISOの扱いが異なることもありますが、基本的な考え方は個別選択です。

CS線が増えることは欠点にも見えますが、通信相手が明確であり、デバイス単位で通信を制御しやすい利点にもなります。

GPIOが不足する場合は、デコーダICやGPIOエキスパンダを使う方法も検討できます。

UARTの接続制約

UARTは原則として、1組のTXとRXで1台の相手と通信する方式です。

複数のUART機器を接続したい場合は、マイコンに複数のUARTポートを持たせるか、ソフトウェアUARTを使う方法があります。

別の方法として、マルチプレクサを用いて通信先を切り替える構成もあります。

ただし、同時通信の可否や受信タイミング、エラー処理まで含めて検討しなければなりません。

多くの小型センサーを接続する用途では、UARTよりもI2Cのほうが配線を整理しやすいケースが一般的です。

比較項目 I2C SPI UART
共有できる信号線 SCLとSDA SCLK、MOSI、MISO 基本的に共有しない
機器の識別方法 アドレス CS信号 接続先そのもの
機器追加時の配線 原則2線へ追加 CS線の追加が必要 ポートまたは切替回路が必要
端子節約への適性 高い 中程度 低い

接続台数が多いほど、I2Cのアドレス方式は有利になりやすい構成です。

一方で高速な複数デバイスを扱うなら、CS線が増えてもSPIを選ぶ価値があります。

通信速度とデータ転送性能

続いては通信速度とデータ転送性能を確認していきます。

速度の数値だけを見るのではなく、実際に必要なデータ量をどのくらいの間隔で送るのかを計算することが重要です。

センサー値を1秒に数回読む用途と、画像データを連続表示する用途では、求められる性能が大きく異なります。

I2Cの速度区分

I2Cには標準モードの100kHz、ファストモードの400kHzなど、複数の速度区分があります。

さらに高速なモードに対応するデバイスもありますが、すべての部品が同じ速度で動作するとは限りません。

バス全体では、接続しているデバイスの中で対応速度が低いものに合わせる必要があります。

また、配線が長い、接続部品が多い、プルアップ抵抗値が適切でないといった条件では、設定値どおりの高速通信が難しくなることもあります。

一般的な環境センサーの測定値を取得する程度なら、100kHzや400kHzでも十分な場合が多いでしょう。

SPIの高速転送

SPIはマイコンと周辺デバイスの性能次第で、I2Cより高いクロック周波数を設定しやすい通信方式です。

数MHzから数十MHzで動作する構成も珍しくなく、大量のデータを短時間で扱う用途に向いています。

液晶ディスプレイへの描画データ送信、SDカードへの書き込み、外部フラッシュメモリの読み出しでは、SPIの速度が作業効率を左右します。

ただし、高速になるほど配線長、信号反射、ノイズ、基板レイアウトの影響を受けやすくなります。

試作段階では動いても、量産基板で高速化すると不安定になる場合があるため、信号品質まで意識した設計が求められます。

1秒間に100回、各回で16バイトのセンサーデータを取得する場合、必要なデータ量は毎秒1600バイトです。

通信にはアドレスや制御情報も加わりますが、一般的なI2Cでも対応しやすい規模といえます。

UARTのボーレート

UARTの通信速度はボーレートで表され、1秒間あたりの信号変化回数を示します。

8ビットのデータをパリティなし、ストップビット1で送る場合、実際にはスタートビットとストップビットを含めて10ビット程度が必要です。

115200bpsなら、理論上は1秒あたり約11520バイトを送れる計算になります。

ただし、受信処理の負荷、バッファ容量、データ形式、改行コードなども実効速度に影響します。

ログ出力やコマンド送受信には便利ですが、高解像度の画像や高速サンプリングデータを常時流す用途では、別方式の検討が必要になるでしょう。

UARTを115200bps、8ビットデータ、スタートビット1、ストップビット1で使う場合、1バイトの送信には約87マイクロ秒かかります。

1000バイトを連続送信するなら、理論上は約0.087秒が目安です。

用途別の選び方

続いては用途別の選び方を確認していきます。

通信規格は優劣で決めるものではなく、接続対象とシステム要件に合うものを選ぶことが基本です。

部品のデータシートで対応インターフェースを確認し、実装後の拡張性も考慮しましょう。

センサーとRTCの接続

温湿度、気圧、加速度、地磁気、照度といったセンサーや、時刻を保持するRTCにはI2C対応品が多く見られます。

これらは毎秒数回から数十回程度の取得で足りることも多く、高速転送より配線の少なさがメリットになります。

複数のセンサーを2本のバスに接続できるため、試作機の拡張も比較的容易です。

ただし、同一アドレスのモジュールを複数使う場合や、ケーブルを長く引き回す場合には注意が必要です。

短距離の基板内通信を中心に考えるなら、I2Cは非常に使いやすい選択肢でしょう。

ディスプレイとメモリの接続

SPIは、画面更新やデータ保存のように、まとまったデータを扱う部品との接続に適しています。

たとえばカラーLCDや有機ELディスプレイでは、描画する画素数が増えるほど転送量も増加します。

外部フラッシュメモリやSDカードでも、読み書き速度が製品の応答性に影響するため、SPIが採用される場面が多くなります。

画面の書き換え速度やファイルアクセス速度を重視するならSPIを優先して検討するとよいでしょう。

一方で、CS端子の必要数と各デバイスのSPIモードは、回路設計とファームウェア設計の両面で確認します。

パソコンと通信モジュールの接続

UARTは、マイコンとパソコン、USB変換器、GPS、Wi Fiモジュール、Bluetoothモジュールなどの接続で定番の方式です。

テキスト形式のログを送れば、シリアルモニタで動作状況を確認できるため、開発中のデバッグにも役立ちます。

ATコマンドを使う通信モジュールでは、UART経由で設定や状態取得を行う構成がよく使われます。

通信内容を目視しやすいことも利点ですが、相手側の電圧レベルには注意が必要です。

3.3V系と5V系を直接つなぐと故障につながる可能性があるため、必要に応じてレベル変換回路を入れます。

小容量のセンサー群にはI2C、高速な表示器やメモリにはSPI、外部機器との単純な送受信にはUARTという分け方が実践的です。

迷ったときは、使用予定のデバイスが推奨する通信方式をデータシートで確認してください。

実装時の注意点

続いては実装時の注意点を確認していきます。

通信規格を正しく選んでも、電源、配線、設定に問題があれば期待どおりに動作しません。

不具合の多くは、信号の接続ミス、電圧条件の見落とし、初期設定の不一致から生じます。

電圧レベルとプルアップ抵抗

I2CのSCLとSDAは、一般にオープンドレインまたはオープンコレクタ形式で使用されます。

そのため、信号をHighに戻すためのプルアップ抵抗が必要です。

抵抗値が大きすぎると信号の立ち上がりが遅くなり、高速通信で波形が崩れやすくなります。

反対に小さすぎると、デバイスがLowに引き下げるときの電流が大きくなります。

モジュールの内蔵抵抗も含めて確認し、電源電圧とバス容量に応じて調整することが大切です。

SPIやUARTでも、接続する双方のロジック電圧が一致しているかを必ず確認します。

クロック設定と通信モード

SPIではCPOLとCPHAの組み合わせにより、クロック極性とデータを読むタイミングが決まります。

デバイスの仕様に合わないSPIモードを設定すると、データのビット位置がずれて正しい値を読めません。

I2Cでも、デバイスが対応する最大クロック周波数を超えないように設定する必要があります。

UARTではボーレート、データビット、パリティ、ストップビットを送信側と受信側でそろえます。

通信ができないときは、まず規格ごとの設定値が一致しているかを見直すと、原因を絞り込みやすくなります。

配線長とノイズ対策

基板内の短い配線では問題がなくても、外部ケーブルで数十センチ以上引き回すとノイズや信号劣化が発生しやすくなります。

I2Cはバス容量の影響を受けやすく、長距離配線には必ずしも向きません。

SPIも高速クロックを使うため、配線を長くすると反射やクロストークの影響が目立つことがあります。

UARTは比較的扱いやすいものの、環境によってはノイズ対策や通信速度の調整が必要です。

長距離やノイズの多い環境では、RS 485やCANなど、物理層を含めて長距離通信向けに設計された規格を検討する方法もあります。

まとめ

I2C、SPI、UARTはいずれも便利なシリアル通信方式ですが、得意とする用途は異なります。

I2Cは2本の配線で複数のデバイスを扱いやすく、センサーやRTCの接続に適しています。

SPIは配線数が増えやすい一方、高速な全二重通信が可能で、ディスプレイ、メモリ、高速な周辺デバイスに向いています。

UARTはTXとRXによる分かりやすい1対1通信が特徴で、パソコン、GPS、無線モジュールとの接続やデバッグに便利です。

通信速度、接続台数、配線数、対応デバイス、電圧条件をまとめて確認することが、失敗しにくい選定につながります。

回路図とデータシートを照らし合わせ、目的に合う通信方式を選んでください。