今回からSPI通信の説明に入ります。
時計を持たない通信
前回の記事で検討したデータ通信システムは、データの送信側と受信側でそれぞれ時計を持ち、その時計を見ながらあらかじめ決めた時間間隔でデータの送信と読み取りを行う、というものでした。
電球のOFF/ONを制御するだけのシステムで、データを確実に送るにはどのように考えていけばよいか、コンピュータの世界の通信についてイメージはつかめましたでしょうか。
ところで、前回の記事の最後の方でサラッと説明してしまいましたが、実践編で使用するセンサモジュールとLCDモジュールはデータ通信のタイミングをとる時計を持っていないんです。これから、時計なしでデータ通信する方法を検討する必要があるので、一緒に考えていきましょう!
時計を持たずに通信するのは、前回検討した内容を思い出してみると、1つの信号線ではかなり無理がありますよね。というよりおそらく不可能です。
そこで今回の記事では、時計を持たずに通信を行うために、信号線を1本追加し、その信号線でデータを読み取るタイミングを教えてあげてはどうか、という検討を行います。
「タイミングを教える」っていってもよくわからないですよね。具体的に、これからシステムを改装して検討していきましょう!
今回から、システムを改装していくと最終的にはSPI通信方式の基本形になりますので、記事の途中でSPI通信の用語も説明していきます。
データ通信システムの改装
前回のデータ通信システムを改装し、以下のようにスイッチと電球をもう一組追加します。
だんだん複雑になってきた感じがするのと、一言伝えるだけなのにここまでやるんだったらスマホがあるのに、っていう気もしますが、このまま進めましょう。
ところで、図に描かれる線が増えて、ちょっと見づらくなってきました。図を見やすくするために、基礎編の第10回で説明したように、以下のように電池を省略します。
このように改装したシステムで、2組のスイッチと電球を以下のように使用することにします。
- 1組のスイッチと電球はデータ送信用に使用します。スイッチOFF/電球消灯を0、スイッチON/電球ONを1とします。
- もう1組のスイッチと電球は、データを読むタイミングを伝えるために使用します。具体的には、このタイミング用の電球が消灯状態から点灯状態に変わったタイミングで、データ送信用の電球の状態を読み取ることにします。
このように決めておけば、送信側と受信側は以下のように送信、読み取りを行えばデータ通信ができそうです。
送信側のデータ送信操作
- 送りたいデータに合わせて、データ用のスイッチをその状態にしておく。つまり0ならばOFF、1ならばONにする
- 相手にデータを読み取ってもらうために、タイミング用のスイッチをONにする
- 次の送信に向けてタイミング用のスイッチをOFFにする
- まだ送信データが残っていれば、次のデータをデータ用のスイッチにセットして、(2)に戻る
受信側の読み取り
- タイミング用の電球を見続ける
- タイミング用の電球が消灯→点灯に変化したら、データ用の電球の状態を読み取る。つまり消灯ならば0、点灯ならば1が送信されたと認識する
- 次の受信に備えて(1)に戻り、再びタイミング用の電球を見続ける (見続けている間に、電球が点灯→消灯になるが、この変化の取り決めはないため無視する)
上の通信手順を図にまとめると以下になります。
このようにすれば、お互いに時計を持っていなくても確実にデータが送れます。
実際にデータを読み取ってみたいと思います。データは「110」です。これは「掃除手伝って」ですので、行ってはいけないデータです。データを読み取るコツは、タイミングを知らせる電球を見続け、その電球が消灯→点灯に変化したタイミングでデータの電球を見て読み取ります。
今回の改装では、時計を持たない代わりにデータを読み取るタイミングの信号線を追加して信号を送りました。この信号は時計の役割を果たしているので、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の変更があるため、このようにデータ信号がクロスするように描かれます。
今回の3ビットのデータをクロック信号とデータ信号を使って送信するときのタイミングチャートはこの図になります。
タイミングチャートのポイント
通信手順をタイミングチャートにすると、急に難しくなったような気がしますよね。タイミングチャートを見る上でポイントとなるところを補足しておきます。
スイッチと電球を使ったデータ通信システムの図に比較すると、タイミングチャートでは「この信号は誰が制御して誰が受信するのか」という点がわかりづらくなっています。
以下の通信手順は、単に「クロック信号線とデータ信号線の制御信号がどのようになっているか」ということを示しているだけです。
このタイミングチャートを理解する上で、以下の知識を前提としてこのタイミングチャートを見る必要があります。
- クロック信号とデータ信号は1Fリビングの母親が制御する
- 2F子供部屋の息子は、クロック信号の立ち上がりのタイミングでデータを読む
このあと、SPI通信ではさらに信号線が2本追加になります。その2本を含めて、誰がどのような目的で制御して、誰がどのように解釈して受信するのか、という点を意識しながらタイミングチャートを見ていく必要があります。
データ通信を行う電子部品を入手した場合、データシートの中に必ずこのようなタイミングチャートが出ています。どのような通信手順なのか、このようなタイミングチャートから理解する必要があります。
更新履歴
日付 | 内容 |
---|---|
2018.4.14 | 新規投稿 |