第24回 SPI通信(2)

データ通信システムを拡張して、実際のSPI通信の仕様に近い形にしていきます。

目次

「シリアル通信」

今まで、2種類の通信手順でデータ通信ができることを確認しました。

ひとつは1つの信号線を使って時計を見ながらデータ通信を行う方法、もう一つはクロック信号とデータ信号の2つの信号線でデータ通信を行う方法です。


通信手順は少し違いますが、共通していることがあります。

それは、データを1ビットずつ送信していることです。

今回は3ビットのデータを扱っていますが、この3ビットのデータを1桁ずつ順番に通信しています。

このように1桁ずつ順番に通信する方法を「シリアル通信」と呼んでいます。「シリアル」は日本語で「連続」や「一列」という意味です。


データ通信の方式として、このシリアル通信と対になる「パラレル通信」という方式もあります。パラレルとは「並列」や「平行」という意味です。

シリアル通信は1ビットずつ通信しますが、パラレル通信は何ビットかのデータをまとめて一度に通信します。

今回検討しているデータ通信ステムでは、3ビットのデータを送りますので、パラレル通信の場合は次のように3本のデータ通信線により3ビットまとめて一度に通信する、という方式です。


ところで、シリアル通信とパラレル通信では、どちらが通信速度が速いと思いますか?

例えば8ビットのデータを送る場合を考えてみます。

シリアル通信であれば1ビットずつ8回送信する必要があります。

一方で、パラレル通信であれば、8ビットをまとめて1回で送信すればOKです。

このように考えると、単純計算でパラレル通信の方が8倍早そうですよね。

ところが実際にはシリアル通信の方が高速に通信できるんです

この理由について簡単に説明します。

パラレル通信では、通信速度が速くなると次のようにそれぞれの信号線を伝わるデータのスピードかずれてしまうんです

パラレル通信では複数本の信号線を使いますが、全ての信号線の電気的な特性を全く同じにすることはできません。

この「電気的な特性」が信号線により異なることが原因で、信号の伝わる速度がそれぞれの線で異なり、結果として各信号線の信号が受信側に到着する時間がズレてしまいます。

通信速度が低速の領域ではこのズレはほとんど問題になりませんが、高速になるとちょっとのズレが信号のズレになります。

ある程度の速度を超えると、パラレル通信では全ての信号線のタイミングを合わせることは非常に困難になります。

一方、シリアル通信は1ビットずつ送りますので、パラレル通信のようなズレを気にする必要はありません。1ビットの送信時間を物理的な限界まで追求できます。

その結果、現在ではパラレル通信よりシリアル通信が高速で通信ができるようになっています。(通信速度が遅い時代では、パラレル通信の方が早いので、昔はパラレル通信もよく使われていました)

データの送受信

それでは、データ通信システムに戻りたいと思います。

ここまでの検討で、クロック信号とデータ信号を使って、1Fのリビングから2Fの子供部屋に情報を送ることができるようになりました。

ところで、このシステム何か足りないですよね。

今のシステムでは、リビングから子供部屋に情報を送ることができても、子供部屋からリビングに返事ができないんです。

そこで、以下の情報を子供部屋から送るようにシステムを改装して通信手順を検討したいと思います。

  • すぐ行きます
  • ちょっとしたら行きます
  • 今忙しくて行けません

データ通信システムの改装

子供部屋からリビングに情報を送るには、一番簡単な方法としてはもう1組スイッチと電球を追加すれば大丈夫ですよね。

そこで、次のようにシステムを改装してみました。

子供部屋のスイッチを操作すると、リビングの電球を制御することができます。

この追加したスイッチより子供部屋から先ほどの返事ができるようにしてみます。

返事も電球の点滅パターンで表現しますので、電球の点灯を1、消灯を0として次のパターンを割り当てます。

点滅パターン返事内容
00すぐ行きます
01ちょっとしたら行きます
10今忙しくて行けません

これから、上のいずれかの答えを送信できるように通信手順を考えていきます。

このデータ通信システムの特徴

このデータ通信システムには、ある特徴があります。

このシステムの通信手順では、データはクロック信号の立ち上がり時の値を読むことになっています

この重要なクロック信号を制御するスイッチはリビングに1つだけ用意されています

ということは、データの通信を行う権限はリビングにいる母親しか持っていないことになりますよね。

勉強部屋からデータを送りたくても、クロック信号を制御できない以上、自らクロック信号を制御してデータを送ることができないシステムになっています。

このように、通信を行う制御権を持っている側と、持っていない側がいるシステムでは、制御権を持っている側が「マスター」、持っていない側が「スレーブ」と呼ばれています。


ところで、「マスター」「スレーブ」は主従関係を表しますが、奴隷を意味する「スレーブ」という言葉が不適切とされ、言い換えが進んでいます。

ただ、世界的に統一した用語はなく、コンピュータの世界では次のような用語が使用されています。

送信側・制御する側受信側・制御される側
ホスト
または
コントローラー
デバイス
または
ペリファラル
イニシエーターターゲット
プライマリセカンダリ
リーダーフォロワー

ところで、電子工作の世界では、「マスター」を意味する「M」と「スレーブ」を意味する「S」が電子部品のモジュールや基板に印刷されてしまっています。

そこで、この「M」と「S」を変更する必要がないように、電子工作の世界では次のような用語も提案されています。

送信側・主となる側受信側・副となる側
Main(メイン)
「主要な」という意味
Secondary(セカンダリ)
「二次的な」という意味
MainSubnode(サブノード)
「サブのモジュール」という意味
Manager(マネージャー)
「管理者」という意味
Subordinate(サボーディネート)
「従属者」という意味

