今回からSPI通信の仕組みを理解していきます。
時計を持たない通信
前回の記事で検討したデータ通信システムは、データの送信側と受信側でそれぞれ時計を持ち、その時計を見ながらあらかじめ決めた時間間隔でデータの送信と読み取りを行う、というものでした。
電球のOFF/ONを制御するだけのシステムで、データを確実に送るにはどのように考えていけばよいか、コンピュータの世界の通信についてイメージはつかめましたでしょうか。
ところで、実践編で使用するセンサモジュールとLCDモジュールはSPI通信やI2C通信という方式でデータ通信を行います。
このSPI通信やI2C通信では、データ通信のタイミングをとる時計を持っていないんです。
そこでこれから、時計なしでデータ通信する方法を理解していきます。
時計を持たずに通信するのは、前回検討した内容を思い出してみると、1つの信号線ではかなり無理がありそうですよね。というよりおそらく不可能ではないかと思います。
そこで今回の記事では、時計を持たずに通信を行うために、信号線を1本追加し、その信号線でデータを読み取るタイミングを教えてあげてはどうか、という検討を行います。
「タイミングを教える」っていってもよくわからないですよね。
これから具体的に、前回のシステムを改装して「データを読み取るタイミング」をどのように扱うか、確認していきます。
なお、システムを改装していくと最終的にはSPI通信方式の基本形になりますので、記事の途中でSPI通信の用語も説明していきます。
データ通信システムの改装
前回のデータ通信システムを改装し、次のようにスイッチと電球をもう一組追加します。

一言伝えるだけなのにここまでやるんだったらスマホがあるのに、っていう気もしますが、その気持ちは抑えてこのまま進めましょう!
ところで、図に描かれる線が増えて、ちょっと見づらくなってきました。図を見やすくするために、次のように電池を省略して表記することにします。

このように改装したシステムで、2組のスイッチと電球を次のように使用することにします。
- 1組のスイッチと電球はデータ送信用に使用します。
スイッチOFF/電球消灯を0、スイッチON/電球ONを1とします。 - もう1組のスイッチと電球は、データを読むタイミングを伝えるために使用します。
具体的には、このタイミング用の電球が消灯状態から点灯状態に変わったタイミングで、データ送信用の電球の状態を読み取ることにします。
このように決めておけば、送信側と受信側で、次のような動作を行えばデータ通信ができそうです。
送信側のデータ送信操作
- これから送るデータに合わせて、データ用のスイッチをその状態にしておく。
つまり0ならばOFF、1ならばONにしておく。 - 相手にデータを読み取ってもらうために、タイミング用のスイッチをONにする
- 次の送信に向けてタイミング用のスイッチをOFFにする
- まだ送信データが残っていれば、次のデータをデータ用のスイッチにセットして、❶から繰り返す
受信側の読み取り
- タイミング用の電球を監視する
- タイミング用の電球が消灯から点灯に変化したら、そのタイミングでデータ用の電球の状態を読み取る。
- 次の受信に備えて❶に戻り、再びタイミング用の電球を見続ける。
(見続けている間に、タイミング用電球が点灯から消灯に変化するが、この変化の取り決めはないため無視する)
上の通信手順を図にまとめると次のようになります。
左側の青枠が送信側の手順、右側の赤枠が受信側の手順です。

このようにすれば、お互いに時計を持っていなくても確実にデータが送れます。
それでは、実際にデータを読み取ってみたいと思います。
データは「110」です。これは「掃除手伝って」ですので、行ってはいけないデータですね。
データを読み取るコツは、タイミングを知らせる電球を見続け、その電球が消灯から点灯に変化したタイミングでデータの電球を見て読み取ります。

うまく読み取れましたか?2つの電球を見る必要があるのでちょっとややこしいところがありますよね。
今回のシステム改装では、データを読み取るタイミングの信号線を追加して信号を送りました。
この信号線は時計のような役割を果たしているので、SPI通信では「クロック信号」または単に「クロック」と呼ばれています。
なお、この通信手順ではクロックの早さはあらかじめ決めておく必要がない、という点もポイントです。
ただし、あまりにもクロック信号が早いとデータを受け取る側でデータの読み取りが追いつかないかこともありますので、モジュールによって上限の速度が規定されています。
例えば今回使用する温湿度・気圧センサモジュール(BME280)では、クロックの早さ(周波数)は10MHzまでです。
なお、遅い分にはいくら遅くても構いません。(1秒に1ビットでも構いません)
通信手順の図式化
ここで、クロック信号とデータ信号を使ったデータ通信の通信手順を図にしてみます。
通信手順を言葉で説明すると、表現の仕方によっては紛らわしいですし、曖昧な部分も出てきてしまいます。そこで、今回検討した通信手順を図式化します。
最初にクロック信号を図にします。
スイッチのON/OFF、電球の点灯/消灯はそれぞれ1と0に対応していますので、クロック信号は次のように表現できます。
今回検討しているシステムでは、3ビットのデータを送信するので、クロック信号が0から1に変化する部分を3つ入れました。

