SPI.begin()はマスターにしか使えない。
スレーブは SPCR = (1 << SPE); で初期化
http://forum.arduino.cc/index.php?topic=184527.0
master
#include <SPI.h> const byte btn = 12; // Master button digital I/O pin. const byte led = 13; // Master LED digital I/O pin. const byte cmdBtn = 1; // Master command button press. const byte cmdLEDState = 2; // Master command read slave LED state. unsigned long nextMillis = 0; // Next millis() for master LED update. void setup() { Serial.begin(9600); pinMode(SCK, OUTPUT); pinMode(MOSI, OUTPUT); pinMode(MISO, INPUT); pinMode(SS, OUTPUT); pinMode(btn, INPUT_PULLUP); pinMode(led, OUTPUT); nextMillis = millis(); SPI.begin(); Serial.println("Master started"); } void loop() { if (millis() >= nextMillis) { Serial.println("millis() > netMillis"); nextMillis = millis() + 5000; digitalWrite(SS, LOW); delay(5); byte rx = SPI.transfer(cmdLEDState); delay(5); rx = SPI.transfer(255); if (rx == cmdLEDState) { delay(5); byte rx = SPI.transfer(255); Serial.println(rx); digitalWrite(led, rx); } digitalWrite(SS, HIGH); } }
slave
#include <SPI.h> boolean SSlast = LOW; // SS last flag. const byte led = 13; // Slave LED digital I/O pin. boolean ledState = LOW; // LED state flag. const byte cmdBtn = 1; // SPI cmdBtn master command code. const byte cmdLEDState = 2; // void SlaveInit(void) { pinMode(led,OUTPUT); pinMode(SCK, INPUT); pinMode(MOSI, INPUT); pinMode(MISO, INPUT); pinMode(SS, INPUT); SPCR = (1 << SPE); } byte SPItransfer(byte value) { SPDR = value; while(!(SPSR & (1<<SPIF))); delay(2); return SPDR; } void setup() { Serial.begin(9600); pinMode(led, OUTPUT); digitalWrite(led, ledState); SlaveInit(); } void loop() { if (digitalRead(SS)==LOW) { if (SSlast==HIGH) { pinMode(MISO, OUTPUT); byte rx = SPItransfer(255); if (rx==cmdBtn) { byte rx = SPItransfer(cmdBtn); Serial.println("rx==cmdBtn (=1)"); } else if (rx==cmdLEDState) { byte rx = SPItransfer(cmdLEDState); ledState = !ledState; digitalWrite(led, ledState); rx = SPItransfer(ledState); Serial.println("rx==cmdLEDState (=2)"); } else { byte rx = SPItransfer(255); Serial.print("received rx: "); Serial.println(rx); } SSlast = LOW; } } else { if (SSlast==LOW) { pinMode(MISO, INPUT); SSlast = HIGH; } } }