Arduinoとシリアル・ペリフェラル・インターフェイス(SPI)

シリアル・ペリフェラル・インターフェイス(SPI)は、マイクロコントローラと、一つ以上の近距離の周辺機器との通信するための、同期シリアルデータプロトコルです。


AUTHOR: Arduino、LAST REVISION: 2022/10/05 22:00


この記事は、2021/11/18にKarl Söderby氏により改定されました。

i
コントローラ/ペリフェラルは、以前はマスター/スレーブとして知られていました。Arduinoではこの用語は用いません。新しい用語を理解するには、以下の表を参照してください。
マスター/スレーブ(旧) コントローラ/ペリフェラル(新)
マスターイン・スレーブアウト(MISO) コントローライン・ペリフェラルアウト(CIPO)
マスターアウト・スレーブイン(MOSI) コントローラアウト・ペリフェラルイン(COPI)
スレーブセレクトピン(SS) チップセレクトピン(CS)

SPIライブラリ

SPIライブラリは全てのArduinoコア・プラットフォームに含まれているので、追加でインストールする必要はありません。SPI関数についての詳細は、以下を参照してください。

シリアル・ペリフェラル・インターフェイス(SPI)

SPI接続では、常に一つのコントローラデバイス(通常はマイクロコントローラ)が存在し、周辺機器を制御します。全ての機器に共通の3つの信号線があります。

  • CIPO(コントローライン・ペリフェラルアウト - 周辺機器がコントローラにデータを送信するための信号線。
  • COPI(コントローラアウト・ペリフェラルイン) ^ コントローラが周辺機器にデータを送信するための信号線。
  • SCK(シリアルクロック) - データ通信を同期させるために、コントローラにより生成されるクロックパルスで、全ての機器で共通の1本の信号線。
  • CS(チップセレクト) - コントローラが、特定の機器の使用を許可・禁止するのに使われる、各機器にあるピン。機器のチップセレクトピンがLOWのとき、その機器はコントローラと通信します。HIGHのときは、コントローラを無視します。これにより、CIPO・COPI・CLKの各信号線を複数のSPI機器間で共有することができます。

新しいSPI機器用のコードを書くには、いくつかのことを知る必要があります。

  • 機器が利用できる最大のSPIスピード。これは、SPISettingsの第1パラメータで制御できます。15MHzのチップを使うときは、15000000を使用します。Arduinoは自動的に、SPISettingsで使った値以下の、最適なスピードを使います。
  • データが、MSB(最上位ビット)から送信されるか、LSB(最下位ビット)から送信されるか。これは、SPISettingsの第2パラメータにより制御され、MSBFIRSTかLSBFIRSTのどちらかです。ほとんどのSPIチップは、MSBFIRSTのデータ順序を使います。
  • アイドル状態のクロックの極性がHIGHかLOWか。データのサンプリングに使われるクロックパルスが、立ち上がりか立下がりか。これらのモードは、SPISettingsの第3パラメータで制御します。
  • SPI標準は緩やかで、各機器は少しずつ違った形で実装されています。コードを書くときには、機器のデータシートに細心の注意を払う必要があります。

一般的に、送信には4つのモードがあります。これらのモードは、データクロックが立ち上がりのときにデータを送信するのか、立下りのときにデータを送信するのか(クロックフェーズと呼ばれます)と、アイドル状態のクロックの極性がHIGHかLOWか(クロック極性と呼ばれます)を制御します。極性とフェーズで4つのモードの組み合わせができます。

モード クロック極性(CPOL) クロックフェーズ(CPHA) 出力エッジ データ取得
SPI_MODE0 0 0 立ち下がり 立ち下がり
SPI_MODE1 0 1 立ち下がり 立ち下がり
SPI_MODE2 1 0 立ち下がり 立ち下がり
SPI_MODE3 1 1 立ち下がり 立ち下がり

SPIパラメータがわかると、SPI.beginTransaction()を使い、SPIポートの使用を開始します。SPIポートは、全ての設定が反映されます。もっとも簡単で効率のいい方法は、SPISettingsを直接SPI.beginTransaction()の中で使うことです。例えば、

1
SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));

他のライブラリが割り込みからSPIを使うのであれば、SPI.endTransaction()を呼ぶまでは、SPIへのアクセスは禁止されます。SPI設定はトランザクションの最初で適用され、SPI.endTransaction()は、SPI設定を変更しません。あなたのプログラムや他のライブラリが、2回目のbeginTransactionを呼び出さない限りは、設定は維持されます。あなたのプログラムが、SPIを利用する他のライブラリを同時に使う場合は、互換性のために、SPI.endTransaction()を呼ぶまでの時間は最小化するべきです。

ほとんどのSPI機器では、SPI.beginTransaction()を呼んだ後、チップセレクトピンをLOWにし、SPI.transfer()を任意の回数呼び出しデータを転送し、CSピンをHIGHにし、最後に、SPI.endTransaction()を呼び出します。

SPIの詳細は、WikipediaのSPIのページを参照してください。

チュートリアル

オリジナルのページ

https://docs.arduino.cc/learn/communication/spi

最終更新日

November 14, 2022

inserted by FC2 system