この図で、クロック信号は0と1は明らかなので、「0」「1」の表記って必要ないですよね。また、点線も必須ではありません。そこで、次のように「0」「1」と点線は削除します。

ところで、電球って急に100%の明るさにはならないで、短時間ですがフワッと明るくなりますよね。
コンピュータの世界のデータ通信も同じで、デジタル信号を制御するピンを0から1に変更しても、一瞬で0から1になるわけではなく、短時間ですが徐々に変化します。それを表現すると、次のようなクロック信号の図になります。

デジタルの世界なのに、徐々に変化することを表現するのはアナログではないか、という疑問もありますが、このように表現するのが慣習ですのでお見逃しください。
なおデータシートによっては、表現Aのケースや表現Bのケース、あるいは混在していることがありますので頭の片隅に置いておいていただければと思います。
このクロック信号には呼び方があります。
クロックが0から1に変化する部分をクロックの「立ち上がり」、1から0に変化する部分を「立ち下がり」と呼びます。

「立ち上がり」はいいとして、「立ち下がり」は「立つ」と「下がる」が方向が違う気もします。「立ち上がり」の反対であれば「座り下がり」のような気もしますが、慣習でこのように呼ばれています。
このクロック信号に追加して、データ信号として「101」を送る様子を図に追加します。
データはクロックの立ち上がりで読み取ることになっていますので、データを変更するタイミングとしてはクロックの立ち下がりが良さそうです。
これを図にすると以下のようになります。

これがクロック信号とデータ信号を使って「101」を送る様子を示した図です。(かなりややこしくなってきましたね…。もう少しお付き合いください!)
上のような複数の信号のタイミングを表現した図のことを「タイミングチャート」と呼びます。この「タイミングチャート」はSPI通信に限らず色々な場面で出てきます。
ところで、上の図は「101」を送るタイミングチャートですが、実際には色々なデータがあります。
今回の例であれば、「000」「001」…「111」と8種類あります。これらのタイミングチャートは一つ一つ示すのは意味がありませんので、一般的には次のように表現します。

データ信号は六角形が連なった表現になっている点がポイントです。
先ほどの図ではデータは「101」でしたのでデータは0か1の線で表現されていました。
ところが、一般的な表現をしようとするとデータは0か1のどちらかなので、上の図のようにデータ確定期間には0と1の両方のラインが描かれています。
またデータ変更タイミングは0から1、1から0の変更があるため、このようにデータ信号がクロスするように描かれます。
一般的なデータシートでは、このようなタイミングチャートでその電子部品の通信仕様が説明されることが多いです。
タイミングチャートのポイント
通信手順をタイミングチャートにすると、急に難しくなったような気がしますよね。タイミングチャートを見る上でポイントとなるところを補足しておきます。
タイミングチャートでは「信号は、誰が送信して誰が受信するのか」という点がわかりづらくなっています。
次の通信手順は、単に「クロック信号線とデータ信号線の制御信号がどのようになっているか」ということを示しているだけです。

このタイミングチャートを理解する上で、さらに次の知識を前提としてこのタイミングチャートを見る必要があります。
- クロック信号とデータ信号は1Fリビングの母親が制御する
- 2F子供部屋の息子は、クロック信号の立ち上がりのタイミングでデータを読む
今回のデータ通信の説明では、データを送るための2つの信号線の制御方法について説明しました。
SPI通信では4本の信号線を使って通信を行います。つまり、さらに信号線が2本追加になるわけです。
その追加の信号線についても、誰がどのような目的で制御して、誰がどのように解釈して受信するのか、という点を意識していただければと思います。
今後、データ通信を行う電子部品を入手した場合、データシートの中に必ずこのようなタイミングチャートが出ています。ぜひ他の部品のデータシートも解読できるように、一緒知識を習得していきましょう!
更新履歴
日付 | 内容 |
---|---|
2018.4.14 | 新規投稿 |
2025.7.21 | GIF画像不具合修正 |