今回は、実際のSPI通信手順の説明です。
今回の説明
前回までの説明で、SPI通信の基本的な考え方をみてきました。今回は実際のSPI通信の通信手順やタイミングチャートを確認します。
「実際のSPI通信」とは言っても、今までの説明から大きく変わることはありません。今までの説明と異なるところは、実際のSPI通信ではデータの長さは8ビットという点です。
前回までの説明で使用したデータ通信システム(リビングと勉強部屋間のデータ通信システム)では、リビングから勉強部屋には3ビットの情報を送り、その返事を勉強部屋からリビングに2ビットで送っていました。実際のSPI通信では、データの送信単位は8ビットになります。
そのほかのスレーブセレクト信号、クロック信号、MOSI信号、MISO信号の使い方は、前回までの説明の通りです。
それではこのあと、SPI通信の接続形態、通信手順、タイミングチャートを確認して、実際のSPI通信を理解しましょう!
SPI通信の接続形態
SPI通信のマスターとスレーブの接続は以下のようになります。実践編では、マスターはPICマイコン、スレーブは温湿度・気圧センサですので、スレーブは1個ですが、以下はスレーブが複数の場合を説明します。スレーブが3個以上ある場合は、2個目と同様に増設すればOKです。
今までの繰り返しになってしまいますが、以下のように接続します。
- SCK(クロック信号)
マスターが生成するクロック信号をすべてのスレーブが受信できるように、以下の図のようにマスターから各スレーブに接続します。 - MOSI(マスターからスレーブへの信号)
クロック信号と同様に、マスターが生成する信号をすべてのスレーブが受信できるように、以下の図のようにマスターから各スレーブに接続します。 - MISO(スレーブからマスターへの信号)
各スレーブからマスターに信号が送信できるように以下の図のように各スレーブからマスターに接続します。 - CSB(スレーブセレクト信号)
スレーブセレクト信号は、マスターがそれぞれのスレーブを選択できるように、以下の図のようにスレーブごとに接続します。
今までの説明では家族が登場していたので、このような図にするとなんだか味気ないですね。
SPI通信手順
次にSPIの通信手順をまとめます。以下の手順は、マスターからスレーブに8ビットデータを送信し、その後スレーブからマスターに8ビットデータを返信する例を示しています。なお、データは最上位ビットからシリアルに送信します。
順番 | マスター動作 | スレーブ動作 |
---|---|---|
1 | 通信する相手のスレーブセレクト信号を0にして、通信相手を指定する | スレーブセレクト信号が0になったスレーブは、これからクロック信号に従ってデータ通信を行う |
2 | クロックを信号を発生させて8ビットのデータを送信する(最上位ビットから送信) | クロック信号の立ち上がりでMOSI信号を読み取り、8ビットデータを受信する |
3 | 引き続きクロック信号を発生させて、クロックの立ち上がりでスレーブからの送信されるMISO信号を読み取り、8ビットデータを受信する/td> | クロック信号に合わせて8ビットデータを送信する(最上位ビットから送信) |
4 | データの送受信が終わったら、スレーブセレクト信号を1にする | スレーブセレクト信号が1になったら通信処理おわり |
ところで、この通信手順は1バイトの送受信ですが、マスターとスレーブが通信するバイト数はSPIモジュールごとに異なります。
例えば、今回使用する温湿度・気圧センサでは、温度情報を読み取る場合は、PICマイコン(マスター)からセンサ(スレーブ)に温度情報をください、という意味の8ビットの情報を送信し、スレーブからマスターに温度情報の16ビットの返信があります。データのやり取りの単位は8ビットですが、必ずしもマスターからスレーブに8ビット送信してスレーブからマスターに8ビット返信される、というわけではない点にご注意ください。
どのようにデータをやりとりするのかという仕様は、各SPIモジュールごとに異なり、データシートに解説されていますのでそれを読み解くことになります。その際、タイミングチャートやそれに類する図で説明されていますので、ぜひタイミングチャートの読み方になれるようにしましょう!
SPI通信タイミングチャート
上の例で説明しました、マスターからスレーブに8ビット送信、スレーブからマスターに8ビット返信のタイミングチャートを以下に説明します。上で説明した通信手順を図にしたものですので、特に説明は必要ないと思いますが、不明点ありましたらコメント欄かお問い合わせフォームからご質問いただければと思います。今までの知識をもとに、読み解いてみてください。
補足
SPI通信手順の説明は以上ですが、最後に以下の2点の補足があります。
- データの同時送受信
- データ読み取りタイミング
1. データの同時送受信
実際のSPI通信は先ほど説明したように、マスターからスレーブに指示情報(温度情報をください、など)を送って、それに回答する形でスレーブからマスターに返信情報(温度情報)を送ります。
ただ、SPI通信の一般的な通信手順としては、以下のように解説されています。(スレーブセレクト/チップセレクトは省略しています)
どういうことかというと、この図のようにマスターとスレーブは内部に送受信用の8ビットの箱(レジスタやバッファと呼ばれます)を持っていて、この8ビットをマスターが生成するクロック信号に従って、最上位ビットから順にデータを交換する、というものです。
例えば、マスターから「温度情報をください」というような制御情報を送るときでも、制御情報を送っている最中にスレーブから何かの情報を受け取ることになります。ただし、スレーブからは特に有意な情報を送ることはできませんので、その際は0x00や0xFFなどのダミーデータが送られてきます。
実践編で作成するプログラムでは、マスターから制御情報を送信する際、スレーブからの情報は特に受信しないように作成します。
このように、マスターからスレーブに情報を送ると同時に、スレーブからマスターに何かの情報を送る、というのはそれほど多くありませんので、この補足の内容は参考程度にご理解いただければと思います。
2. データ読み取りタイミング
今までの説明で、データ信号(MOSI信号とMISO信号)の読み取りタイミングは、クロック信号の立ち上がりのタイミングとしてきました。しかしSPIモジュールによっては、データ信号の読み取りタイミングはクロックの立ち下がりのものもあります。
英語版のデータシートが多いので、英文表記も覚えておきましょう。「立ち上がり」は「Rising Edge」、「立ち下がり」は「Falling Edge」です。
これでSPI通信の説明は終わりです。次回、チャレンジ課題に挑戦した後、実際のSPI通信のプログラムを作成します。
更新履歴
日付 | 内容 |
---|---|
2018.4.15 | 新規投稿 |
広告も無いし書いた方のプロフィールも無いしでなぞが多いサイトですが、非常にわかりやすいです。ありがとうございます!!
コメントどうもありがとうございます。
すみません、プロフィールについてはそのうち書こうと思います。