本記事では、UARTの仕組みと動作原理が5分で理解できるよう、分かりやすく、簡潔にまとめてあります。
✔️UARTとはなにか(仕組みと動作概要)
✔️UARTのプロトコル
✔️UARTの物理層
UARTとはなにか?
UARTとは、Universal Asynchronous Receiver Transmitterの略称で、非同期(調歩同期式)シリアル通信を行うための、シリアル/パラレル変換用ハードウエア、つまりシフトレジスタを意味します。
『非同期(調歩同期式)シリアル通信』の特徴については、こちらの記事にて『クロック同期式シリアル通信』と比較しながら、分かりやすく説明しています!
※UARTは通信規格の名称のように扱われることもありますが、誤りです。
ただし、便宜上、本記事内でも通信方式を指して『UART』と記載することがあります。
専用のICも存在しますが、マイコンのペリフェラルとして内臓されている場合がほとんどです。
例えば、マイコンのペリフェラルとして動作するUARTは、概ね下記で構成されます。
送信側のマイコン:CPUが送信用のデータレジスタにデータを書き込むと、シフトレジスタを介してシリアルデータが所定のフォーマットで出力されます。
受信側のマイコン:所定フォーマットのシリアルデータを受信すると、シフトレジスタを介して受信データレジスタにデータが書き込まれ、それをCPUが読み取ります。
これら、送信/受信レジスタ、シフトレジスタおよび、その周辺回路を含むハードウエアの総称をUARTといいます。
UARTの接続
UARTは、方向の固定された送信線と受信線をもつ全二重方式で通信します。
マスターやスレーブのような関係性は無く、どちらからでも通信を開始できます。
自身の送信ポート(TxD)を相手の受信ポート(RxD)に、
自身の受信ポート(RxD)を相手の送信ポート(TxD)に接続します。
調歩同期式の通信ですので、クロック線はありません。
フロー制御に使用する『RTS』、『CTS』の接続については後述します。
フロー制御を使用しない場合はこれらの線を接続しなくてもUART通信は可能です。
UARTのプロトコル
プロトコルとは、通信を行うための『手順』や『ルール』を意味します。
UARTを用いた通信には、以下のプロトコルが必須となります。
・通信の開始にスタートビットを付与する
・通信の終わりにストップビットを付与する
また、トランシーバとレシーバの双方で、以下の設定を合わせておく必要があります。
・ボーレート
・パリティの有無と種類
・1回の通信で扱うデータビットの数
・フロー制御の有無
これらについて、一つずつ説明していきます。
『スタートビット』と『ストップビット』
以下、UARTにおける通信単位を『フレーム』と呼びます。
1フレームは、少なくとも、スタートビット、データ、ストップビットで構成されます。
スタートビット
UARTはクロック非同期式なので、トランスミッタがデータを送信したいとき、1フレームの開始をレシーバに合図する必要があります。
通信を開始する前(通信していないとき)、
・トランスミッタは、TxDをHighに保ちます
・レシーバは、RxDの変化がないか(High→Lowへの遷移がないか)を監視します(『通信待ち』)
通信を開始する時、
・トランスミッタは、TxDをLowにドライブします(1ビット幅以上)
・レシーバは、RxDのHigh→Low遷移を検出すると『通信開始(1フレームの始まり)』と認識します
この最低1ビット幅のLowレベル信号を、『スタートビット』といいます。
ストップビット
トランスミッタは、スタートビットに続いて、あらかじめ設定されたビット数のデータを送り終えると、TxDをHighにドライブします。
レシーバは、あらかじめ設定されたビット数のデータを受信後に、このHighレベルを検出すると、通信完了と判断し、『通信待ち』状態に戻ります。
データ送信後に出力される、このHighレベル信号(1ビットまたは2ビット、あらかじめ設定する)を『ストップビット』といいます。
あらかじめデータ長を設定するのであれば、レシーバは受信完了を認識できるのでストップビットは不要では?
通信完了後に、次のフレームのスタートビットを検出するために、ストップビットが必要になります。
ストップビットには、通信線を一度Highレベルに(通信待ち状態に)戻すという目的があります。
例えば、ストップビットが無く、データの最後がLowレベルであった場合、そのLowレベルが前フレームの最終データなのか、次フレームのスタートビットなのか、判断がつかなくなります。
ボーレートの設定
ボーレートは、UART通信における通信速度を表すパラメータ(1秒あたりに転送するビット数)です。
ボーレートは任意の値を設定可能ですが、9600bps(bit per sec)、19200bps、38400bps、57600bps、115200bps、が一般的です。
似たような用語に『ビットレート』がありますが、意味が若干異なるため、注意が必要です。
- ボーレート:1秒あたりに転送する全ビット数(制御ビット※を含む)
- ビットレート:1秒あたりに転送するデータビットの数(制御ビット※を含まない)
※制御ビットとは、転送したいデータとは別に、通信プロトコル上必要となる冗長ビット。
UARTでは、『スタートビット』、『ストップビット』、『パリティビット(後述)』のこと。
マイコンに内蔵されるUARTは、マイコン内で生成されるペリフェラル用クロック(デバイスおよびデバイスの設定により周波数が異なる)を持っていて、これを内蔵のディバイダ(デバイスによって仕様が異なる)で分周することで狙いのボーレートを生成します。
ボーレートは通信を行う双方で設定を合わせる必要がありますが、クロックの周波数や精度、ディバイダの仕様がデバイスによって異なるため、完全に一致させることはできません。
(例えば、9600bpsに設定しようとしても、9598bpsとか、9602bpsとか、ややズレた値にしか設定できません)
UARTでは、このような『誤差』は発生するものとして許容する必要があります。
言い換えれば、誤差があってもタイミングマージンを確保できるように、あらかじめ計算しておく必要があります(計算式はマイコン等、デバイスのデータシートに記載されていることが多い)。
調歩同期式通信において、連続して転送可能なデータ長を延ばせない(1バイト程度で一旦区切る必要がある)理由はこの『誤差』にあります。
この『誤差』は1ビット転送するごとに蓄積していき、連続してデータを転送していくといずれはレシーバがデータを正しく受信できなくなります。
調歩同期式シリアル通信で発生する誤差について、詳細をこちらの記事で説明しています。
パリティの設定
データビットの後に『パリティビット』を付与することで、通信の信頼性を向上させることができます。
UARTでは事前に『偶数パリティ』、『奇数パリティ』、『パリティ無し』のいずれかを設定します。
この設定も当然、双方で合わせておく必要があります。
偶数パリティ
偶数パリティは、データビットとパリティビットに含まれる『1』の数の合計が偶数になるようにパリティビットを付与する、誤り検出方法です。
例えば、データが『1001 0010』である場合、データビットに含まれる『1』の数は3つです。
よって、パリティビットに『1』をセットし、『1』の数を4つ(偶数)にします。
(1001 0010 + “パリティビット” = 1001 0010 “1”)
レシーバ側も、データビットとパリティビットに含まれる『1』の数が偶数になるはずだと分かっていますので、『1』の数が奇数であれば、エラーを検出したと判定できます。
奇数パリティ
奇数パリティは、データビットとパリティビットに含まれる『1』の合計が、奇数になるようにパリティビットを付与する、誤り検出方法です。
仕組みは上述した偶数パリティと同じで、異なるのは偶数か奇数かの違いのみです。
パリティ無し
その名の通り、パリティビットによるエラー検出を使用しない設定です。
データビットの後は(パリティビットが省略され)、ストップビットとなります。
データビット数の設定
1フレームに挿入できるデータビットの数は、通常1バイト(8ビット)ですが、7ビットや9ビットに設定できる場合もあります。
当然、双方で設定を合わせる必要があります。
フロー制御の設定
上述したように、UARTでは受信データは専用レジスタに保存されますが、CPUがこれを読み出すタイミングは任意(ソフトウエア次第)です。
もし、CPUが受信データを読み出す前に新たなデータを受信すると、内容が上書きされデータが失われてしまうことがあります。
デバイスによってはデータレジスタがFIFO(First In First Out)構造で多段階化されている場合もありますが、FIFOが満タンになったら同じことです。
このようなデータ消失を防止するため、相手が受信可能か確認してからデータを送信する仕組みを、『フロー制御』といいます。
フロー制御は、RTS(Request To Send)とCTS(Clear To Send)という2つの専用線を用いて行うため、『ハードウエア・フロー制御』ともいいます。
- RTS:通信相手に、自身が受信可能であることを伝える出力信号です。
Hレベルで『受信不可』、Lレベルで『受信可』を意味します。 - CTS:自身がデータ送信可能か判別するための入力信号です。
Hレベルで『送信不可』、Lレベルで『送信可』と判定します。
つまり、自身のRTS出力を、相手のCTS入力に、互いに接続することで、今現在受信可能かどうかを、相手に伝え合うことができます。
UARTにおいて、フロー制御は必須ではありません。
データ消失が問題にならない、あるいは、データレジスタが上書きされる前に、CPUがデータを読み取れることを、ソフトウエアで保証できるシステムであれば、フロー制御は不要(RTS、CTSを接続する必要はない)です。
UARTの物理層
冒頭に記載した通り、UARTはシリアル・パラレル変換用のハードウエアを意味します。
通信規格では無いため、物理層の取り決めはなく、デバイスの電源電圧に応じて、5V、3.3V、1.8VのCMOSレベルで動作することがほとんどです。
UARTと混同されがちな通信規格にRS232Cがありますが、これは全く異なるものです。
RS232Cは通信プロトコルではなく物理層のみを規定する規格で、厳密には調歩同期式である必要すらありません(たまたま調歩同期式を採用することが多いため、UARTと混同されます)。
コメント