■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(); }
■構文
SPI.usingInterrupt(interruptNumber)
■パラメータ
interruptNumber:登録する割り込みピン番号。
■戻り値
有りません。