2台のArduino MegaでSlaveのAD変換値をSPIでMasterに送信する


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 cmdADC = 3;
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("getting ADC value.");
    nextMillis = millis() + 5000;
    digitalWrite(SS, LOW);
    byte rx = SPI.transfer(cmdADC);
    delay(5);
    byte hbyte = SPI.transfer(255);
    delay(5);
    byte lbyte = SPI.transfer(255);
    int val = (hbyte<<8) + lbyte;
    Serial.print("received: ");
    Serial.println(val);
    digitalWrite(SS, HIGH);
  } 
}

slave

#include <SPI.h>

boolean SSlast = LOW;         // SS last flag.
const byte cmdADC = 3;

void SlaveInit(void) {
  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);
  SlaveInit();
}

void loop() {
  if (digitalRead(SS)==LOW) {
    if (SSlast==HIGH) {
      pinMode(MISO, OUTPUT);
      byte rx = SPItransfer(255);
      if (rx==cmdADC) {
        int val = analogRead(A0); 
        byte Hbyte = val / 256;
        byte Lbyte = val % 256;
        byte rx = SPItransfer(Hbyte); 
        rx = SPItransfer(Lbyte);
        Serial.println(val);
      }
      else {
        byte rx = SPItransfer(255);
        Serial.print("received rx: ");
        Serial.println(rx);
      }
      SSlast = LOW;
    }
  }
  else {
    if (SSlast==LOW) {
      pinMode(MISO, INPUT);
      SSlast = HIGH;
    }
  }
}