【マイコン講座】シリアル通信 はじめの一歩と"落とし穴"
........
- 更新日
- 2024.07.22
- 公開日
- 2023.10.20
本記事では、マイコン初心者のエンジニア向けに理解しやすいように、UART、SPI、I2Cの特徴を比較し、よくある落とし穴/注意すべきポイントを解説します。
1. シリアル通信とは?
シリアル通信とはデバイス間の通信方式の1つで、1本の伝送路で1ビットずつデータを送信する方式のことでパラレル通信と対比されます。
シリアル通信の規格には、I2S(デジタル音声信号を伝送する標準規格)、SATA(外部記憶装置を接続する標準規格)、PCIe(高速伝送の規格)など特定用途に特化した通信方式もありますが、本記事では一般的なシリアル通信(UART、SPI、I2C)について解説します。
まずは、シリアル通信を理解するうえで重要な用語から理解を深めていきましょう。
1-1. 半二重通信と全二重通信
・半二重通信
1つの伝送路で送受信の両方を行う通信方式です。
送信と受信を同時に行うことが出来ませんが、信号線が1本で済むというメリットがあります。このメリットは、信号線の長さが長くなるほど大きくなります。また、無線LAN通信のような電波を用いた通信方式は同周波数で通信することで混信するため半二重通信となっています。
・全二重通信
2つの伝送路で送受信を別々に行う通信方式です。
送信と受信を同時に行うことが出来るため、伝送効率でメリットがあります。
1-2. 同期通信と非同期通信
・同期通信
デバイス間で共通のクロックを用いて通信を同期させる通信方式です。
クロックは信号線を用いて、マスタからスレーブに共有されます。転送レートを上げやすいというメリットがありますが、回路やケーブルが煩雑となることやクロック信号線とデータ線の配線長の差から発生する誤差を考慮する必要があります。
・非同期通信
デバイス間で事前に通信速度を決めておき、各々がデバイス内で独自クロックを持つ通信方式です。
同期用の信号線がないため、自由なタイミングで情報の伝達が可能というメリットがありますが、送信側と受信側で発生するクロック誤差を考慮しておく必要があります。
1-3. シングルエンドと差動
・シングルエンド/不平衡
基準となる電圧と信号線の電圧を比較して、高い場合はHigh(1)、低い場合はLow(0)として表現する通信方式です。
信号線が1本で低コストということもあり広く普及していますが、ノイズの影響を受けやすいため信号線の長さが限定されます。
・差動/ディファレンシャル/平衡
2つの信号線の差分からHigh(1)、Low(0)を判別する通信方式です。
信号線が2本必要となりますが、ノイズの影響を受けにくいため信号品質は安定します。
2. UART
2-1. 概要
UART(Universal Asynchronous Receiver/Transmitter)はデバイスとの通信でよく使用されており、非同期、全二重、シングルエンドでデータ通信を行います。
通信速度はボーレートと呼び、[bps](bit per second)という単位で表記されています。これは、1秒間に何ビットのデータ通信が行われるかを表しており、115,200bpsの場合、1秒間に115,200ビットを通信することが出来ます。
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が考えられます。
- 「ボーレートを決定 ⇒ ボーレートを設定」
デバイスの周辺機能に供給されているクロックの影響などで設定自体が困難な場合のように、ボーレートを設定する段階で生じる誤差
(例:115,200bpsを設定したいが、どれだけ近づけても115,400bpsまでしか近づかない。) - 「ボーレートを設定 ⇒ データ出力」
デバイスの水晶発振子の精度によって周辺機能に供給されるクロックの誤差から生じる誤差、伝送路の長さから生じる誤差
水晶発振子の誤差や伝送路から生じる誤差は見落としがちですが、事前にデータシートなどで確認しておく必要があります。また、何か問題が発生した際は自身が設計するデバイスに意識が向きがちですが、通信相手がいることも忘れてはいけません。相手側のボーレート誤差を考慮出来ているかも考える必要があります。
では、誤差はどれくらいまで許容されるのかについて説明します。
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. まとめ
3種類の基本的なシリアル通信について説明しました。
それぞれ特徴がありますので、記事を参考に理解を深めていただければと思います。
この記事を書いたエンジニア
古澤禎崇 Yoshitaka Furusawa
これまで4年間、ルネサスエレクトロニクス製のマイコンを中心に民生機器の開発を行っておりました。 今は、開発での経験を活かして自社製品(液晶ユニット)に関わる業務を行っています。新人の頃に苦労した経験を共有出来ればと思い、この記事を執筆しました。
他に要望がありましたら、ご相談してください。
(編集者:木庭 正博)