このように「マスター」「スレーブ」に変わる用語はたくさんありますが、このシリーズ記事では、「制御する側(送信側)」を「ホスト」、「制御される側(受信側)」を「デバイス」と呼ぶことにします。

特に深い意味はありませんが、電子部品を扱うので「デバイス」が一番馴染みがありそう、という理由です。


前置きが長くなってしまいましたが、検討しているシステムでは次のように呼ぶことにします。

それでは、通信手順をどのように決めれば子供部屋から返事ができるか考えていきます。

信号線の呼び方

システムを改装後、信号線は3本になりました。SPI通信の場合のこれらの信号線の呼び方を説明します。

クロック信号線

SPI通信では、クロック信号の線のことを、シリアル通信をするためのクロック信号、という意味で「シリアルクロック」と呼ぶことがあります。

英語では「Seiral Clock」で、「SCK」と略記します。

ホストからデバイスにデータを送る信号線

1Fリビングのホストから2F勉強部屋のデバイスにデータを送る線は、呼び方が2通りあります。

呼び方(1)

この信号線は、「ホスト(マスター)から出力してデバイス(スレーブ)に入力する」信号であることから、「Master Out Slave In」と呼び、「MOSI」と略記します。

ホスト側とデバイス側で同じ呼び方である点に注意してください。

呼び方(2)

もう一つの呼び方は、ホスト側とデバイス側で呼び方が異なりますので注意が必要です

デバイス側では「シリアルデータを出力」することから「Serial Data Out」と呼び、「SDO」と略記します。

一方、デバイス側では「シリアルデータを入力」することから「Seiral Data In」と呼び、「SDI」と略記します。


温湿度・気圧センサー(デバイス側)では、データを受信する端子は「SDI」と表記されています。

Pic practice 24 bme280 sdi

デバイスからホストにデータを送る信号線

先ほどと逆方向の、2F勉強部屋のデバイスから1Fリビングのホストにデータを送る線です。

こちらも2通りの呼び方がありますが、先ほどとデータ向きが逆になるだけです。

呼び方(1)

一つ目の呼び方は、データを「ホスト(マスター)に入力する、デバイス(スレーブ)からの出力」信号であることから、「Master In Slave Out」と呼び、「MISO」と略記します。

呼び方(2)

二つ目の呼び方は、ホスト側では「シリアルデータを入力」することから「Serial Data In」と呼び、「SDI」と略記します。

デバイス側では「シリアルデータを出力」することから「Seiral Data Out」と呼び、「SDO」と略記します。(なんだかややこしくなってきましたね)

温湿度・気圧センサー(デバイス側)では、データを送信する端子は「SDO」と表記されています。

Pic practice 24 bme280 sdo

今後、タイミングチャートで説明する場合、「SDO/SDI」ではどちら側の信号線を指しているのかわからなくなりますので、「MOSI」「MISO」を使用することにします。

通信手順の検討

これから、以下の情報をやり取りする通信手順を検討します。

  • ホスト(リビング)からデバイス(勉強部屋)に3ビットの用事の情報を送る
  • 続いて、デバイス(勉強部屋)からホスト(リビング)に2ビットの答えの情報を送る

ポイントは、クロック信号はホストのみが制御できる、という点です。


今までは3ビットの情報をホストからデバイスに送るために、クロック信号を3回生成していました。

今回はさらに2ビットの情報をデバイスからホストに送るわけですから、次の通信手順を追加すれば実現できそうです。

  • ホストは、クロック信号で3ビットの情報を送った後、デバイスから2ビットの答えが送信されてくるので、さらにクロック信号を2回生成する
  • デバイスは、3ビットの情報を受信した後、2ビットの答えを送信する必要があるため、答えを返信するための2回のクロック信号に合わせて、答えの2ビットのデータをうまくセットしてホストに送信する

それでは、この通信手順をタイミングチャートにしてみます。

次のタイミングチャートは、リビングの母親から110(掃除を手伝って)という情報を送り、勉強部屋の息子から10(今忙しくて行けない)という返事をするやり取りです。

だんだん複雑になってきましたよね…

この通信では、ホスト(リビング)からデバイス(勉強部屋)に3ビットの用事の情報を送った後、続けてデバイスからホストに2ビットの返事を送るので、クロックは5つあります。

最初の3つのクロックでは、クロックの立ち上がりでデバイス側で3ビットの情報を読み取りますので、立ち上がり時に110になるようにホストはMOSI信号線を制御します。デバイスは、クロックとMOSIにより3ビットのデータを読み取ります。

3ビットのデータを読み取ると、用事は「掃除を手伝って」ということが判明しますので、「今忙しくて行けない」という返事をします。

この返事は、ホストが生成するクロックに合わせてデータを送信する必要がありますので、続く2回のクロックの立ち上がり時にデバイス側で、ホストが「10」を読み取れるようにMISOの信号線を制御します。


SPI通信ではこのように、クロック信号をホストのみが制御して、通信のタイミングを制御します。

また、データのやり取りは、ホスト側はMOSI信号、デバイス側はMISO信号を制御して通信を行います。

これでデータの送受信ができました。

ポイントとしては、送受信とは言っても、デバイス側は自分の好きなタイミングでデータを自由に送信できるわけではなく、あらかじめ決められた通信手順に従って、ホストが生成するクロックに合わせてデータを送信する必要がある、という点です。

SPI通信ではもう1本信号線があります。この信号線については次回の記事でシステムを改装して検討します。

更新履歴

日付内容
2018.4.14新規投稿
2025.7.22「マスター」「スレーブ」を、それぞれ「コントローラ」「デバイス」に変更
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次