SPI通信(Arduino詳解)

Arduino詳解その32です。前回の記事はこちらです。 hirocom777.hatenadiary.org

SPI通信

前回はSDカードの操作についてご紹介しました。ここで使用したSDカード用ライブラリではSPI通信を使用としています。今回は、このSPI通信について説明していきたいと思います。 f:id:HiroCom777:20210312223336j:plain SPIとは、シリアル・ペリフェラル・インタフェース(Serial Peripheral Interface)の略です。コンピューター内のデバイス間通信に使用されます。マスターと呼ばれる主となるデバイスからスレーブと呼ばれる複数のデバイスへの通信が可能です。

ArduinoでSPI通信をする場合

ArduinoでSPI通信をする場合は、SPI通信用のライブラリを使用するのが一般的です。これまで紹介したスケッチの先頭にありましたが#include <SPI.h>をスケッチの先頭に記述します。使用する信号は、以下の様に割り当てられます。

  • SCLK Serial Clock(ArduinoUNOでは13番ピン)

 マスターから生成されるシリアルクロックです。

  • MISO Master In Slave Out(ArduinoUNOでは12番ピン)

 スレーブからマスターに入力されるデータの信号線です。

  • MOSI Master Out Slave In(ArduinoUNOでは11番ピン)

 マスターからスレーブに出力されるデータの信号線です。

  • SS Slave Select(任意のピンを指定。前回ご紹介したスケッチでは4番ピン)

 スレーブを選択する信号です。マスターに接続する本数だけ必要となります。

I2C通信との違い

コンピューター内のデバイス間通信に使用される手法として、I2C通信があります。I2C通信は以下の記事で紹介しています。

hirocom777.hatenadiary.org

I2C通信とSPI通信、どちらも同じ同期式シリアル通信(クロック信号で同期をとる通信方式)です。それでは2つの違いは何なんでしょうか?

まず、接続に必要な信号線の数が違います。I2C通信に必要な信号線はSCL(クロック)とSDA(データ入出力)の2本。2本だけで複数のデバイスと通信可能です。対してSPI通信は、上に示した通り4本の信号が必要となります。しかも4本で通信できるデバイスは1個だけ。通信するデバイスが増えると、デバイスの数だけSS信号が増えてしまいます。複数のデバイスと通信する場合はI2C通信の方が有利ですね。

次に通信速度はどうでしょうか。2つの通信速度を比べると、以下の様になります。

  • SPI通信 1 Mbps ~ 2 Mbps(マイコンの性能に依存)
  • I2C通信 100Kbps(標準モード)400Kbps(ファーストモード)

SPI通信の方が圧倒的に速いです。おまけにSPI通信は全二重(送信と受信の信号が別々)ですのでデータの送信、受信を別々に制御できます。I2C通信は半二重(送信と受信の信号が同じ)データの送信、受信を同時に実行することはできません。

つまり、速度が遅くても複数のデバイスを繋ぎたい場合(センサーからの値の読込みや、表示装置への出力など)はI2C通信が向いていて、高速に大きなデータをやり取りしたい場合にはSPI通信が向いていると言う事です。前回まででご紹介したSDカードへのアクセスの場合、大量のデータをやり取りするためSPI通信が採用されていると言う訳です。

I2C通信とSPI通信、特徴を良く把握して使い分けましょう。もっとも接続するデバイスがどちらの通信方式に対応いているかで決まってしまうことが殆んどです。

長いこと有難うございました

さて、この連載も長いこと続けてきましたが、ArduinoUNO詳解の連載は今回で最終回となります。長いことお付き合いいただき有難うございました。連載を通して色々勉強ができてよかったです。また別の記事を書きたいと思いますのでお楽しみに!!

Arduino UNO入門の連載記事はコチラからどうぞ!!