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