Connecting 2 Photon via SPI

It took a lot of work to get this going. Here is my working code with the help of @rickkas7

The github is at

The 2 Photon SPI Serial breadboard:

The SPI Master

// SPI-Master.ino
// By Jeremy Ellis
// MIT license
// Use at your own risk!

const unsigned long SEND_PERIOD_MS = 10000;
const int SS_PIN = A2;
const size_t NUM_VALUES = 32;

unsigned long lastSend = 0;
uint32_t rcvdValues[NUM_VALUES];
uint32_t sendValues[NUM_VALUES];

String myMasterSent = "Hello to Slave";
String mySlaveSent ;

void setup() {

SPI.begin(SPI_MODE_MASTER, SS_PIN);
}

void loop() {
if (millis() - lastSend >= SEND_PERIOD_MS) {
lastSend = millis();

  digitalWrite(SS_PIN, LOW);
  for(size_t ii = 0; ii < NUM_VALUES; ii++) {
  	sendValues[ii] = (byte)myMasterSent[ii];
  }
  SPI.transfer(sendValues, rcvdValues, NUM_VALUES * sizeof(uint32_t), 0);
  digitalWrite(SS_PIN, HIGH);

}
mySlaveSent = "";
for(size_t ii = 0; ii < NUM_VALUES; ii++) {

  mySlaveSent  += 'H';   // for setCharAt to work the string needs a character to replace
    mySlaveSent.setCharAt(ii, (char)rcvdValues[ii] );    // update string

}

Particle.publish( "Master sent " + myMasterSent, "Getting from Slave "+ mySlaveSent  , 60, PRIVATE);

delay(9000);
}

The SPI-slave.ino

// SPI-Slave.ino
// By Jeremy Ellis
// MIT license
// Use at your own risk!

void slaveSelect(uint8_t state);
void slaveCallback();

const int SS_PIN = A2;
const size_t NUM_VALUES = 32;

bool gotValue = false;
String sentToMaster="Hi from slave";
String gotFromMaster;

uint32_t rcvdValues[NUM_VALUES];
uint32_t sendValues[NUM_VALUES];

void setup() {

for(size_t ii = 0; ii < NUM_VALUES; ii++) {
sendValues[ii] = (byte)sentToMaster[ii];
}

SPI.onSelect(slaveSelect);
SPI.begin(SPI_MODE_SLAVE, SS_PIN);
}

void loop() {
if (gotValue) {
gotValue = false;
gotFromMaster = "";

  for(size_t ii = 0; ii < NUM_VALUES; ii++) {
      gotFromMaster  += 'H';   // for setCharAt to work the string needs a character to replace
        gotFromMaster.setCharAt(ii, (char)rcvdValues[ii] );    // update string
  }
  Particle.publish( "Slave sent "  + sentToMaster, "Getting from Master " + gotFromMaster, 60, PRIVATE);
  delay(2000);   

}
}

void slaveSelect(uint8_t state) {
if (state) {
SPI.transfer(sendValues, rcvdValues, NUM_VALUES * sizeof(uint32_t), slaveCallback);
}
}

void slaveCallback() {
gotValue = true;
}

2 Likes