シリアルインターフェースのSIO、UART、SSP(SPI)、I2C、CAN、USB2.0、および、EtherMAC について、それぞれの通信方式を簡単に説明します。なお、各シリアルインターフェースにはモードが複数ありますが、ここでは、代表となるモードを一つだけ取り上げます。従って、異なるモードでは説明が正しくないこともありますのでご了承ください。詳細は東芝のデータシート、その他の解説書、専門書等をご参照ください。
シリアルインターフェースの中で、もっとも基本的な構成が SIO です。マスターとスレーブが1対1で接続され、その接続線は転送クロックと転送データの2本です。マスターかスレーブかの選択はあらかじめレジスターで設定しますが、クロック(SCLK)を出力する方がマスターです。データ転送の前に、データ端子の一方が出力(TXD)、他方が入力(RXD)となるように設定します。
8ビットのデータを転送するときは、8個のクロックが出ます。そのクロックに同期してデータを送信、または受信する同期式インターフェースです。マスターはスレーブにデータを送信したり、スレーブから受信したりしますが、その指令は「クロックを出す」ことでスレーブに伝わります。データの転送方向はあらかじめ決まっていますので、マスターは必要に応じてスレーブにクロックを出力し、そのクロックに同期してスレーブとの間でデータ送信、または受信を行います。
送信データは8ビットが一般的ですが、データの最後にパリティー・ビットを追加して全体を9ビットのデータとすることもあります。この場合、パリティー・ビットが後からやって来ますので、それは前もって受信側にパリティー・ビット付きという設定をしておく必要があります。
見かけだけで言うと、SIO からクロック信号を削除したものが UART です。クロック信号を繋がないのはノイズによる通信エラーを防ぐのが目的ですが、その結果、SIO には無い、やっかいなことが起こります。SIO では、マスターが指令を出すのはクロックを出力すること、となっていました。クロック信号の無い UART ではこの指令は受け取れません。ということは、データ受信側はいつ送信されるかわからないデータを、いつでも正しく受け取ることができるように待っていなければなりません。
そこで、送信側は通信開始と終了がわかるように、転送データに印をつけます。具体的には、転送データの直前に転送の始まりを表すスタート・ビット(値は「0」)と、最後に終わりを表すストップ・ビット(値は「1」)を追加します。
送信側と受信側は、あらかじめ決められていますので、データ線(通常は「1」になっている)に「0」が出ると、受信側はデータがくるぞ、と受信の準備をします。受信中は送信側からのクロック信号は無いため、たとえばデータ「0」が2回続けてきた場合、1個のデータの長さ(時間)がわかりませんと、1つの「0」のデータなのか、2つのデータ、つまり「00」なのかがわからなくなります。そこで、送信側と受信側で申し合わせをしておきます。実際の一例では、データ送信のクロック周波数が決まったら、受信側はそのクロック周波数の16倍の周波数のクロックでデータを受信する、としています。受信側は、スタート・ビットを検出すると、そこから、16クロック毎にデータがやってくると見なすわけです。
UART でも SIO と同じように、送信データの最後(ストップ・ビットの前)にパリティー・ビットを付加することができます。
UARTは、相手が1つとは限らず、多数のインターフェースを接続することが出来ます。その場合、1つだけマスター、他はスレーブという区別を付けます。また、送信データを正しく受信できたかどうかを、受信側から送信側に知らせるハンド・シェーク機能もあります。
SSP は同期式シリアルインターフェースを代表する言い方で、いくつかの異なる方式の総称です。そのうちの一つ、SPI はマスター1個に対してスレーブを多数接続できるシリアルインターフェースです。マスターは1つだけ固定されていて、多数のスレーブとの接続はスター型となります。データ転送のためにマスターが出力する線と、マスターが入力する線の2本の信号線を使用しています。こうすることにより、送信データと受信データが衝突することがないため、スレーブの制御が簡単になります。スレーブを多数必要とするシステムを実現する、簡便な方法の一つです。
クロック(SPCLK)のほかに、マスターからスレーブにデータを送信するための信号線 SPDO、および、マスターがスレーブからデータを受信するための信号線 SPDI がスレーブ全体とマスターの間に接続されます。ただし、スレーブの SPDOはマスターのSPDIに、スレーブのSPDIはマスターのSPDOに接続します。さらに、多数あるスレーブのうちの一つをマスターが指名するための SPFSS (Slave Select) 信号があります。マスターにはスレーブの数と同じだけの SPFSS 出力が必要となります。
スレーブが多数存在するにもかかわらず、クロックとデータのわずか2本の信号線だけでシリアルインターフェースを実現するのが I2C です。しかも、I2C ではマスターが1つと限らず、複数存在できます(マルチマスター構成)。それぞれのインターフェースをマスターにするか、スレーブにするかは、各インターフェースに内蔵されたレジスターで設定します。クロック信号がありますので同期式インターフェースです。
マルチマスター構成を実現するために、I2Cはクロック信号とデータ信号に特殊な仕組みを持っています。それは、各インターフェースのクロック、および、データの出力は「0」だけとし、「1」は信号線に接続されたプル・アップを使うものです。I2C の各インターフェースの出力には NMOSトランジスターが接続され、必要に応じてオンとなり「0」を出力します。「1」を出したいときは、NMOS トランジスターをオフさせます。すると、インターフェースの出力はハイ・インピーダンスとなります。信号線にはプル・アップ素子が取り付けてありますので、すべてのインターフェースの出力がハイ・インピーダンスであれば、その信号線はVDDまで持ち上げられ、「1」となります。これを「ワイヤード・アンド(Wired-AND)」と呼んでいます。
ワイヤード・アンドでは、データ「1」よりも「0」が強くなります。つまり、2つのインターフェースが「1」と「0」を出力しますと、信号線のデータは「0」となります。これを利用して、複数のマスター間の調停を行うことが出来ます。今、マスターが2つあり、これらのマスターが同時にデータをデータ線に出力したとします。一方は「0」、他方が「1」を出力したとき、後者は自分が「1」を出力したにもかかわらず信号線が「0」となったことで、自分以外にデータを出力しているマスターがいることがわかります。そうなると、今回はお休み、と自主的にデータ出力を控えます。しばらくして、他のマスターが送信を終えたころを見計らってデータ送信を行います。このようにして、マルチマスター構成が可能となっています。
CAN は自動車の中のネットワークに使われているシリアルインターフェースです。その特徴はデータ信号線を2重にしてノイズの影響を極力受けないようにした点にあります。クロックは出力されません。I2C と同じようにわずか2本の信号線でネットワークが構成されますが、I2Cと異なり、非同期式です。
2重のデータ信号線は CAN.H、および CAN.L と呼ばれ、この2つの信号の「電圧の差」がデータとなります。CAN.H が高電位で CAN.L が低電位のときが「0」、CAN.HとCAN.Lが同電位のときを「1」と定義します。2つの信号線にノイズが乗っても、電位の差の有無がデータとなるのでノイズの影響を最小限に抑えることができます。
クロックが出力されないため、各インターフェースの間で同期を取る必要があり、マスター、および、スレーブの区別はありません。従って、データ出力が信号線上で衝突する可能性がありますので、各インターフェースに優先順位を決める必要があります。
インターフェース間の同期の取り方は次の通りです。データを出力しようとするインターフェースは、最初に「0」のスタート・ビット(1ビット)を出力します。それ以前はどのインターフェースも出力をしていない状態ですので、データ線は「1」でした。他のインターフェースはこのスタート・ビットの「0」の始まりを検出して同期を取ります。それだけでなく、データ転送中に同期を確実に取るために、ビット・スタッフィングというテクニックを用います。「0」または「1」が長い間続くと、データ信号は変化せず、同期合わせができなくなり、いつかは同期がずれてしまいます。そこで、5個、同じデータが続いたときは、わざと異なるデータを1ビットだけ挟みます。こうすることによりデータに変化(エッジ)が生じますので、ここでまた同期の取り直しができます。もちろん、この追加ビットは、データとしては意味がありませんので、受信側で受信データから削除されます。
CANでは各インターフェース出力の優先順位を決める必要があります。そのため、スタート・ビットの次に Identifier (11ビット) が出力されます。この値が優先順位を決めます。実は、CAN のデータは I2C と同じように、データ信号線で「1」と「0」の二つの出力がぶつかった場合は「0」が勝つようになっています。2つのインターフェースが同時にそれぞれ異なる Identifier を出力した場合、「1」を出力したインターフェースはデータ信号線が「0」になっていることを知ると、優先順位の高い方に信号線の使用権を譲ります。その結果、優先順位の高いインターフェースのデータ転送が行われます。
USB2.0 はパソコンを主体として、非常に普及したシリアルインターフェースです。よく知られている通り、用途は多岐にわたり、キーボード、マウス、プリンター、フラッシュ・メモリー、HDD、スピーカーなどのインターフェースとして使われています。
USB2.0 には3種類の転送スピードがあります。Low Speed (1.5 Mbps)、Full Speed (12 Mbbs)、および、High Speed (480 Mbps) ですが、当社の TX03 シリーズの USB2.0 インターフェースは、Full Speed に対応しています。
USB2.0 ではインターフェースのマスター、スレーブを、それぞれ「ホスト」、「デバイス」と呼んでいます。USB2.0 は1つのホストが多くのデバイスをコントロールするスター型です。パソコンを例に取りますと、パソコン本体がホストであり、USB2.0 で本体と繋がっているマウス、キーボード、メモリー、マイク、スピーカーなどがデバイスとなります。
USB2.0 の特長としてプラグアンドプレーが上げられます。パソコンの USB 端子に USB メモリーを差し込んだり抜いたりするときに、いちいちパソコンの電源を落とさなくても済みます。この簡便さが USB が普及した理由の一つです。
このように、ネットワークにデバイスが繋がったり離れたりできるようにするために、ホストがいろいろな仕事をします。あるデバイスが USB2.0 のネットワークに接続されると、デバイスはホストにリクエストを出します。リクエストを受けて、ホストは新しく接続されたそのデバイスの情報を入手し、最適なドライバーを選択したり、そのデバイスにアドレス番号を付与したりします。これをエニュメレーション(enumeration) と呼びます。エニュメレーションが成功した後、ホストはデバイスを正しくアクセスできるようになります。
ホストがコントロールできるのは、ハブとデバイスを合わせて127個までです。また、ネットワークにハブが入る場合、直列に接続できるハブは5段までとなっています。
USB2.0 の信号線は一組4本からなっています。電源(VDD)、接地電位(GND)、信号 D+、および、信号 D- です。CAN と同じように信号線は2本一組になっていますが、CANと異なり、データは互いに相補的な値を取ります。つまり、D+ が high level で、D- が low level のときが「差動1(Differential 1)」、反対に、D+ が low level で D- が high level のときを「差動0(Differential 0)」としています。ただし、実際に転送されるデータの波形は差動1、差動0ではありません。データ転送にはNRZI (non-return to zero inverted) というフォーマットが使われています。これに従いますと、1クロックの間に信号の変化が無かったときはデータ「1」、変化(0→1、または、1→0)があったときはデータ「0」となります。
USB2.0 インターフェースにクロック信号はありません。非同期式です。従って、CAN と同じようにクロック同期の問題を解決する必要があります。USB2.0の full speed では、クロックを同期させるため送信データの先頭に 8 ビットのSYNC パターンがあります。これにより受信側は送信側のクロックと同期を取ることができます。データ転送の途中の同期合わせにはCAN と同じようにビット・スタッフィングを行います。NRZI フォーマットではデータ「1」が続きますとデータ信号に変化が起きません。USB2.0では、「1」が6回連続すると「0」を1ビット挿入します。
EtherMAC はEthernet の一部分です。Ethernet そのものは非常に複雑な構造をもっていますので、簡単に説明することは困難です。従って、今回の説明は Ethernet のごく一部でしかありませんが、今まで紹介してきたいろいろなシリアルインターフェースとの違いを概説します。
Ethernet の Ether は「イーサー」と発音しますが、もともとは「エーテル」と呼ばれる、物理学で定義された「物質」でした。宇宙空間を埋め尽くしていると考えられた物質で、結局は存在が否定されました。ただ、「どこにでも存在するもの」ですので、それがこのネットワークの命名の元となったようです。
Ethernet は大きく言って4つの層からなっています。下の方から、物理層、データリンク層、ネットワーク層、上位層となりますが、EtherMAC は最下層の2層、つまり、物理層とデータリンク層を対象とします。
Ethernet では出力と入力で信号線が異なります。出力用に2本、入力用に2本、合計4本の信号線が用いられます。入力と出力用のそれぞれ2本のペア信号線は「撚(よ)り対線」となり、シールドがありませんが、ノイズに強い構造となっています(Unshielded Twisted Pair: UTP)。なお、クロック信号は出力されません。非同期式インターフェースです。
現在、Ethernet で最も普及しているのは 100Base-TX というインターフェースですが、Ethernet をより容易に理解するために、それより古い世代である 10Base-T について説明します。10Base-T は、転送レートが 10Mbps で、Base Band、ツイスト・ペア・ケーブルというインターフェースです。
信号にはマンチェスター符号を使っています。マンチェスター符号は、データ信号の変化の方向でデータ「1」とデータ「0」を決める方法で、low level から high level へ変化するものがデータ「1」、反対に、high level から low level に変化するものがデータ「0」と決められています。
Ethernet も CAN やUSB2.0 と同じように、データ通信にクロック信号を出力しませんので、受信側が同期を取る必要が出てきます。マンチェスター符号では、「1」、および、「0」のいずれも信号の変化がありますので、同一のデータが連続した場合でも、CAN や USB2.0 で使われたビット・スタッフィングをする必要がありません。ただし、データの転送開始時に、送信側は同期を取るためだけに、56ビットのパルス・データを出力します。受信側はこの時間内に同期を取ります。
Ethernet インターフェースには、USB2.0のようなホスト、あるいはデバイスといった上下関係がありません。Ethernet の各インターフェースは信号線が空いているのを見てデータを出力します。信号線にどこかのインターフェースが出力していた場合、今、出力をしようとしているインターフェースは信号線が空くまで待ち、その後、送信を開始します。ところが、早いもの順のこのシステムでは、異なる2つ以上のインターフェースがほぼ同時にデータを出力した場合に問題が起こります。どちらが先だったかわからないとき、まず、どのインターフェースも出力を停止します。すると信号線が空きますので、それぞれのインターフェースは、また出力しようとします。すると、またしても、同時出力が起こってしまい、各インターフェースは出力を停止します。これを繰り返していると、いつまでたってもデータの送信ができませんので、Ethernet にはこの問題を回避する仕組みが備わっています。それは、同時出力が発生した場合、各インターフェースに対して、次に出力開始するまでの待機時間を乱数で決めるものです。こうすると、次に同時に出力するインターフェースの数は極端に少なくなるはずです。それでも、また衝突が起こった場合は、同じように乱数で待機時間を決めます。何回やっても衝突が起こった場合、最大16回までトライすることになっています。USB2.0 と違って、全体をコントロールするホストがいないため、お互いの責任においてデータ通信をさせるための仕組みです。