Thanks for the help John!
I figured out what I was doing wrong. I had a problem with my switchcase statement in my slave code.
I am posting my final code below.
Master Code:
#include <SPI.h>
void setup (void)
{
pinMode(MOSI, OUTPUT);
pinMode(MISO, INPUT);
pinMode(SCK, OUTPUT);
pinMode(SS, OUTPUT);
Serial.begin (115200);
Serial.println ();
digitalWrite(SS, HIGH);
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
byte transferAndWait (const byte what)
{
byte a = SPI.transfer (what);
delayMicroseconds (10);
return a;
}
union first_union{
float f;
byte b[4];}
data;
void loop (void)
{
digitalWrite(SS, LOW);
transferAndWait ('a');
data.b[0] = transferAndWait ('b');
data.b[1] = transferAndWait ('c');
data.b[2] = transferAndWait ('d');
data.b[3] = transferAndWait (0);
digitalWrite(SS, HIGH);
Serial.print("data.f = ");Serial.println(data.f);
Serial.print("data.b[0] = ");Serial.println(data.b[0]);
Serial.print("data.b[1] = ");Serial.println(data.b[1]);
Serial.print("data.b[2] = ");Serial.println(data.b[2]);
Serial.print("data.b[3] = ");Serial.println(data.b[3]);
delay(1000);
}
Slave Code:
byte command = 0;
void setup (void)
{
pinMode(MOSI, INPUT);
pinMode(SCK, INPUT);
pinMode(SS, INPUT);
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode
SPCR |= _BV(SPE);
// turn on interrupts
SPCR |= _BV(SPIE);
} // end of setup
// SPI interrupt routine
ISR (SPI_STC_vect)
{
union first_union{
float f;
byte b[4];}
data;
byte c = SPDR;
data.f = 3.14;
command = c;
switch (command)
{
// no command? then this is the command
case 0:
SPDR = 0;
break;
// incoming byte, return byte result
case 'a':
SPDR = data.b[0];
break;
// incoming byte, return byte result
case 'b':
SPDR = data.b[1];
break;
// incoming byte, return byte result
case 'c':
SPDR = data.b[2];
break;
// incoming byte, return byte result
case 'd':
SPDR = data.b[3];
break;
} // end of switch
} // end of interrupt service routine (ISR) SPI_STC_vect
void loop (void)
{
// if SPI not active, clear current command
if (digitalRead (SS) == HIGH)
command = 0;
}