シリアル・ペリフェラル・インターフェイス(SPI)は、マイクロコントローラと、一つ以上の近距離の周辺機器との通信するための、同期シリアルデータプロトコルです。
AUTHOR: Arduino、LAST REVISION: 2022/10/05 22:00
この記事は、2021/11/18にKarl Söderby氏により改定されました。
マスター/スレーブ(旧) | コントローラ/ペリフェラル(新) |
---|---|
マスターイン・スレーブアウト(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()
の中で使うことです。例えば、
|
|
他のライブラリが割り込みから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のページを参照してください。
チュートリアル
- Extended SPI Library Usage with the Arduino Due
- Introduction to the Serial Peripheral Interface
- Digital Potentiometer Control (SPI)
- Barometric Pressure Sensor (SPI)
オリジナルのページ
https://docs.arduino.cc/learn/communication/spi
最終更新日
November 14, 2022