SPI interface with other board_AVR_ESK1100 or among Arduino itself

Graynomad:
Here's some code. I took the razor to what you had and removed everything not required to prove the concept. Hopefully I didn't go too far. The master could still be a lot smaller.

Master

//Master sending data

#include <SPI.h>// include the SPI library:
#define SS_PIN   10

int command_array[] = {0x04, 0x06, 0x08, 0x0A};
int returned_data[4];

void setup() {
 
 pinMode (SS_PIN, OUTPUT);// set the spi_data_pin as an output:

Serial.begin(115200);
 
 SPI.begin();
 SPI.setDataMode(SPI_MODE2);
 SPI.setClockDivider(SPI_CLOCK_DIV64) ;
 SPI.setBitOrder(LSBFIRST);

}

void loop() {
   
   digitalWrite(SS_PIN,LOW);
   SPI.transfer(command_array[0]);       // send command
   delay(1);                             // give the slave some time
   returned_data[0] = SPI.transfer(0);   // get response
   digitalWrite(SS_PIN,HIGH);

digitalWrite(SS_PIN,LOW);
   delay(1);
   SPI.transfer(command_array[1]);
   returned_data[1] = SPI.transfer(0);
   digitalWrite(SS_PIN,HIGH);

digitalWrite(SS_PIN,LOW);
   delay(1);
   SPI.transfer(command_array[2]);
   returned_data[2] = SPI.transfer(0);
   digitalWrite(SS_PIN,HIGH);

digitalWrite(SS_PIN,LOW);
   delay(1);
   SPI.transfer(command_array[3]);
   returned_data[3] = SPI.transfer(0);
   digitalWrite(SS_PIN,HIGH);

Serial.print (returned_data[0]);
   Serial.print (',');
   Serial.print (returned_data[1]);
   Serial.print (',');
   Serial.print (returned_data[2]);
   Serial.print (',');
   Serial.println (returned_data[3]);
 
}




Slave


byte response_data[] = {-1,-1,-1,-1,'4',-1,'6',-1,'8',-1,'A'};

void setup (void) {
 
 pinMode(MISO, OUTPUT); // have to send on master in, slave out
 SPCR |= _BV(SPE);   // turn on SPI in slave mode
 SPCR |= _BV(SPIE);  // turn on interrupts

}

void loop () {}

ISR (SPI_STC_vect) {
 byte command = SPDR;

SPDR = response_data[command];

}




See if that does anything useful.

______
Rob
//Master sending data
#include <SPI.h>// include the SPI library:
#define SS_PIN   10

int command_array[] = {0x04, 0x06, 0x08, 0x0A};
int returned_data[4];

void setup() {
  
  pinMode (SS_PIN, OUTPUT);// set the spi_data_pin as an output:

  Serial.begin(115200);
  
  SPI.begin();
  SPI.setDataMode(SPI_MODE2);
  SPI.setClockDivider(SPI_CLOCK_DIV64) ;
  SPI.setBitOrder(LSBFIRST);
 
}

void loop() {
    
    digitalWrite(SS_PIN,LOW);
    SPI.transfer(command_array[0]);       // send command
    delay(1);                             // give the slave some time
    returned_data[0] = SPI.transfer(0);   // get response
    digitalWrite(SS_PIN,HIGH);

    digitalWrite(SS_PIN,LOW);
    delay(1);
    SPI.transfer(command_array[1]); 
    returned_data[1] = SPI.transfer(0);
    digitalWrite(SS_PIN,HIGH);

    digitalWrite(SS_PIN,LOW);
    delay(1);
    SPI.transfer(command_array[2]); 
    returned_data[2] = SPI.transfer(0);
    digitalWrite(SS_PIN,HIGH);

    digitalWrite(SS_PIN,LOW);
    delay(1);
    SPI.transfer(command_array[3]); 
    returned_data[3] = SPI.transfer(0);
    digitalWrite(SS_PIN,HIGH);

    Serial.print (returned_data[0]);
    Serial.print (',');
    Serial.print (returned_data[1]);
    Serial.print (',');
    Serial.print (returned_data[2]);
    Serial.print (',');
    Serial.println (returned_data[3]);
  
}

With the following code, attached image 2 and TEK0002 are the output at Master Serial Monitor and on Oscilloscope:

#include "pins_arduino.h"
#include <SPI.h>

#define size_data 4  // is there 4 bytes? if not change this and the arrays.

byte send_04_data[size_data] = {1,2,3,7}; // you fill in the numbers 
byte send_06_data[size_data] = {3,8,7,9};
byte * data_ptr;
int byte_count = 0;
void setup (void)
{
  
  // have to send on master in, *slave out*
  pinMode(MISO, OUTPUT);
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode (SPI_MODE2);
  SPI.setClockDivider(SPI_CLOCK_DIV64) ;

  // turn on SPI in slave mode
  SPCR |= _BV(SPE);

  // turn on interrupts
  SPCR |= _BV(SPIE);
  
 // disable timer interrupts
  TIMSK0 = 0;
  
}
ISR (SPI_STC_vect) {
  byte c = SPDR;
  if (byte_count == 0)
  {
     
      data_ptr = (c == 0x04) ? send_04_data : send_06_data; 
  
  SPDR = *(data_ptr + byte_count);
  byte_count++; }  
  else 
  
  {
    SPDR = 0;
  
  }
  if (byte_count = size_data) 
  byte_count = 0;
} 
void loop (void)
{
 
}  // end of loop

With the following code image 3 and TEK0006 are output:

#include "pins_arduino.h"
#include <SPI.h>
byte response_data[] = {1,2,-1,3,'4',-1,'6',-1,'8',-1,'A'}; 
void setup (void)
{
  
  // have to send on master in, *slave out*
  pinMode(MISO, OUTPUT);
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode (SPI_MODE2);
  SPI.setClockDivider(SPI_CLOCK_DIV64) ;
  // turn on SPI in slave mode
  SPCR |= _BV(SPE);
  // turn on interrupts
  SPCR |= _BV(SPIE);
  // disable timer interrupts
  TIMSK0 = 0;
 
}

void loop (void)
{
 
}  // end of loop

ISR (SPI_STC_vect) {

  byte command = SPDR;

  SPDR = response_data[command];

} 

But Slave is not sending data back properly.

TEK0002.BMP (76.1 KB)

2.bmp (918 KB)

3.bmp (885 KB)

TEK0006.BMP (76.1 KB)