シリアルインターフェース

マイクロコントローラーにはいろいろな種類のシリアルインターフェースが集積されています。当社はCPUとして高性能のARM Cortex™-M3コアを採用したTX03シリーズを展開していますが、そのシリーズの中でM360グループは、SIO、UART、SSP(SPI)、I2C、USB2.0、CAN、および、EtherMACのシリアルインターフェースを選択的に搭載した製品群です。これらのシリアルインターフェースの概略を紹介します。

同期式、または非同期式インターフェース

同期式(Synchronous)インターフェース

シリアルインターフェースは、1本、または、2本の信号線を通して、バイナリー・データ(「1」または「0」)を連続して送信したり、受信したりするものです。

基本的なシリアルインターフェースは送り手が1つ、受け手が1つで、その間に信号線とクロック線が1本づつ繋がっています。信号線にはデジタル・データが連続して流れ、そのデータの各ビット・データを受け手が確実に捕まえることができるように、一定の周期のクロック信号が送り手と受け手の間のクロック線上を通ります。

1ビットのデータの時間幅はクロックの1周期分であり、クロックの立ち下がりエッジでそのデータを捕らえることができます。このように、送信されるデータと、そのデータのタイミングを決めるクロックが、異なる配線に伝達される方式を「同期式(Synchronous)」と呼びます。同期式の利点は明らかです。クロックのエッジでデータを容易に捕獲できる点です。

si_fig01
si_fig02

非同期式(Asynchronous)インターフェース

同期式インターフェースは非常に簡便な方式ですが、ノイズに弱いという欠点があります。1ビットのデータはクロックに「同期」して送信され、同じクロックで受信されますが、送信中にクロックにノイズが乗った場合、データの取り間違いが起こります。たとえば、クロックが high level であったときにノイズにより一瞬 low levelになり、また、high level に戻るようなことがあった場合、本来なら1つのクロックが2つのクロックとして感知されます。データ受け取り側はクロックの数を数え間違って1つ早く受信を終えてしまいます。転送クロックを配線に出力するときは常にこのノイズ問題が生じると思わなければなりません。

si_fig03

このノイズ問題の対策方法の一つは「クロックを出力させないこと」です。クロック配線が無ければクロックにノイズが乗ることはありません。

si_fig04

ところが、クロックが出力されないために、データの取得のタイミングがわからなくなってしまいます。これでは、通信ができなくなるわけですから、せっかくノイズ対策をしても意味がありません。そこで、データ取得のタイミングを見つけるために次のような方法を取ります。

(1) 送信クロックよりも早いクロックでデータを取得する。
(2) データの送信に当たって、送信開始、および、送信終了を明確にする。

データの送信クロックの周波数よりも高い周波数、たとえば4倍早いクロックでデータを受信します。そして、「1」または「0」の、同じ値が3回、または、4回連続して到着したら、その値は送信された真のデータ値だとみなす、という方法を使います(4倍早いクロックというのは一例で、16倍の周波数のクロックが使われることもあります)。

また、データを受け取る側は、いつデータがやって来るかはわかりませんので、送信データの直前に送信開始(データ「0」)の信号を1ビット、また、送信データの最後に送信終了(データ「1」)の信号を1ビット付加して、開始と終了の合図にするのが一般的です。

このように、データ送信時にクロックを転送しなくてもよい方式を「非同期式(Asynchronous)」と呼んでいます。非同期式は同期式に比べノイズに強いのですが、受信側の回路がより複雑となります。

si_fig05

データ・フォーマット

シリアル通信では送受信データの順序に意味を持たせるものが一般的です。たとえば、通信開始を表す特別なコードを先頭に付け、その次に送り側のアドレス、さらに、受け取り側のアドレス、その後、送信データ、および、エラー検出用のコード、最後に終了を表すコード、というように、送信するデータだけでなく、その前後に特別な役割を持つコードを付加します。このように、どの位置にどのコードが置かれるかを決めたものがデータ・フォーマットです。

電車を例にとってみましょう。電車には運転手のいる運転用の車両、一般客車、優先車(近頃ですと女性専用車など)、食堂車、料金の高い特別車など、いろいろな車両があります。これらを組み合わせて一組の列車を作り上げますが、どの車両を先頭から何番目に繋ぐかは一定のルールがあります。運転車両を列車の途中に持ってくるとか、食堂車を最後尾にすることなどありません。車両の並びは列車を走らせる鉄道会社が決めるのでしょうが、一般の利用客も列車の順序を理解していて、自分の乗りたい車両が止まる場所で電車を待っています。この順序がフォーマットです。もし、フォーマットを無視して、列車を好き勝手に連結したら、朝の通勤ホームは大混乱に陥るでしょう。シリアル通信も同じで、送信側がフォーマットを無視してデータを送った場合、受信側は正しく受け取ることが出来ません。決められたフォーマットを正しく理解して初めてシリアルインターフェースを使用することができます。

マスターとスレーブ

