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]);
}
Slavebyte 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)