Arduino-serial-peripheral-interface

提供:Dev Guides
移動先:案内検索

Arduino-シリアル周辺機器インターフェース

シリアルペリフェラルインターフェイス(SPI)バスは、シリアル通信用のシステムで、最大4本(通常は3本)の導体を使用します。 1つの導体はデータ受信、1つはデータ送信、1つは同期、もう1つは通信するデバイスの選択に使用されます。 これは全二重接続です。つまり、データは同時に送受信されます。 最大ボーレートは、I2C通信システムよりも高くなっています。

ボードSPIピン

SPIは次の4本のワイヤを使用します-

  • SCK -これはマスターによって駆動されるシリアルクロックです。
  • MOSI -これは、マスターによって駆動されるマスター出力/スレーブ入力です。
  • MISO -これは、マスターによって駆動されるマスター入力/スレーブ出力です。
  • SS -これはスレーブ選択線です。

以下の機能が使用されます。 SPI.hを含める必要があります。

  • * SPI.begin()*-SCK、MOSI、およびSSを出力に設定し、SCKおよびMOSIをLowに、SSをHighに設定することにより、SPIバスを初期化します。
  • * SPI.setClockDivider(divider)*-システムクロックに対してSPIクロック分周器を設定します。 AVRベースのボードでは、利用可能な仕切りは2、4、8、16、32、64または128です。 デフォルト設定はSPI_CLOCK_DIV4で、SPIクロックをシステムクロックの4分の1の周波数(20 MHzのボードでは5 Mhz)に設定します。
  • 分周器-(SPI_CLOCK_DIV2、SPI_CLOCK_DIV4、SPI_CLOCK_DIV8、SPI_CLOCK_DIV16、SPI_CLOCK_DIV32、SPI_CLOCK_DIV64、SPI_CLOCK_DIV128)の可能性があります。
  • * SPI.transfer(val)*-SPI転送は同時送信および受信に基づいています。受信データはreceivedValに返されます。
  • * SPI.beginTransaction(SPISettings(speedMaximum、dataOrder、dataMode))*-speedMaximumはクロック、dataOrder(MSBFIRSTまたはLSBFIRST)、dataMode(SPI_MODE0、SPI_MODE1、SPI_MODE2、またはSPI_MODE3)です。

SPIには次の4つの動作モードがあります-

  • モード0(デフォルト)-クロックは通常ロー(CPOL = 0)で、データはローからハイへの遷移(リーディングエッジ)でサンプリングされます(CPHA = 0)。
  • *モード1 *-クロックは通常ロー(CPOL = 0)で、データはハイからローへの遷移(トレーリングエッジ)でサンプリングされます(CPHA = 1)。
  • *モード2 *-クロックは通常High(CPOL = 1)で、データはHighからLowへの遷移(リーディングエッジ)でサンプリングされます(CPHA = 0)。
  • *モード3 *-クロックは通常ハイ(CPOL = 1)で、データはローからハイへの遷移(トレーリングエッジ)でサンプリングされます(CPHA = 1)。
  • * SPI.attachInterrupt(handler)*-スレーブデバイスがマスターからデータを受信したときに呼び出される関数。

次に、2つのArduino UNOボードを接続します。 1つはマスター、もう1つはスレーブです。

  • (SS):ピン10
  • (MOSI):ピン11
  • (MISO):ピン12 *(SCK):ピン13

グラウンドは一般的です。 以下は、両方のボード間の接続の図表示です-

ボードの接続

SPIをマスターとして、SPIをスレーブとして使用する例を見てみましょう。

マスターとしてのSPI

#include <SPI.h>

void setup (void) {
   Serial.begin(115200);//set baud rate to 115200 for usart
   digitalWrite(SS, HIGH);//disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW);//enable Slave Select
  //send test string
   for (const char* p = "Hello, world!\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH);//disable Slave Select
   delay(2000);
}

スレーブとしてのSPI

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT);//have to send on master in so it set as output
   SPCR |= _BV(SPE);//turn on SPI in slave mode
   indx = 0;//buffer empty
   process = false;
   SPI.attachInterrupt();//turn on interrupt
}
ISR (SPI_STC_vect)//SPI interrupt routine {
   byte c = SPDR;//read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c;//save data in the next index in the array buff
      if (c == '\r')//check for the end of the word
      process = true;
   }
}

void loop (void) {
   if (process) {
      process = false;//reset the process
      Serial.println (buff);//print the array on serial monitor
      indx= 0;//reset button to zero
   }
}