概要原文【SPIの概要】 Serial Peripheral Interface(SPI)は、マイクロコントローラにひとつあるいは複数のデバイスを接続する目的で使われる、短距離用の簡便な同期通信プロトコルです。SPIは2つのマイコン間での通信にも使用されます。 SPIによる接続では、周辺のデバイスをコントロールするマスタデバイス(通常はマイコン)が必ず1つだけ存在します。デバイス間を3本の線で接続するのが典型的な使い方です。 ・Master In Slave Out (MISO) - スレーブ(周辺デバイス)からマスタへデータを送るライン ・Master Out Slave In (MOSI) - マスタからスレーブへデータを送るライン ・シルアルクロック (SCK) - データ転送を同期させるため、マスタにより生成されるクロック信号 ・スレーブ選択ピン (Slave Select pin) - 各デバイスは、(上記の信号線以外に)マスタがどのデバイスを有効にするか指定するためのピンを持っています。このピンがlowの場合、マスタとの通信が有効になります。highの場合、マスタからのデータを無視します。これにより複数のSPIデバイスが3本の信号線を共有できます。 SPIデバイスに対応するコードを書くときは、いくつかの決まり事を考慮してください。 ・ビットオーダーはLSBFIRSTかMSBFIRSTか? (SPI.setBitOrderを使って指定します)。 ・アイドリング状態を示すクロック信号はhighかlowか? (SPI.setDataModeで指定します) ・サンプリングはクロックの立ち上がりエッジか、立ち下がりエッジか? (SPI.setDataModeで指定します) ・SPIの動作スピード。 (SPI.setClockDividerで指定します) SPI規格はあまり厳密なものではなく、デバイスごとの実装はわずかながら異なっています。新たなデバイスに対応するコードを書くときは、データシートをよく読んでください。 一般的には4種類の転送モードが使われます。これらのモードは、クロック位相(clock phase)とクロック極性(clock polarity)という2つの要素で決定されます。クロック位相はシフトされたデータを読み取るタイミング(立ち上がりエッジか立ち下がりエッジか)、クロック極性はアイドリング状態のときのクロックの状態(highかlowか)を示します。これらの設定はSPI.setDataMode()を使って行います。パラメータの組み合わせは次の表のとおりです。
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までお送りください [Arduino wiki]