2台のArduinoでSPI通信する

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;
    }
  }
}