【マイコン講座】シリアル通信 はじめの一歩と"落とし穴"
........
- 更新日
- 2025.12.29
- 公開日
- 2023.10.20
本記事では、マイコン初心者のエンジニア向けに理解しやすいように、UART、SPI、I2Cの特徴を比較し、よくある落とし穴/注意すべきポイントを解説します。
INDEX
1. シリアル通信とは?種類や仕込みをわかりやすく解説
シリアル通信とはデバイス間の通信方式の1つで、1本の伝送路で1ビットずつデータを送信する方式のことでパラレル通信と対比されます。
シリアル通信の規格には、I2S(デジタル音声信号を伝送する標準規格)、SATA(外部記憶装置を接続する標準規格)、PCIe(高速伝送の規格)など特定用途に特化した通信方式もありますが、本記事では一般的なシリアル通信(UART、SPI、I2C)について解説します。
まずは、シリアル通信を理解するうえで重要な用語から理解を深めていきましょう。
1-1. 半二重通信と全二重通信
・半二重通信
1つの伝送路で送受信の両方を行う通信方式です。
送信と受信を同時に行うことが出来ませんが、信号線が1本で済むというメリットがあります。このメリットは、信号線の長さが長くなるほど大きくなります。また、無線LAN通信のような電波を用いた通信方式は同周波数で通信することで混信するため半二重通信となっています。
1-2. 同期通信と非同期通信
・同期通信
デバイス間で共通のクロックを用いて通信を同期させる通信方式です。
クロックは信号線を用いて、マスタからスレーブに共有されます。転送レートを上げやすいというメリットがありますが、回路やケーブルが煩雑となることやクロック信号線とデータ線の配線長の差から発生する誤差を考慮する必要があります。
・非同期通信
デバイス間で事前に通信速度を決めておき、各々がデバイス内で独自クロックを持つ通信方式です。
同期用の信号線がないため、自由なタイミングで情報の伝達が可能というメリットがありますが、送信側と受信側で発生するクロック誤差を考慮しておく必要があります。
1-3. シングルエンドと差動
・シングルエンド/不平衡
基準となる電圧と信号線の電圧を比較して、高い場合はHigh(1)、低い場合はLow(0)として表現する通信方式です。
信号線が1本で低コストということもあり広く普及していますが、ノイズの影響を受けやすいため信号線の長さが限定されます。
・差動/ディファレンシャル/平衡
2つの信号線の差分からHigh(1)、Low(0)を判別する通信方式です。
信号線が2本必要となりますが、ノイズの影響を受けにくいため信号品質は安定します。
1-4. シリアル通信とパラレル通信の違い
| 比較項目 | シリアル通信 | パラレル通信 |
|---|---|---|
| データ送信 | 1ビットずつ順番に送信 | 複数ビット(例:8ビット)を同時に送信 |
| 信号線(データ用) | 1本(または少数) | 複数本(データのビット数分) |
| 通信速度 | 高速 | 低速※ |
| ノイズ耐性 | 強い | 弱い(信号線間の干渉) |
| コスト(配線) | 低い | 高い |
| 主な用途 | USB、SATA、イーサネット、UART | 昔のプリンターポート、IDE |
- 信号線が複数ある影響でビット間の同期が取れなくなるため、クロックを上げることができず高速化にも限界がある
前述で少し触れたシリアル通信とパラレル通信の主な違いは、一度に送信するデータの量と使用する信号線の数です。シリアル通信はデータを1ビットずつ順番に送るのに対し、パラレル通信は複数の信号線を使って一度にまとめて送ります。
2. UARTとは?通信速度(ボーレート)もわかりやすく解説
2-1. 概要
UART(Universal Asynchronous Receiver/Transmitter)はデバイスとの通信でよく使用されており、非同期、全二重、シングルエンドでデータ通信を行います。
通信速度はボーレートと呼び、[bps](bit per second)という単位で表記されています。これは、1秒間に何ビットのデータ通信が行われるかを表しており、115200bpsの場合、1秒間に115200ビットを通信することが出来ます。
2-2. 端子構成
基本はTxD/RxDの2端子で構成されます。TxD(Transmit exchange Data)はデータ送信用の端子、RxD(Received exchange Data)はデータ受信用の端子です。
その他に、RTS(Request To Send)、CTS(Clear To Send)と言うハードウェアフロー制御用の端子がありますが、製品によりRTS/CTS端子が無い場合もあります。
2-3. 通信方式
UARTはフレームと呼ばれる単位で通信を行っており、送信側はTxD端子からフレーム単位でデータを送信し、受信側はRxD端子からフレーム単位でデータを受信することで通信を行います。
ハードウェアフロー制御では、受信側が受信可能な場合にRTS端子からLowを出力し、出力されたLow信号が送信側のCTS端子に入力されることで送信可能であることを判別します。
ソフトウェアフロー制御では、受信側が通信を停止したい場合に、Xoff(ASCII CODE:DC3)、通信を再開したい場合にXon(ASCII CODE:DC1)をTxD端子から出力します。送信側は受信した制御コードを確認することで送信可能であることを判別します。
2-4. フレーム構成
・Start bit(ST)
送信側から受信側に通信開始を通知するためのビットで、通信開始前は送信側によってHighに固定されていますが通信開始時に1ビット期間Lowにドライブされます。
・Data(D0~D7)
基本は8ビットであるが、7ビットや9ビットに対応している場合もあります。
・Parity bit(PA)
パリティビットはデータの誤りを検出するために付与するビットですが、フレームの構成要素として必須ではないため、誤り検出の必要がない場合はフレームに付与せず、通信を行うことが出来ます。
パリティビットの設定には「偶数パリティ」、「奇数パリティ」、「パリティなし」と3パターンあります。
「偶数パリティ」・・・データのビットとパリティビットにて1の数が偶数となるようにビットを付与
「奇数パリティ」・・・データのビットとパリティビットにて1の数が奇数となるようにビットを付与
「パリティなし」・・・フレームにパリティビットを含めない
・Stop bit(SP)
送信側から受信側に通信終了を通知するためのビットで、通信終了時に通信ラインをHighに戻す役割があり、1フレームの送信後にHighにドライブされます。
2-5. 特徴/どのようなところで使われるか?
UARTは非同期であり、全二重で通信が行われるため、自由にデータの送受信を行うことが出来るという特徴があります。
主な用途としては、コンピュータと外部デバイスの接続やシリアルインターフェース制御に使用されています。
<用途例>
・基板内・基板間配線
・PC-周辺機器間配線(RS-232Cとして接続)
・工場内機器間配線(RS422/485として接続)
2-6. よくある落とし穴
UARTの通信設定(ボーレート、フレーム)が2つのデバイス間で同じ設定になっているにも関わらず、通信が上手く出来ないという場合がありますが、これにはボーレートの誤差が関係している可能性があります。
デバイス間のボーレート誤差が発生するポイントは下記1、2が考えられます。
- 「ボーレートを決定 ⇒ ボーレートを設定」
デバイスの周辺機能に供給されているクロックの影響などで設定自体が困難な場合のように、ボーレートを設定する段階で生じる誤差
(例:115200bpsを設定したいが、どれだけ近づけても115400bpsまでしか近づかない。) - 「ボーレートを設定 ⇒ データ出力」
デバイスの水晶発振子の精度によって周辺機能に供給されるクロックの誤差から生じる誤差、伝送路の長さから生じる誤差
水晶発振子の誤差や伝送路から生じる誤差は見落としがちですが、事前にデータシートなどで確認しておく必要があります。また、何か問題が発生した際は自身が設計するデバイスに意識が向きがちですが、通信相手がいることも忘れてはいけません。相手側のボーレート誤差を考慮出来ているかも考える必要があります。
では、誤差はどれくらいまで許容されるのかについて説明します。
UART通信ではスタートビットの中央を開始地点としてボーレートの間隔で順次サンプリングを実施します。このとき、開始時点に確保されている±50%マージンの範囲内に誤差が収まれば正常に通信を行うことが出来ます。
例を交えて考えてみると・・・1フレームが10ビットのデータを送信するとき、ボーレート誤差が+1%だと仮定すると、10ビット目には+10%の誤差が発生していることになります。これが、送信側と受信側の両方で発生するため送信側ではボーレート誤差が+2%でも受信側でボーレート誤差が-2%あれば、10ビット目には40%の誤差になってしまいます。実際は伝送路の影響、セットアップ時間、ホールド時間、スタートビットの検出遅れなども考慮したうえで許容誤差を確認する必要があります。一般的にはボーレート誤差は±1%を目安に設計されることが多いです。
3. SPIとは?わかりやすく解説
3-1. 概要
SPI(Serial Peripheral Interface)はマイコンと周辺デバイスの接続によく使用されています。同期式であり、全二重のシングルエンドでデータ通信を行っています。
マスタとスレーブで役割が異なっており、1つのマスタに対してスレーブを複数接続することが出来ます。クロックの供給はマスタ側が行い、スレーブはマスタから供給されるクロックに同期して入出力を行います。
3-2. 端子構成
SPIはSCLK(Serial Clock)、MISO(Master In Slave Out)、MOSI(Master Out Slave In)、SS(Slave Select)の4つの信号線を用いて通信を行います。製品によってはMISO、MOSIは自製品を基準にData Out、Data Inなどと記載されていることもあるので、配線には注意が必要です。
マスタからスレーブにSCLK端子からクロックを供給し、データ転送のタイミングを同期させます。データはMOSI端子を通してマスタからスレーブ、MISO端子を通してスレーブからマスタに送信されます。複数のスレーブと通信する場合は、通信対象のSSをLow、通信対象以外をHighに設定することでスレーブ側はSS端子がLowを検知しているとき、ホストと通信を行います。
3-3. 通信方式
SPIの通信方式には4種類の動作モードが用意されており、CPOL(Clock Polarity)とCPHA(Clock Phase)の組み合わせで4つのモードに分類分けされています。
SPI通信ではSCLK端子から出力されるクロックの立ち上がり、立ち下がりに合わせて、データの入出力が行われており、アイドル状態のクロック極性(CPOL)やデータのサンプリング/シフトで使用されるクロック位相(CPHA)によって分類されます。そのためSPI通信を行う際には、相手側と動作モードが合っていることを確認する必要があります。
| 動作モード | CPOL | CPHA | アイドル状態のクロック極性 データのサンプリング/シフトで使用されるクロック位相 |
|---|---|---|---|
| モード0 | Low | Low | アイドル状態のクロック極性⇒Low クロックの立ち上がりエッジ ⇒ サンプリング クロックの立ち下がりエッジ ⇒ シフト |
| モード1 | Low | High | アイドル状態のクロック極性⇒Low クロックの立ち上がりエッジ ⇒ シフト クロックの立ち下がりエッジ ⇒ サンプリング |
| モード2 | High | Low | アイドル状態のクロック極性⇒High クロックの立ち上がりエッジ ⇒ シフト クロックの立ち下がりエッジ ⇒ サンプリング |
| モード3 | High | High | アイドル状態のクロック極性⇒High クロックの立ち上がりエッジ ⇒ サンプリング クロックの立ち下がりエッジ ⇒ シフト |
3-4. 特徴/どのようなところで使われるか?
1つのマスタに対して複数のスレーブを接続することが出来るという特徴があり、センサ、ディスプレイ、メモリなどの接続に使用されます。
高速通信が可能なため、リアルタイム性が求められる場合や大容量のデータ通信が必要な場面で活用されています。
| センサ | 加速度センサ、角速度センサなど |
| ディスプレイ | LCD/AMOLEDなどで表示コントローラ内蔵の小型ディスプレイ |
| メモリ | シリアルNORフラッシュ、シリアルNANDフラッシュ、SDカードなど |
3-5. よくある落とし穴
SPI通信が上手く通信出来ない場合に考えられる要因で代表的なものは、通信対象のSS端子がLowになっていない、動作モードが一致していないということが考えられます。また、データパケットが8bitか16bitで選択可能となっているものもあるため、送信データのフォーマットが対応していることを確認する必要があります。
通信設定の自由度が高いため、設計段階でマスタ/スレーブの通信仕様をまとめておくと良いでしょう。
4. I2Cとは?わかりやすく解説
4-1. 概要
I2C(Inter-Integrated Circuit)はマイコンと周辺デバイスとの接続によく使用されており、同期式、半二重、シングルエンドでデータ通信を行っています。
マスタとスレーブで役割が異なっており、1つのマスタに対してスレーブを複数接続することが出来ます。スレーブには個別のスレーブアドレスが割り当てられており、マスタがスレーブと通信する際に必要となります。クロックの供給はマスタ側が行い、スレーブはマスタから供給されるクロックに同期して入出力を行います。
4-2. 端子構成
I2CはSCL(Serial Clock)、SDA(Serial Data)の2つの信号線を用いて通信が行われます。
マスタからスレーブへクロック供給はSCLで行い、SDAでデータの送受信を行います。SCL、SDAの信号線はプルアップ抵抗を介してIO電源に接続します。端子制御はオープンドレインとなっており、各デバイスはLow出力時のみSCL/SDAをLowにドライブします。High出力はHi-Zとし、プルアップによりHigh状態とします。
4-3. 通信方式
I2Cでは通信開始時にホストからスレーブに対してスレーブアドレスとリード/ライトを指定するデータを送信し、スレーブアドレスと一致するスレーブだけがホストと通信します。
スレーブアドレスの表記については、“4-5. よくある落とし穴” も併せてご覧ください。
・ライトアクセス(Slave Address + W)
- マスタがスレーブに対して通信開始の合図としてスタートコンディションを発行する。
- 通信が開始するとマスタから通信対象のスレーブと通信方向を指定するために「スレーブアドレス + ライト」が送信され、対象のスレーブがACKを返すことでデータ通信が行えるようになる。
NACKの場合は通信を行うことが出来ない。 - データ通信では「ホストがデータを送信」⇒「スレーブがACK/NACKで応答」を繰り返す。
- 通信終了時はマスタがスレーブに対してストップコンディションを発行する。
・リードアクセス(Slave Address + R)
- マスタがスレーブに対して通信開始の合図としてスタートコンディションを発行する。
- 通信が開始するとマスタから通信対象のスレーブと通信方向を指定するために「スレーブアドレス + リード」が送信され、対象のスレーブがACKを返すことでデータ通信が行えるようになる。
NACKの場合は通信を行うことが出来ない。 - データ通信では「スレーブがデータを送信」⇒「マスタがACK/NACKで応答」を繰り返す。
- マスタが通信を終了したい場合にはスレーブからのデータ送信に対してNACKで応答し、ストップコンディションを発行する。
・スタートコンディション(ST)
マスタからスレーブに通信開始を通知するためのビットで、SCLがHighのときにSDAをLowにすることで発行される
・ストップコンディション(SP)
マスタからスレーブに通信終了を通知するためのビットで、SCLがHighのときにSDAがHighにすることで発行される
・DATA
マスタが送受信するための8bitのデータとして使用される
・ACK/NACK
通信相手に対して通信状態を通知するためのビットで、正常に通信出来た場合など肯定的な応答はACK:0、正常に通信出来なかった場合など否定的な応答はNACK:1返答する
4-4. 特徴/どのようなところで使われるか?
1つのマスタに対して複数のスレーブを接続することが出来るという特徴があり、センサ、ディスプレイ、メモリなどの接続に使用されます。
送信データで通信相手のスレーブを指定でき、ポートを追加することなく、接続デバイスを追加可能なため、信号線や使用ポートを削減したい場合に活用されています。
| センサ | 加速度センサ、角速度センサなど |
| ディスプレイ | PMOLEDなど表示コントローラ内蔵で表示内容の少ないディスプレイ |
| メモリ | EEPROM |
4-5. よくある落とし穴
・I2Cのバス開放
I2Cの通信エラーなどの理由でホストは通信が終了を認識している状態にも関わらず、スレーブが通信中だと勘違いしてしまい、スレーブがSDAをLowの状態のまま固定されてしまうことがあります。この状態になると互いが待ちの状態になってしまうため、通信を行うことが出来なくなります。
解決方法として、ホストのSCLを汎用出力ポート、SDAを汎用入力ポートに切り替え、SCL端子の汎用出力ポートからHigh、Lowを繰り替えし出力し、ダミークロックを生成します。9クロック分のダミークロックをスレーブに供給するとSDA端子はHighになりバスを開放することが出来ます。
I2Cのバスを開放するための手順について説明しましたが、マイコンによっては特定の操作が必要な場合もありますのでマニュアル、データシートなどでご確認ください。
・マニュアルでのスレーブアドレスの扱い
I2Cのスレーブアドレスが、マニュアルによってスレーブアドレスの記載扱いが異なる場合があります。
下図の通り、7bit形式ではスレーブアドレスのみで表記します。8bit形式の場合はLSBのR/W(1bit)を加えた状態で表記され、スレーブアドレス記載時はLSBを“0”として扱うため、スレーブアドレスが0x63(0b110_0011)の場合はLSBに“0”を付加して0xC6(0b1100_0110)となります。
5. シリアル通信に関するよくある質問
5-1. シリアル通信とイーサネットの違いは?
| 比較項目 | シリアル通信(UART、SPI、I2C) | イーサネット(Ethernet) |
|---|---|---|
| 主な用途 | 基板内/機器内通信 | ユニット間/機器間通信 |
| 通信距離 | 短距離(数cm~数m) | 中~長距離(最大100m以上) |
| 通信速度 | 低速~高速(規格による) | 高速~超高速(100Mbps~数10Gbps) |
| プロトコル | 単純(データ送受信が主) | 複雑(TCP/IPなど階層化されたプロトコル) |
| コスト | 低コスト | 比較的高コスト(専用ICやケーブルが必要) |
どちらもデータを1ビットずつ送るシリアル通信の技術ですが、通信の規模と目的が根本的に異なります。本記事で解説したUART、SPI、I2Cは、主に機器内部(基板上や、マイコンとセンサ・メモリ間など)の近距離(数cm〜数m)で使われる通信規格です。一方で、イーサネットは機器間(PCとルーター、PC同士など)を接続し、ネットワーク(LAN)を構築するための規格です。
5-2. シリアル通信の規格「RS-232C」とは?
RS-232Cは、シリアル通信の規格の一つで、主にコンピュータと周辺機器(モデム、マウス、測定器など)を接続するために古くから使われている規格です。本記事で解説したUARTは、あくまでマイコンと周辺ICとのデータ送受信をマイコンの動作電圧(GND/VDD)で行う機能です。一方で、機器間で使用するための、電気的/機械的ルール(電圧レベル、コネクタ形状、端子配置など)を定めた規格です。
5-3. USBはシリアル通信方式?
USB(Universal Serial Bus)もシリアル通信方式です。USBが登場する前は、マウス(RS-232C)、キーボード(PS/2)、プリンタ(パラレル)など、機器ごとに接続ポートが異なっていました。USBはこれらを統一する目的で開発され、高速なシリアル通信技術と差動信号(2本の信号線の差分を使いノイズに強くする方式)を採用することで、手軽で高速なデータ転送を実現しました。
従来のPCには、RS-232Cによるシリアル通信を行うためのインターフェースとしてCOMポートが搭載されておりましたが、近年ではUSBが主流となり、標準規格であるCDCクラス(Communication Device Class)を用いた通信方式が一般的となっております。これに伴い、USB通信を従来のCOMポート通信と同様に取り扱うため、「仮想COMポート」と呼ばれる技術が広く利用されるようになりました。なお、COMポートの使用状況については、デバイスマネージャやPowerShellを用いることで容易に確認することが可能です。
6. 過去配信ウェビナ
※ダイジェストのため約5分の動画になります。
\\本編の詳細情報は下記をご確認ください。//
【再配信中】
「シリアル通信 初めの一歩」はこちら
7. まとめ
3種類の基本的なシリアル通信について説明しました。
それぞれ特徴がありますので、記事を参考に理解を深めていただければと思います。
この記事を書いたエンジニア
古澤禎崇 Yoshitaka Furusawa
これまで4年間、ルネサスエレクトロニクス製のマイコンを中心に民生機器の開発を行っておりました。 今は、開発での経験を活かして自社製品(液晶ユニット)に関わる業務を行っています。新人の頃に苦労した経験を共有出来ればと思い、この記事を執筆しました。
他に要望がありましたら、ご相談してください。
(編集者:木庭 正博)












