PR
スポンサーリンク

【初心者】SPI通信とは?I2Cとの違いや速度についてもわかりやすく解説  

皆さんこんにちは!メカ旦那です。

電子工作やマイコンでよく聞く「SPI(エスピーアイ)」。
シリアル通信の一種で、多数のデバイスと高速通信できるため、様々なセンサに利用されている規格です。

奥が深いですが、イラストを用いてわかりやすく解説します!

伝送方式

種類

通信方式は多種多様に存在し、色々な区分け方がありますが、データの伝送方式に着目すると、以下に分ける事ができます。

SPI(エスピーアイ)は「デジタル、シリアル、クロック同期、全二重、シングルエンド、主従関係あり、1対多」の特徴をもつ通信です。

よくわかりませんね、、、一つずつ解説します!

アナログ / デジタル

アナログは連続的な値を取りますが、デジタルは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本の伝送路を複数の機器で共有することがあり、「どこがいつ何のデータを送るのか」を決めないとデータ衝突(同時送信)が発生します。このルールは主従関係と呼ばれており、優先権を持つデバイス(主)をマスター、それに応じるデバイス(従)をスレーブと呼びます。具体的には、

  • マスターが通信の開始・クロック・アドレス指定を実施
  • スレーブは命令を受けて応答

します。ちなみにマスター/スレーブ は「主人/奴隷」という意味で、アメリカの奴隷制度を連想させる為、最近では以下の呼び方をされる事もあります。

マスター(master)/スレーブ(slave) の別名称
  • リーダー(leader)/フォロワー(follower)
  • プライマリ(primary)/レプリカ(replica)
  • プライマリ(primary)/スタンドバイ(standby)
  • コントローラ(controller)/ペリフェラル(peripheral)

SPIは主従関係があるため、マスター/スレーブとなるデバイスを決める必要があります。

リレーション

リレーション:ユニキャスト(1対1)、マルチキャスト(1対多)、ブロードキャスト(1対多)、マルチマスター/マルチドロップ(多対多)が存在。

通信方式によって送受信できるデバイス数をリレーションと言います。

  • ユニキャスト:1対1
  • マルチキャスト:1対多(複数)
  • ブロードキャスト:1対多(全数)
  • マルチマスター:多対多

SPIマルチキャストになります。

配線

メカ坊や
メカ坊や

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

メカ旦那
メカ旦那

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

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

信号線(SCL、MOSI、MISO、CS) 

信号線はSCLMOSIMISOCSの4種類を使います。 それぞれの特徴は以下です。

  • SCL(Serial Clock):マスターからスレーブへクロックを送る線
  • MOSI(Master out Slave in):マスターからスレーブへデータを送る線
  • MISO(Master in Slave out):スレーブからマスターへデータを送る線
  • CS(Chip select)/ SS(Slave Select):マスターからの通信先を選択する線。スレーブ毎に必要。

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、②MOSIは0か1、③MISOはハイインピーダンスの状態です。
    • ③の理由ですが、あるスレーブがMISOで出力中に、他スレーブが出力するとデータ衝突を起こし誤動作に繋がります。その為SPI通信を行っていない時はMISOをハイインピーダンスにします。SPI通信が開始された時、選択されたスレーブのみハイインピーダンスを解除してデータ出力し、それ以外はハイインピーダンスのままにします。
  • 通信開始
    • ④CSを1→0にする事でSPI通信開始します。
  • MOSIでの送受信
    • ⑤まずはMOSIでの通信を開始します。MOSI、MISOどちらが先かはデバイスに依ります。また同時に通信されることもあります。
    • ⑥スレーブには最初のbitが届きますが、SCLが立上ったタイミングで値を読み取ります。(サンプリング)
    • ⑦SCLが立下ったタイミングで、マスターが次のbitを出力します(シフト)
    • ⑧以降、サンプリングとシフトを繰り返して、全データの送受信を行います。
  • MISOでの送受信
    • ⑨送受信が終了したら、MOSIは開始前の状態に戻ります。
    • ⑩続いてMISOでの通信を開始します。先ほどと同様にサンプリング・シフトを繰り返します。
  • 通信終了
    • ⑪送受信が終了したら、MISOは開始前の状態(ハイインピーダンス)に戻ります。
    • ⑫SCLも開始前の状態に戻します。
    • ⑬CSを0→1にする事でSPI通信は終了します。

