2019年09月19日 | 更新。 |
UART(Universal Asynchronous Receiver/Transmitter)は、調歩同期方式のシリアル信号をパラレル信号に変換したり、その逆方向の変換を行うための回路です。UARTには、パラレルからシリアル、あるいはシリアルからパラレルの変換をするための、シフトレジスタが内蔵されています。また、ほとんどのマイコンには、周辺回路としてUARTが組み込まれています。
CPUはパラレルのデータバスを持っていますが、周辺機器や他のCPUとの間でパラレルデータバスのまま情報を通信しようとすると、配線が多くなってしまいます。高速に通信する必要がない場合は、送信時にパラレル-シリアル変換を行い、受信時にシリアル-パラレル変換を行う事により、通信をシリアルバスで行う方が、配線が減って有利です。
UARTはこの様に、CPUと、周辺機器や他のCPUとの通信の際に、シリアルバスを使う目的で使われます。
UARTを改良し、クロック同期方式の通信(SPI等)にも対応できるようにした物(もちろん調歩同期式の通信もできる)をUSART(Universal Synchronous Asynchronous Receiver/Transmitter)と呼びます。
UARTは、パソコンの黎明期においては、RS-232C規格に準拠した信号レベルへの変換回路と併用して、パソコンとモデム等の周辺機器(場合によっては他のパソコン)をつなぐインターフェースとしてよく使われていました。
現在では、パソコンはUSB(Universal Serial Bus)の接続ポートを標準的に持つ様になり、また数多くの周辺機器がUSBに対応しているため、通信速度が遅く、対応できる機器の種類の少ないUART(およびRS-232C)は、パソコンではほぼ使われなくなりました。
USBの躍進とUARTの衰退の大きなきっかげが、Windows 95がプラグアンドプレイに対応した事です。
プラグアンドプレイに対応したパソコンと周辺機器を使うと、パソコンの電源投入後にでも周辺機器をパソコンに接続できる様になりました。
プラグアンドプレイ以前は、必要な周辺機器は先にパソコンに接続してから、パソコンの電源を投入するのが常識でした。というのは、プラグアンドプレイ以前のパソコンには、UART等のインターフェースの先に、周辺機器がつながっているのか、あるいはつながっていないのかや、どんな種類・機種の周辺機器がつながっているのかなどを知る方法がなかったからです。
当時は、接続した周辺機器をパソコンに教えるために、設定ファイルを編集したり、使っているアプリケーションソフト上のメニューで、つながっている周辺機器を選んだりする必要がありました。また、電源投入後に周辺機器を接続すると、周辺機器が適切に初期化されない事がありました。
プラグアンドプレイの技術が開発されてからは、USB等のインターフェース経由で周辺機器をパソコンにつなぐと、いつつながったかや、どういう種類の周辺機器で、どのメーカーで、どの型番の周辺機器がつながったか等の詳細な情報が、周辺機器からパソコンに通知される様になりました。その通知に従って、パソコンは適切なデバイスドライバを使ったり、メモリなどの必要なリソースを割り当てたり、周辺機器の初期化処理をできるようになったのです。
パソコンではUARTが使われる事は極めて少なくなりましたが、現在でも、組み込み機器内部の通信用には、UARTがよく使われています。その理由は、UARTの単純さにあります。
UARTを使う場合は、接続先の周辺機器(あるいは他のCPU)を、UARTを制御するCPUがあらかじめ知っており、その周辺機器等との通信用のプログラムが用意されている事が前提条件です。UART経由で後から周辺機器等がつながっても、周辺機器等がつながった事実を知る手段や、つながった周辺機器等の情報を取得する手段は用意されていません。
これは一見不便な様ですが、回路やプログラムが、USBを使った場合と比べて非常に簡単になるというメリットがあります。UARTはUSBインターフェースよりもずっと回路が小規模ですし、UARTの制御プログラムも、接続時に周辺機器等の種類等を通知するなどの複雑な通信手順を持たない分、かなり単純になります。
コスト重視のマイコンにはUSBインターフェースが載っていない場合も多いですし、USBインターフェースを内蔵したマイコンは一般に高価です。
そういう訳で、通信相手があらかじめ決まっている組み込み用途には、回路のコストが下がったり、プログラムの開発工数が下がるという意味で、UARTが有利なのです。
現在でも、マイコンボードにプログラムを書き込むために、USBシリアル変換器を使って、パソコン⇔USB⇔USBシリアル変換器⇔UART⇔マイコンのCPUというルートで、通信を行う事があります。この場合、接続したマイコンの種類をパソコンのソフトで指定する必要がありますが、これは、UARTの先につながっている機器を確認する方法がない事によります。(どんな種類のUSBシリアル変換器がつながっているかまでは、パソコンは知っています)
最小構成の場合、UARTの入出力線は、CPU等に接続するためのパラレルバスと、他のUARTに接続するためのTX、RXの2本の信号線からなります。(図1参照)
参考:TXはTXDと表記する事があります。またRXはRXDと表記する事があります。
パラレルバスは、マイコンのCPU等に接続されており、このパラレルバス経由で、CPU等がUARTの初期化を行ったり、シリアルバスへ送りたいデータを書き込んだり、シリアルバスから届いたデータを読み取ったりします。
TX(Transmit Data)の信号は出力信号で、他のUARTに、調歩同期方式のシリアル通信でデータを送信します。
RX(Receive Data)の信号は入力信号で、他のUARTから、調歩同期方式のシリアル通信でデータを受信します。
2つのUARTを接続して双方向通信をする場合の結線は、図2の様になります。
一方のUARTにとっての送信信号線は、他方のUARTにとっての受信信号線になるので、一方のTXを他方のRXと接続します。
この様に、送信用信号線と受信用信号線を互い違いに結線する方法を、クロス結線といいます。また、UART(あるいは他の通信インターフェース)を使う、別の筐体に収められた2つの機器同士をクロス結線するためのケーブルを、クロスケーブルといいます。
参考:2つの通信機器の同じ番号のピン同士を結線する事をストレート結線といい、別の筐体に入った2つの通信機器をストレート結線するためのケーブルをストレートケーブルといいます。クロスケーブルは、例えばパソコンとパソコンなど、対等な機器同士の通信に使われますが、一方でストレートケーブルは、例えばパソコンと周辺機器など、制御する側と制御される側という具合に、非対称な関係の機器同士の通信に使われます。
図1の様な最小構成のUARTでは、CPUが他の処理をしていて、受信の準備ができていない時にデータを受信すると、そのデータを取りこぼしてしまう恐れがあります。あるデータを受け取ってから、次のデータが到着するまでに、CPUがUARTから受信データを読み取らないと、データの取りこぼしが発生するため、通信速度が速くなるほど、取りこぼしの危険性が上がります。(ただし、受信データを格納しておくためのFIFOメモリを搭載しているUARTでは、FIFOメモリがあふれるまでにCPUがデータを読み出せばいいので、高速通信への対応が容易になります)
この様な取りこぼしが発生しない様に、受信の準備ができていない場合は、通信相手のUARTにデータの送信を許可するための信号線を付け加える場合があります。通信相手のUARTにデータ送信を許可するための信号線をRTS(Request To Send)、通信相手のUARTから来たデータ送信の許可信号を受け取るための信号線をCTS(Clear To Send)と呼びます。図3に、RTSとCTSを付け加えた場合のUARTの入出力線の図を示します。
参考:RTS、CTSは負論理信号なので、それぞれRTS、CTSという信号名になる事があります。RTSをあえて正論理で解釈すると、通信相手にデータの送信を「禁止」するための信号になります。
この図において、RTSは出力信号です。RTSには、CPUがデータの受信が可能な場合にLを出力し、CPUが他の処理で忙しく、データの受信の余裕がない場合にHを出力します。
またCTSは、通信相手のUARTのRTS信号を受け取る入力信号です。CTSがLの場合、TXから新しいデータを送信できますが、CTSがHの場合は、CTSがLになるまで、データの送信を待機します。
RTSとCTSの信号線がある場合は、図4の様に、一方のUARTのRTSが他方のUARTのCTSにつながる様に結線します。
受信側の装置の受信準備ができていない時に、送信側に合図を送り、送信を待ってもらうことで、データの取りこぼしを防ぐ制御を、フロー制御といいます。
図4の様に、RTSとCTSの信号線を使う事でフロー制御する方式を、ハードウェアフロー制御といいます。
ハードウェアフロー制御では、フロー制御用の信号線が増えてしまうという欠点があるため、図2の様なTXとRXのみの結線のまま、通信禁止や通信許可の合図をTXの信号線に載せてフロー制御する方法もあります。この様なフロー制御の方式を、ソフトウェアフロー制御といいます。ソフトウェアフロー制御では、フロー制御用の文字コードを決め、その文字コードはフロー制御以外の情報送信には使わない様にする必要があります。そのため、送信する情報を、フロー制御用の文字を使わない様にエンコーディングする必要があり、ソフトウェアの設計が複雑になったり、CPUの負荷が増えたり、データ伝送の効率が落ちたりする欠点があります。
ソフトウェアフロー制御において、送信許可の文字コードはXONと呼ばれ、ASCIIコードの17番(11H)を使うのが一般的です。また送信禁止の文字コードはXOFFと呼ばれ、ASCIIコードの19番(13H)を使うのが一般的です。