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