NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDE(SPI: usingInterrupt関数の使い方)

■SPI: usingInterrupt関数
 SPI.usingInterrupt関数は、もし割り込み処理中にSPIのトランザクションを行う必要がある場合に、あらかじめSPI.usingInterrupt関数により使用する割り込み番号を登録します。
 SPI.usingInterrupt関数で使用する割り込み番号を登録しておくと、SPI.beginTransaction関数を実行する際にその割り込みがマスクされます。
 また、SPI.endTransaction関数が実行される際に、マスクが解除されます。この処理により、他の機器とのSPI通信の最中に割り込みがかかる事を防ぐ事ができます。
 この値は整数で、attachInterrupt関数で使用する数値と同じです。

■使用例
 ArduinoIDEで使用するSPI.usingInterrupt関数の使い方は以下の通りです。
 試しにこのプログラムをArduinoUNOで実行すると、最初にSPI.begin関数でSPI通信を初期化します。次にconfigureInterruptPin関数で指定したピン番号について割り込みピンか判定し、割り込みピンで有った場合はSPI.usingInterrupt関数により使用する割り込み番号を登録、attachInterrupt関数で割り込みピンを設定します。
  メインループでは、割り込みによって2番ピンの電圧の変化を監視し、変化を確認するとLEDを消灯し、さらに変化するとLEDを点灯します。これらと並行してSPI.transfer関数で「0x55」を出力し、SPI.transfer関数で「0xff」SPIバスでデータを取得します。

#include <SPI.h>
volatile int TOGGLE = LOW;//並行して動作するコード用変数にLEDをトグルする値を格納
SPISettings settingsA(2000000, MSBFIRST, SPI_MODE1); // 速度、データの順序とデータモードを設定する

void configureInterruptPin(byte pin) {
   int intNum = digitalPinToInterrupt(pin);
   if (intNum != NOT_AN_INTERRUPT) {
       SPI.usingInterrupt(intNum);
       attachInterrupt(intNum, blink, CHANGE);
   }
}

void blink(void) {             //割り込み番号0(2番ピン)の電圧に変化があった時のみ実行される
   if (digitalRead(2) == LOW) {               //もし2番ピンがLOWなら{}内を実行する
       TOGGLE = LOW;                                             //LEDトグル変数をLOWにする
   } else {                             //もし2番ピンがLOWでなかったら(HIGHなら)以下の{}内を実行する
       TOGGLE = HIGH;
   }
}                                               //LEDトグル変数をHIGHにする

void setup() {
   SPI.begin();
   pinMode(13, OUTPUT);//LEDが接続された13番ピンを出力に設定
   pinMode(2, INPUT_PULLUP);//外部割込みを監視する2番ピンをプルアップし入力に設定
   configureInterruptPin(2);
}//割り込みピンを設定する;

void loop() {
   digitalWrite(13, TOGGLE);                       //LEDが接続された13番ピンをトグルする
   SPI.beginTransaction(settingsA);
   SPI.transfer(0x55);//write
   uint8_t data = SPI.transfer(0xff);//read
   SPI.endTransaction();
}
イメージ 1
図1:プログラム例

■構文
 SPI.usingInterrupt(interruptNumber)

■パラメータ
 interruptNumber:登録する割り込みピン番号。

■戻り値
 有りません。 

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【ArduinoIDE reference】目次に戻る