Arduino日本語リファレンス



SPI規格はあまり厳密なものではなく、デバイスごとの実装はわずかながら異なっています。新たなデバイスに対応するコードを書くときは、データシートをよく読んでください。
一般的には4種類の転送モードが使われます。これらのモードは、クロック位相(clock phase)とクロック極性(clock polarity)という2つの要素で決定されます。クロック位相はシフトされたデータを読み取るタイミング(立ち上がりエッジか立ち下がりエッジか)、クロック極性はアイドリング状態のときのクロックの状態(highかlowか)を示します。これらの設定はSPI.setDataMode()を使って行います。パラメータの組み合わせは次の表のとおりです。

ModeClock Polarity (CPOL)Clock Phase (CPHA)
000
101
210
311

SPIパラメータを正しくセットしたあとは、データシートを見ながら、デバイスの機能とそれを制御するレジスタの使い方を調べていくことになるでしょう。

【接続】

SPI通信で使われるピンは次のとおりです。

Arduino Uno(ATmega168/328を搭載するボード): 10(SS)、11(MOSI)、12(MISO)、13(SCK)
Arduino Leonardo: ICSP4(MOSI)、ICSP1(MISO)、ICSP3(SCK)
Arduino Mega: 50(MISO)、51(MOSI)、52(SCK)、53(SS)

SSピンは使わない場合でも出力状態のままにしておく必要があります。そうしないと、SPIインタフェイスがスレーブモードに移行し、ライブラリが動作しなくなります。

10番以外のピンをスレーブ選択(SS)ピンとして使うことができます。たとえば、Ethernet shieldはピン4をオンボードのSDカードの制御に使い、ピン10をEthernetコントローラに割り当てています。

【例】

・BarometricPressureSensor: SPIを使って気圧と温度を読み取ります
 http://arduino.cc/en/Tutorial/BarometricPressureSensor

・SPIDigitalPot: デジタルポテンショメータを使う例です
 http://arduino.cc/en/Tutorial/SPIDigitalPot

【補足】

SPIの初期化をSPISettingsとSPI.beginTransactionを使って行う新しい方法があります。使用例は次のとおりです。

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

この方法はパラメータの設定が一度で済むため可読性が良好ですが、従来式のひとつひとつ個別の関数で設定する方法を示している作例もまだ多いので、ここでは個別に解説します。



[目次へ戻る]

Creative Commons Attribution-ShareAlike 3.0 License.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください [ドキュメント一覧]