
皆さんこんにちは!メカ旦那です。
電子工作やマイコンでよく聞く「SPI(エスピーアイ)」。
シリアル通信の一種で、多数のデバイスと高速通信できるため、様々なセンサに利用されている規格です。
奥が深いですが、イラストを用いてわかりやすく解説します!
伝送方式
種類
通信方式は多種多様に存在し、色々な区分け方がありますが、データの伝送方式に着目すると、以下に分ける事ができます。

SPI(エスピーアイ)は「デジタル、シリアル、クロック同期、全二重、シングルエンド」の特徴をもつ通信です。
よくわかりませんね、、、一つずつ解説します!
アナログ / デジタル

アナログは連続的な値を取りますが、デジタルは0と1の2値を用います。電話やラジオはアナログ通信が多いですが、PC、マイコン通信だとデジタルが主流となり、SPIもデジタルになります。
パラレル / シリアル

デジタルは0か1を多数のbitで送受信しますが、パラレルは複数の信号線でまとめて通信します。対して、シリアルは1本の信号線を用いて通信します。その為、配線数が少なくて済むのが特長です。例としてパラレルはプリンター、シリアルはマウスやキーボードで利用されています。
一見、パラレル通信の方が一度に多くのデータを送信でき効率的に思えますが、配線が長くなると、各信号の時間ズレが発生し、上手く送受信できないことがあります。その為、最近の高速通信ではシリアルが主流になっています。SPIもシリアル通信です。
クロック同期 / 非同期(調歩同期)

デバイス間で送受信する際、いつ送るのか、いつ受け取るのか、といったタイミング(クロック)を両者で認識する必要があります。クロックが両者で共有されている状態での通信はクロック同期と呼ばれています。対して、共有はされていませんが、各々独自のクロックを持って通信することを非同期(調歩同期)と言います。イメージは、クロック同期が同じ壁掛け時計を見ながら通信、非同期はそれぞれの腕時計を見ながら通信、ですかね。
同期通信はクロック専用の信号線がいるため、その分配線が多くなりますが、クロックが共有されているため、送受信にズレが生じないです。そのため、安定した高速通信が可能となります。SPIは同期通信になります。
全二重(フルデュプレックス) / 半二重(ハーフデュプレックス)

データを送受信する際、2本の伝送路で別々に行う方式を全二重通信と呼びます。対して、1本でまとめて行う方式を半二重通信と言います。全二重は送受信を同時に行うことができるのに対し、半二重は同時に行えません。ただし信号線が1本で済むのがメリットです。SPIは全二重になります。
シングルエンド(不平衡) / 差動(平衡)

先ほどデジタル通信で「0と1の2値を用いる」と説明しましたが、何を0とするのか、1とするのかの基準があります。信号電圧が、ある基準電圧より低い状態を0、高い状態を1とする方式をシングルエンドと呼びます。対して、信号が2つあり、電圧の差分から0,1を判別する方式を差動と言います。
シングルエンドは信号線が1本で済むメリットがありますが、ノイズが入った時に0を1(もしくはその逆)と誤認識してしまう恐れがあります。対して差動信号は信号線は2本いるものの、電圧差を見ている関係上、ノイズによる影響が少ないメリットがあります。SPIはシングルエンドになります。
リレーション

冒頭には記載していませんでしたが、通信方式によって接続できるマスター、スレーブの数が変わり、リレーションと呼ばれています。1対1、1対多、多対多があり、SPIは1対多になります。
配線・注意点

なるほど、伝送方式の特徴はなんとなくわかったよ。で、使うにはどうやって配線すればいいの?

そうですね、実際の配線イメージと注意点について解説します。

配線図はこちらです。 ポイントは「信号線はSCL、MOSI、MISO、CSの4種類、プルアップ抵抗は不要、GNDを合わせる」です。
信号線(SCL、MOSI、MISO、CS)

