Arduinoリファレンス
Arduinoリファレンスの日本語訳のページです
SPI

このライブラリを利用するとArduinoをマスターデバイスとして、SPIデバイスと通信することができる。

このライブラリを使うためには、以下を宣言する。

#include <SPI.h> 

シリアルペリフェラルインターフェイス(Serail Peripheral Interface:SPI)の簡単な紹介

シリアルペリフェラルインターフェイス(Serail Peripheral Interface:SPI)は、近距離にある一つ以上の周辺機器とマイクロコントローラが簡単に通信するための、同期型のシリアルデータ通信プロトコルである。2つのマイクロコントローラ間での通信にも利用可能である。

SPI接続では、周辺機器を制御するためのマスターデバイス(通常はマイクロコントローラ)が常に一つある。全てのデバイスで共有する3つの配線があるのが典型である。

  • MISO(Master In Slave Out) - データをマスターに送信するためのスレーブ接続。
  • MOSI(Master Out Slave In) - データをスレーブに送信するためのマスター接続。
  • SCK(Serial Clock) - マスターによって生成されるデータ転送を同期させるためのクロックパルス。

また、デバイスに特有の1つの配線がある。

  • SS(Slave Select) - 特定のデバイスを許可したり禁止したりするためにマスターが利用できる各デバイスにあるピン。デバイスのSlave Select pinがLOWのとき、スレーブはマスターと通信する。HIGHのときは、マスターを無視する。これにより、複数のデバイスで同一のMISO、MOSI、CLK接続を共有することができる。

新しいSPIデバイス用のコードを書くには、いくつかのことに注意する必要がある。

  • データが最上位ビット(MSB)から送信されるか、最下位ビット(LSB)から送信されるか?これは、SPI.setBitOrder()関数で制御する。
  • データクロックがアイドルのとき、HIGHなのかLOWなのか?
  • データ取得は、クロックパルスが立ち上がるときなのか、立ち下がるときなのか?これとクロックのアイドリングはSPI.setDataMode()関数で制御する。
  • SPIの通信速度は?これは、SPI.setClockDivder()関数で制御する。

SPI標準はあまり厳密ではないので、各デバイスは少し異なる実装をしている。このため、コードを書くときには、デバイスのデータシートを参照して注意する必要がある。

一般に、送信モードが4種類ある。これらのモードは、データの送受信がクロックシグナルが立ち上がるときに送信されるのか立ち下がるときに送信されるのか(クロックフェーズと呼ばれる)、クロックがアイドル時にHIGHなのかLOWなのか(クロック極性と呼ばれる)を制御する。4つのモードはフェーズと極性の組み合わせで決まる。SPI.setDatamode()関数が下の表に従って、モードとクロック極性を設定するのに利用される。

モードクロック極性(CPOL)クロックフェーズ(CPHA)出力エッジデータキャプチャ
SPI_MODE000FallingRising
SPI_MODE101RisingFalling
SPI_MODE210RisingFalling
SPI_MODE311FallingRising

SPIパラメータを設定した後は、SPIポートを利用開始するために、SPI.beginTransaction()を利用する。SPIポートは設定される。もっとも簡単で効率的にSPI設定を行うには、SPI.beginTransaction()の中で直接設定することである。例えば、

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

他のライブラリが割り込みからSPIを使うときは、SPI.endTransaction()を呼び出すまではSPIへのアクセスは抑止される。SPI設定はトランザクションの最初に設定され、SPI.endTransaction()では変更されない。2回目のSPI.beginTransaction()が呼ばれるまでは、設定は保持される。自分のプログラムが、SPIを利用するライブラリを同時に使う場合に両者を両立させるためには、SPI.endTransaction()を呼ぶまでの時間を最小にする必要がある。

ほとんどのSPIデバイスでは、SPI.beginTransaction()を呼んだ後は、SSピンをLOWにし、データ通信のためにSPI.transfer()を任意の回数呼び、SSピンをHIGHにし、最後にSPI.endTransaction()を呼ぶ。

接続

以下の表は、異なるArduinoボードで、どのピンがSPI接続に利用されるかを示す。

Arduino/GenuinoボードMOSIMISOSCKSS(Slave)SS(Master)Level
Uno/Duemilanove11/ICSP-412/ICSP-113/ICSP-310-5V
Mega1280/Mega256051/ICSP-450/ICSP-152/ICSP-353-5V
LeonardoICSP-4ICSP-1ICSP-3--5V
DueICSP-4ICSP-1ICSP-3-4, 10, 523.3V
ZeroICSP-4ICSP-1ICSP-3--3.3V
10111/ICSP-412/ICSP-113/ICSP-310103.3V
MKR10008109--3.3V

MISOとMOSI、SCKはICSPヘッダでは同じ場所である。これは、すべてのボードで動作するシールドを作成する際に役に立つ。ICSPピンの配列については、オリジナルのページを参照してください。

AVRベースのボードでの、Slave Select(SS)ピンに関する注意

すべてのAVRベースのボードは、外部のマスターによって制御されるSlaveとして動作する際に役立つ、SSピンを持っている。このライブラリはマスターモードだけをサポートするので、このピンは常にOUTPUTに設定されなければならない。そうしないと、SPIインターフェイスはハードウェアにより自動的にスレーブモードとなり、ライブラリが動作しなくなる。

しかし、デバイスは任意のピンをSSとして利用することができる。例えば、Ethernetシールドはボード上のSDカードとのSPI接続を制御するために4番ピンを使用し、10番ピンをイーサネットコントローラに使用する。

SPI
SPIオブジェクトを設定する。
SPIバスを初期化する。
SPIバスを無効にする。ピンモードの変更は行わない。
SPIバスを、SPISettingsでの定義を用いて初期化する。
SPIバスの利用を停止する。
入出力するときのビットの順序を設定する。
SPIクロックの分周数を設定する。
SPIのデータモードを設定する。
SPIバスでデータを転送する。
SPIトランザクションを割り込みの中で実行する場合に割り込み番号もしくは割り込み名称を、SPIライブラリに登録する。
SSPIトランザクションを割り込みの中で実行する場合に割り込み番号もしくは割り込み名称を、SPIライブラリに登録する。

プログラム例

プログラム例 説明
Barometric Pressure Sensor SPIプロトコルを使ってセンサから大気圧と温度を読み取る。
Digital Pot Control SPIプロトコルを使てAD5206を制御する。

オリジナルのページ

https://www.arduino.cc/en/Reference/SPI

inserted by FC2 system