hi,
i want to transmit data between two Arduino through SPI communication , i find this link http://www.gammon.com.au/forum/?id=10892 by Nick Gammon in which SPI Master Arduino transmit data to Slave Arduino and then Slave Arduino transmit the data serially to computer but in my case i want transmit data from slave to master and then master will transmit serially to computer, could any one help me ? i will be very thankful
An SPI slave cannot initiate the transfer of data, that has to be done by the master.
You should be able to use Nick's example and just have the slave to the USB stuff instead of the master.
Rob
but the problem is that i am using 8 Arduino in my project each one has specific task the Master Arduino will collect all the data from Slave Arduinos and send it to computer through Xbee , i use Softserial Arduino library but that was a bit slow which not good for my proect :~
i want to transmit data between two Arduino through SPI communication
So it's 8 then?
You need 8 digital lines to select each slave one at a time. You select the slave, transfer data, deselect the slave, move to the next slave etc etc until all 8 are done.
Connect all 9 MISOs, MOSIs and SCKs together, run 8 signals from the master, 1 to each slave, then follow Nick's example.
To get a single byte from each slave you would do something like this on the master.
byte SSpins [] = {3,4,5,6,7,8,9,10};
byte SlaveData [8];
setup () {
for (int i - 0; i < 8; i++)
pinMode (SSpins[i], OUTPUT);
}
loop () {
for (int i - 0; i < 8; i++) {
digitalWrite (SSpins[i], LOW);
delay(1); // give the slave some time to respond, may not be required, depends on the slave code
SlaveData[i] = SPI.transfer();
digitalWrite (SSpins[i], HIGH);
}
for (int i - 0; i < 8; i++)
Serial.print(SlaveData[i], HEX);
}
This is quite rough and you still have to do the slave part.
Rob
thanks for help ,
So it's 8 then?
if i become able to communicate between two then it is easy for 8.
You need 8 digital lines to select each slave one at a time. You select the slave, transfer data, deselect the slave, move to the next slave etc etc until all 8 are done.
Connect all 9 MISOs, MOSIs and SCKs together, run 8 signals from the master, 1 to each slave, then follow Nick's example.
i will do it latter for 8 arduino frist i want to do it between two .
regarding you code i wrote the following code but i receive garbage data, here is my code
for Master
#include <SPI.h>
char buf [14];
volatile byte pos=0;
void setup (void)
{
Serial.begin (115200);
digitalWrite(SS, HIGH); // ensure SS stays high for now
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV128);
} // end of setup
void loop (void)
{
digitalWrite(SS, LOW); // SS is pin 10
delay (1);
for (int i=0;i<14;i++)
buf[i]=SPI.transfer(0);
// disable Slave Select
digitalWrite(SS, HIGH);
Serial.println(buf);
} // end of loop
for Slave
#include <SPI.h>
char data [14]="Hello world!\n";
volatile boolean process_it;
void setup (void)
{
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode
SPCR |= _BV(SPE);
// get ready for an interrupt
process_it = false;
// now turn on interrupts
SPI.attachInterrupt();
} // end of setup
// SPI interrupt routine
ISR (SPI_STC_vect)
{
process_it = true;
}
// main loop - wait for flag set in interrupt routine
void loop (void)
{
if (process_it)
{
for(int i=0;i<sizeof data ; i++)
SPI.transfer(data[i]);
process_it = false;
}
}
here is the output from Master Arduino
So, what you REALLY need is a communications interface that is MADE for multiple Arduinos. Best answer is probably RS-485.
Nick also has this on RS-485: Gammon Forum : Electronics : Microprocessors : RS485 communications
Some example interface modules: http://goo.gl/S1lFR
DISCLAIMER: Mentioned stuff from my own shop... as usual... that's what I know about.
By RS-485 i could not distinguished that which data stream are coming from which slave Arduino
By RS-485 i could not distinguished that which data stream are coming from which slave Arduino
You need to look more closely at nick's example. Each node has it's own identification and the relationship does not need to be master-slave.
I haven't checked lately but I doubt that slave code is anything like Nick's example. It it right?
Rob
i have done it here http://arduino.cc/forum/index.php/topic,130840.0.html by modifying the second example