I2Cでは複数のマイコンを使いますが、指示を出す側をマスター(master)、受け取る側をスレーブ(slave)と言います。ちなみにmaster/slave は「主人/奴隷」という意味で、アメリカの奴隷制度を連想させる為、最近では以下の呼び方をされる事もあります。
信号線はSCL、MOSI、MISO、CSの4種類を使います。 それぞれの特徴は以下です。
SPIは前述の通り全二重方式の為、データ送信と受信で線が分かれています。
プルアップ抵抗は不要

一般的にマイコンやICから信号出力する際、プッシュプル、オープンドレイン(コレクタ)の2種類があります。SPIはプッシュプルになります。つまり0(LOW)も1(HIGH)も出力できますので、プルアップ抵抗を接続する必要はありません。
プッシュプル、オープンドレインは下記記事でも解説していますので、気になる方はぜひご覧ください。
GNDを合わせる
前述の通り、シングルエンドは信号電圧によって0、1が決まります。ここで重要なのが、接続される全デバイスのGND電位を合わせる事です。 電位が合ってない場合、例えばマスターから0を送っても、スレーブでは不安定領域の電圧で1と誤認識されることがあります。 その為それぞれで電源が異なるなどGND電位が合っていない場合、必ずGND間を配線するようにしてください。

信号の伝送タイミング
モード
続いて信号の伝送タイミングについて解説します。SPI通信はクロックに合わせてデータの送受信を行いますが、クロックのどのタイミングでマスターが出力し、スレーブが入力するのか、逆にどのタイミングでスレーブが出力し、マスターが入力するのか変わってきます。
このタイミングは「モード」とも呼ばれており、モード0,1,2,3の4種類あります。まずは代表的なモード0の通信手順について解説します。

モード0はこのように通信します。
ここで、SCLについて、アイドル状態(待機状態)は0で通信開始後に1に変化する事でクロックを出力しましたが、反対にアイドル状態が1で通信開始後に0に変化する場合もあります。これは極性(CPOL、Clock Polarity)と言い、前者は正極性(0)、後者は負極性(1)になります。
また、SCLの立上りでサンプリング、立下りでシフトでしたが、反対に立上りでシフト、立下りでサンプリングの場合もあります。これは位相(CPHA、Clock Phase)と言います。厳密に言うと、SCLがアイドル状態から変化した時にサンプリング、戻った時にシフトする場合をCPHA=0、アイドル状態から変化した時にシフト、戻った時にサンプリングする場合をCPHA=1としています。
この極性と位相の種類によってモード0,1,2,3の4種類が存在します。

SCLのモードに合わせて、MOSI / MISOでサンプリング / シフトするイメージは以下になります。

センサなどのモードは固定なのでデータシートでの確認が必要です。マスターはスレーブのモードに必ず合わせる必要がありますが、ライブラリの関数で簡単に設定できます。ちなみに、秋月電子で入手できるような一般的なSPIデバイスはモード0が最も多く、次いでモード3が多い印象です。
ライブラリ
通信手順は以上となりますが、ライブラリ(spidev、SPI.hなど)を用いることで、簡単に構築する事ができます。 今後マイコンを用いた事例を記事にしますので、詳しくはそちらで解説します!
UART、SPI、I2Cの違い
マイコンによく付いているシリアル端子として、UART、SPI、I2Cがあります。どれもマイコン⇔センサ間にはよく用いられる規格ですが、違いについて表にまとめてみました。


なるほど、全然違いますね。でも結局どの場面でどれを使えばいいんですかね?。。。

基本的には接続するセンサ・モジュールがどれか1つに対応しているのでそれを使えばよいです。ただこれらの規格はマイコン通信でよく出てくるが故に混同しやすいので、違いを知っておくことで配線ミスや通信不具合を防ぐことができます!
I2C通信は別記事でも詳しく紹介しています!
まとめ
SPIの特徴をまとめると、以下になります。
一般的なシリアル通信の中では高速な為、様々なセンサで利用されています。

とりあえず読んではみたけど、、、やっぱり手を動かさないとイメージできないな、、、

今後SPIを使った電子工作を紹介するので、乞うご期待ください!
コメント