モード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種類が存在します。

動作モードアイドル
状態の極性
CPOLCPHAサンプリング
のタイミング
シフト
のタイミング
モード00 (LOW)0 (LOW)0 (LOW)立上り立下り
モード10 (LOW)0 (LOW)1 (HIGH)立下り立上り
モード21 (HIGH)1 (HIGH)0 (LOW)立下り立上り
モード31 (HIGH)1 (HIGH)1 (HIGH)立上り立下り

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

センサなどのモードは固定なのでデータシートでの確認が必要です。マスターはスレーブのモードに必ず合わせる必要がありますが、ライブラリの関数で簡単に設定できます。ちなみに、秋月電子で入手できるような一般的なSPIデバイスはモード0が最も多く、次いでモード3が多い印象です。

ライブラリ

通信手順は以上となりますが、ライブラリ(spidev、SPI.hなど)を用いることで、簡単に構築する事ができます。 詳しくはこちらで解説しています!

UART、SPI、I2Cの違い

マイコンによく付いているシリアル端子として、UART、SPI、I2Cがあります。どれもセンサとの通信ではよく用いられる規格ですが、違いについて表にまとめてみました。

項目UARTSPII2C
クロック同期/非同期非同期同期同期
全二重/半二重全二重全二重半二重
リレーション1対11対多1対多
配線本数
 (GNDは含めない)
2~4本
(Tx,Rx,RTS,CTS)
3本+スレーブ数分のCS
(SCLK, MOSI, MISO, CS)
2本
(SCL, SDA)
通信相手の特定不要CSで特定スレーブアドレスで特定
通信速度 [bps]中速
(9.6k~1M)
高速
(1M〜10M)
中速
(100k〜3.4M)
IO出力プッシュプルプッシュプルオープンドレイン
端子接続クロスストレートストレート
プルアップ抵抗不要不要必要
長距離配線強い
(~数百m)
弱い
(~1m)
弱い
(~0.5m)
1フレーム長さの基準設定
(データビット数)
クロック停止プロトコルで規定
(8bit+ACK/NACK)
メカ坊や
メカ坊や

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

メカ旦那
メカ旦那

基本的には接続するセンサ・モジュールがどれか1つに対応しているのでそれを使えばよいです。ただこれらの規格はマイコン通信でよく出てくるが故に混同しやすいので、違いを知っておくことで配線ミスや通信不具合を防ぐことができます!I2C、UARTはこちらでも詳しく解説していますので、ぜひご覧ください!

まとめ

SPIの特徴をまとめると、以下になります。

  • データの伝送方式:デジタル、シリアル、クロック同期、全二重、シングルエンド、1対多
  • 配線
    • 信号線はSCL、MOSI、MISO、CSの4種類、
    • プルアップ抵抗は不要、
    • GNDを合わせる
  • 伝送タイミング:モード0,1,2,3の4種類ある(モード0が主流)

一般的なシリアル通信の中では高速な為、様々なセンサで利用されています。

メカ坊や
メカ坊や

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

メカ旦那
メカ旦那

ラズパイ⇔ADコンバータ間のSPI通信について記事にしてみたので、ぜひご覧ください!

また他のシリアル通信についても解説しているのでぜひご覧ください!

メカ旦那

旧帝大工学部を卒業後、電気制御設計職をしています。生産設備や産業用ロボット等、様々な開発に取り組んでいます。電験三種も保持しています。イラストや画像を用いて電気・電子・制御をわかりやすく解説します!

メカ旦那をフォローする
基礎知識
スポンサーリンク

コメント