シリアルインターフェースはデジタル・データを転送するために使われますが、データを転送するということは、データを送る側と受け取る側の、最低2つの「関係者」がいることになります。2つのうち、指令を出す方をマスター(ご主人様)、指令を受ける方をスレーブ(使用人)と呼びます。(指令を出す・受け取るいう関係であって、データの送信・受信の関係ではありません。)

このマスター、スレーブの関係が重要になるのは、通信する相手が大勢いる場合です。同一のデータ線を使いますので、もし、各インターフェースが好き勝手にデータを送信したり、データを受信したりするととんでもないことになります。そこで、1つだけがマスターとなり全体を「仕切る」必要があります。他はスレーブとなりマスターに従うわけです。送信データはマスターからスレーブ、または、スレーブからマスターの間を行き来します。スレーブからスレーブへのデータ送信はできません。

このマスター、スレーブ方式には2つの異なるシステムがあります。一つはデータ線を共有している全てがマスターになることができる(もちろん、同時に二つ以上はマスターにはなれません)ものと、マスターはすでに決定していて、追加できるのはスレーブだけ、という構成です。前者のシステムでは、各送受信インターフェースが、1本のデータ線にそれぞれが並列に接続されます(並列型)。一方、後者はマスターを中心にスレーブがそれを取り囲む格好となり、スレーブ同士を繋ぐための通信線はありません(スター型)。

si_fig06
si_fig07

スター型はマスターが始めから決まっていますので問題はありませんが、並列型の場合、誰がマスターになるかを決める必要があります。その決め方にはいろいろな方式がありますが、それぞれのインターフェースに優先順位を付けておき、2つ以上のマスター候補があった場合、優先順位の高い方がマスターになる、とする方法があります。これにより、マスター争奪の醜い争いは避けられます。

実は、同時に2つ以上のマスターが存在しても良いというシリアルインターフェースがあります。これについては、次章の I2C の項を参照してください。

拡張性

並列型シリアルインターフェースでは1本のデータ線に多くのインターフェースが繋がります。しかしながら、いくつでもいいとは行きません。データ線にあまりに多くのインターフェースが接続されますと転送スピードが落ちてしまったり、データ線の争奪で優先順位の低い方はいつまでたってもマスターになれない、ということが起こります。そこで、せいぜい 128個までとか、256個までとか、上限値があります。

一方、スター型シリアルインターフェースの方は階層構造を使って拡張性を維持しています。マスターとスレーブの間に「ハブ」と呼ばれる拡張のためのバッファーを置いてスレーブの数を増やします。ハブはさらに下位のハブを持ち、階層を深くすることにより多数のスレーブをマスターがコントロールできるようにします。ただし、ハブの階層もいくらでも行けるわけではなく、多くても5段までというシステムもあります。

si_fig08

通信エラー対策

シリアルインターフェースに限りませんが、長い距離、データを転送していると、受信したデータが送信されたデータと異なってしまうことがあります。それはデータ線上にノイズが乗ったせいもあれば、インターフェース間のマスター争奪戦の結果データのぶつかり合いが起こったり、いずれかのインターフェースが故障したりしているなど、いくつもの原因が考えられます。

ノイズによるデータ・エラーの対策にはいくつかの方法があります。すでに紹介しましたが、クロックに乗るノイズを回避するためにクロックを出力しない非同期方式があります。一方、データ線のノイズ対策としては、送受信に相補データを用いる2線方式があります。これは1ビットのデータを転送するために2本の信号線を使い、データとその相補データ(データが「1」のとき相補データは「0」、データが「0」のときは相補データが「1」)を同時に転送し、その2つのデータ線の「電位差」をデータとするという方法です。

また、受信データにエラーがあるかないかをチェックする方法もあります。簡単な例はパリティー・チェックで、データの最後に1ビットのパリティー・ビットを追加して、データに含まれる「1」の数を常に偶数にしておき、「1」の個数が偶数かどうかを受信側で判定をするものです。

パリティー・チェックをもっと高度にしてエラーの検出度を高めた方法としては CRC (Cyclic Redundancy Code) が一般的に使われます。これはシリアル・データの値に応じてある計算(たとえば足し算)を行い、その計算結果(8ビットや16ビットのデータ)の「2の補数」をデータの最後に追加して送るものです。受信側はデータと CRC をそのまま使って計算(足し算)を行い、結果がある値(たとえば「00000000」)になれば転送エラーは無かったと判断します。もし、転送エラーが確認された場合は、送信側はもう一度同じデータを送ることになります。

このようにシリアルインターフェースには、さまざまな特徴があります。それぞれのインターフェースの説明は次章で行いますが、今、話題にしている SIO、UART、SSP (SPI)、I2C、CAN、USB2.0、および、EtherMACのそれぞれの特徴を比較してみました。

si_fig09_2

ご検討の方へ

技術的なお問い合わせ

お問い合わせ

お問い合わせ

よくあるお問い合わせ

FAQ