SPI interface with other board_AVR_ESK1100 or among Arduino itself

I think your WriteByte routine is failing to complete the process - it reads SPSR but doesn't read SPDR once there's a byte so the hardware never clears ready for the next byte? To quote the datasheet:

the SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR)

How about rewriting WriteByte thus:

byte WriteByte (byte value) {
  SPDR = value ;
  while (!(SPSR & (1<<SPIF)))
  {}
  return SPDR ;
}

(So easy to miss a semicolon after a while, use a blank block instead, harder to misread)

PaulS:

Even this code is working fine .

Then, what IS your problem?

Sir.

I am able to send/write data on the SPI but I am not able to read the data, Please help me out.
I tried following code also

#include <SPI.h>// include the SPI library:

const int spidata = 10;//Pin 11 is data(MOSI) and pin 13 SCK ,set pin 10(SS) as the slave select for the digital pot:
int mm =0;
//int ReadByte();

void setup() {
  
  pinMode (spidata, OUTPUT);// set the spi_data_pin as an output:
  SPI.setDataMode(SPI_MODE3);
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  SPCR = B00000000;
  SPCR = (1<<SPE);
  
  SPI.begin();// initialize SPI:
  Serial.begin(4800);
   
}

byte ReadByte(void) {
  while(!(SPSR & (1<<SPIF))) 
  return SPDR;
}


// int ReadByte(int value) {
//  SPDR = value;
//  while((!SPSR & (1<<SPIF))) 
//  return 0;
//}
//byte WriteByte (byte value) {
//  SPDR = value ;
//  while (!(SPSR & (1<<SPIF)))
//  {}
//  return SPDR ;
//}

void loop() {
      int arry[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
      int rxData;
      digitalWrite(spidata,LOW);
      rxData = ReadByte();   // Sir, this part is not working, please help me.
      Serial.println("Read value ");
       Serial.println(rxData, DEC);
       Serial.println("Newline");
    //if (rxData == 59) {
      Serial.println("If condition-1 Matches and recieves 0x3B from SPI then:");
      Serial.println("I am Sending 1st data of 15 data on SPI");
      
       
       
      Serial.println(arry[0], BIN);
      SPI.transfer(arry[0]); //  send in the address and value via SPI:
      delay(1500);
 
      Serial.println("I am Sending 2nd data of 15 data on SPI");
      Serial.println(arry[1], BIN);
      SPI.transfer(arry[1]);
      delay(1500); 

      Serial.println("I am Sending 3rd data of 15 data on SPI");
      Serial.println(arry[2],BIN);
      SPI.transfer(arry[2]); 
      delay(1500);
     
      Serial.println("I am Sending 4th data of 15 data on SPI");
      Serial.println(arry[3], BIN);
      SPI.transfer(arry[3]);
      delay(1500); 
     
      Serial.println("I am Sending 5th data of 15 data on SPI");
      Serial.println(arry[4], BIN);
      SPI.transfer(arry[4]); 
      delay(1500);

      Serial.println("I am Sending 6th data of 15 data on SPI");
      Serial.println(arry[5], BIN);
      SPI.transfer(arry[5]); 
      delay(1500);
 
      Serial.println("I am Sending 7th data of 15 data on SPI");
      Serial.println(arry[6], BIN);
      SPI.transfer(arry[6]); 
      delay(1500);

      Serial.println("I am Sending 8th data of 15 data on SPI");
      Serial.println(arry[7], BIN);
      SPI.transfer(arry[7]);

      Serial.println("I am Sending 9th data of 15 data on SPI");
      Serial.println(arry[8], BIN);
      SPI.transfer(arry[8]); 
      delay(1500);
  
      Serial.println("I am Sending 10th data of 15 data on SPI");
      Serial.println(arry[9], BIN);
      SPI.transfer(arry[9]);
      delay(1500); 
     
      Serial.println("I am Sending 11th data of 15 data on SPI");
      Serial.println(arry[10], BIN);
      SPI.transfer(arry[10]);
      delay(1500); 
   
      Serial.println("I am Sending 12th data of 15 data on SPI");
      Serial.println(arry[11], BIN);
      SPI.transfer(arry[11]); 
      delay(1500);
     
      Serial.println("I am Sending 13th data of 15 data on SPI");
      Serial.println(arry[12], BIN);
      SPI.transfer(arry[12]); 
      delay(1500);

      Serial.println("I am Sending 14th data of 15 data on SPI");
      Serial.println(arry[13], BIN);
      SPI.transfer(arry[13]); 
      delay(1500);
  
      Serial.println("I am Sending 15th data of 15 data on SPI");
      Serial.println(arry[14], BIN);
      SPI.transfer(arry[14]); 
      delay(1500);
    
      Serial.println("ALL 15 datas are sent on SPI, process completed ::"); 
      Serial.println("\n");
      Serial.println("\n");
      digitalWrite(spidata,HIGH);// take the SS pin high to de-select the chip:
      delay(1500);
   //}
  
    }

Output of the above code:

Read value 
0
Newline
If condition-1 Matches and recieves 0x3B from SPI then:
I am Sending 1st data of 15 data on SPI
1
I am Sending 2nd data of 15 data on SPI
10
I am Sending 3rd data of 15 data on SPI
11
I am Sending 4th data of 15 data on SPI
100
I am Sending 5th data of 15 data on SPI
101
I am Sending 6th data of 15 data on SPI
110
I am Sending 7th data of 15 data on SPI
111
I am Sending 8th data of 15 data on SPI
1000
I am Sending 9th data of 15 data on SPI
1001
I am Sending 10th data of 15 data on SPI
1010
I am Sending 11th data of 15 data on SPI
1011
I am Sending 12th data of 15 data on SPI
1100
I am Sending 13th data of 15 data on SPI
1101
I am Sending 14th data of 15 data on SPI
1110
I am Sending 15th data of 15 data on SPI
1111
ALL 15 datas are sent on SPI, process completed ::

MarkT:
I think your WriteByte routine is failing to complete the process - it reads SPSR but doesn't read SPDR once there's a byte so the hardware never clears ready for the next byte? To quote the datasheet:

the SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR)

How about rewriting WriteByte thus:

byte WriteByte (byte value) {

SPDR = value ;
  while (!(SPSR & (1<<SPIF)))
  {}
  return SPDR ;
}



(So easy to miss a semicolon after a while, use a blank block instead, harder to misread)

Sir,

I have tried with your suggestion also but it is not able to read from other board which is just keep on pumping the data and giving 0 as output, I have connected MOSI,MISO,CS,SCK wires across the two Arduino boards.
Tried code.

#include <SPI.h>// include the SPI library:

const int spidata = 10;//Pin 11 is data(MOSI) and pin 13 SCK ,set pin 10(SS) as the slave select for the digital pot:
int mm =0;
//int ReadByte();

void setup() {
  
  pinMode (spidata, OUTPUT);// set the spi_data_pin as an output:
  SPI.setDataMode(SPI_MODE3);
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  SPCR = B00000000;
  SPCR = (1<<SPE);
  
  SPI.begin();// initialize SPI:
  Serial.begin(4800);
   
}

byte ReadByte(void) {
  while(!(SPSR & (1<<SPIF))) 
  return SPDR;
}


// int ReadByte(int value) {
//  SPDR = value;
//  while((!SPSR & (1<<SPIF))) 
//  return 0;
//}
//byte WriteByte (byte value) {
//  SPDR = value ;
//  while (!(SPSR & (1<<SPIF)))
//  {}
//  return SPDR ;
//}

void loop() {
      int arry[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
      int rxData;
      digitalWrite(spidata,LOW);
      rxData = ReadByte();
      Serial.println("Read value ");
       Serial.println(rxData, DEC);
       Serial.println("Newline");
    //if (rxData == 59) {
      Serial.println("If condition-1 Matches and recieves 0x3B from SPI then:");
      Serial.println("I am Sending 1st data of 15 data on SPI");
      
       
       
      Serial.println(arry[0], BIN);
      SPI.transfer(arry[0]); //  send in the address and value via SPI:
      delay(1500);
 
      Serial.println("I am Sending 2nd data of 15 data on SPI");
      Serial.println(arry[1], BIN);
      SPI.transfer(arry[1]);
      delay(1500); 

      Serial.println("I am Sending 3rd data of 15 data on SPI");
      Serial.println(arry[2],BIN);
      SPI.transfer(arry[2]); 
      delay(1500);
     
      Serial.println("I am Sending 4th data of 15 data on SPI");
      Serial.println(arry[3], BIN);
      SPI.transfer(arry[3]);
      delay(1500); 
     
      Serial.println("I am Sending 5th data of 15 data on SPI");
      Serial.println(arry[4], BIN);
      SPI.transfer(arry[4]); 
      delay(1500);

      Serial.println("I am Sending 6th data of 15 data on SPI");
      Serial.println(arry[5], BIN);
      SPI.transfer(arry[5]); 
      delay(1500);
 
      Serial.println("I am Sending 7th data of 15 data on SPI");
      Serial.println(arry[6], BIN);
      SPI.transfer(arry[6]); 
      delay(1500);

      Serial.println("I am Sending 8th data of 15 data on SPI");
      Serial.println(arry[7], BIN);
      SPI.transfer(arry[7]);

      Serial.println("I am Sending 9th data of 15 data on SPI");
      Serial.println(arry[8], BIN);
      SPI.transfer(arry[8]); 
      delay(1500);
  
      Serial.println("I am Sending 10th data of 15 data on SPI");
      Serial.println(arry[9], BIN);
      SPI.transfer(arry[9]);
      delay(1500); 
     
      Serial.println("I am Sending 11th data of 15 data on SPI");
      Serial.println(arry[10], BIN);
      SPI.transfer(arry[10]);
      delay(1500); 
   
      Serial.println("I am Sending 12th data of 15 data on SPI");
      Serial.println(arry[11], BIN);
      SPI.transfer(arry[11]); 
      delay(1500);
     
      Serial.println("I am Sending 13th data of 15 data on SPI");
      Serial.println(arry[12], BIN);
      SPI.transfer(arry[12]); 
      delay(1500);

      Serial.println("I am Sending 14th data of 15 data on SPI");
      Serial.println(arry[13], BIN);
      SPI.transfer(arry[13]); 
      delay(1500);
  
      Serial.println("I am Sending 15th data of 15 data on SPI");
      Serial.println(arry[14], BIN);
      SPI.transfer(arry[14]); 
      delay(1500);
    
      Serial.println("ALL 15 datas are sent on SPI, process completed ::"); 
      Serial.println("\n");
      Serial.println("\n");
      digitalWrite(spidata,HIGH);// take the SS pin high to de-select the chip:
      delay(1500);
   //}
   

  
    }
Output of the above code which reads "0"
[code]
Read value 
0
Newline
If condition-1 Matches and recieves 0x3B from SPI then:
I am Sending 1st data of 15 data on SPI
1
I am Sending 2nd data of 15 data on SPI
10
I am Sending 3rd data of 15 data on SPI
11
I am Sending 4th data of 15 data on SPI
100
I am Sending 5th data of 15 data on SPI
101
I am Sending 6th data of 15 data on SPI
110
I am Sending 7th data of 15 data on SPI
111
I am Sending 8th data of 15 data on SPI
1000
I am Sending 9th data of 15 data on SPI
1001
I am Sending 10th data of 15 data on SPI
1010
I am Sending 11th data of 15 data on SPI
1011
I am Sending 12th data of 15 data on SPI
1100
I am Sending 13th data of 15 data on SPI
1101
I am Sending 14th data of 15 data on SPI
1110
I am Sending 15th data of 15 data on SPI
1111
ALL 15 datas are sent on SPI, process completed ::

[/code]

PaulS:

Even this code is working fine .

Then, what IS your problem?

Sir,

Please help me out on this.

MarkT:
I think your WriteByte routine is failing to complete the process - it reads SPSR but doesn't read SPDR once there's a byte so the hardware never clears ready for the next byte? To quote the datasheet:

the SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR)

How about rewriting WriteByte thus:

byte WriteByte (byte value) {

SPDR = value ;
  while (!(SPSR & (1<<SPIF)))
  {}
  return SPDR ;
}



(So easy to miss a semicolon after a while, use a blank block instead, harder to misread)

Sir,

Please help me out on this.

If you are going to ignore the questions, and ignore the suggested corrections, please don't keep re-posting "Please help me out on this".

ranjeetray:

PaulS:

Even this code is working fine .

Then, what IS your problem?

Sir,

Please help me out on this.

That is not a meaningful answer to the question "what IS your problem?".

Sir,

I am using two Arduino board, from one board I am able to send the data which is available on oscilloscope.
But when I read from another board, it is not able to read.

 byte ReadByte(void) {
 
  while(!(SPSR & (1<<SPIF))) 
    return SPDR;
}
void loop() {
   
      int rxData;
     digitalWrite(spidata,LOW);
      rxData = ReadByte();
      Serial.println("Read value ");
     Serial.println(rxData, DEC);
      digitalWrite(spidata,HIGH);

}

Sir, this read function is returning 0.
Please suggest something.

Please edit your post, select the code, and put it between [code] ... [/code] tags.

You can do that by hitting the # button above the posting area.

Dear Sir

I am using two arduino board for SPI communication. I am sending data from one board which is happening and data is available on oscilloscope. But when I try to read from with another board it is reading the data.
Data Sending Code

#include <SPI.h>// include the SPI library:

const int spidata = 10;//Pin 11 is data(MOSI) and pin 13 SCK ,set pin 10(SS) as the slave select for the digital pot:
int mm =0;

void setup() {
  
  pinMode (spidata, OUTPUT);// set the spi_data_pin as an output:
  
  SPI.begin();// initialize SPI:
  Serial.begin(9600);
}

void loop() {
     
      digitalWrite(spidata,LOW);
      SPI.transfer(1); 
      digitalWrite(spidata,HIGH);
      delay(1500);
  
    }

Data Recieving code:

#include <SPI.h>// include the SPI library:

const int spidata = 10;//Pin 11 is data(MOSI) and pin 13 SCK ,set pin 10(SS) as the slave select for the digital pot:

void setup() {
  
  pinMode (spidata, INPUT);// set the spi_data_pin as an output:
  SPI.setDataMode(SPI_MODE3);
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  SPI.begin();// initialize SPI:
  Serial.begin(9600);}
  
  byte ReadByte(void) {
   
  while(!(SPSR & (1<<SPIF)))
    return SPDR;
}

void loop() {
   
      int rxData;
  
    digitalWrite(spidata,LOW);
      rxData = ReadByte();
      Serial.println("Read value ");
     Serial.println(rxData, DEC);
    digitalWrite(spidata,HIGH);
   delay(1500);
}

Sir, please help me.
Sorry I had replied him like this only before then again I asked him to help me.

Read value is coming as "0".

OK, now re-read reply #4 and explain why you ignored his suggestion.

Respected Sir

Thanks a lot for your kind reply. I have tried with his suggestion also but still I was getting value 0. Please explain me in depth. I am doing something wrong which I am not able to understand. Kindly guide me.

I had used this code also

byte WriteByte (byte value) {
  SPDR = value ;
  while (!(SPSR & (1<<SPIF)))
  {}
  return SPDR ;
}

MarkT:
I think your WriteByte routine is failing to complete the process - it reads SPSR but doesn't read SPDR once there's a byte so the hardware never clears ready for the next byte? To quote the datasheet:

the SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR)

How about rewriting WriteByte thus:

byte WriteByte (byte value) {

SPDR = value ;
  while (!(SPSR & (1<<SPIF)))
  {}
  return SPDR ;
}



(So easy to miss a semicolon after a while, use a blank block instead, harder to misread)

Respected Sir

I have used this code also but getting the same value as 0.
Please explain me how to make SPDR to work.

byte WriteByte (byte value) {
  SPDR = value ;
  while (!(SPSR & (1<<SPIF)))
  {}
  return SPDR ;
}
  byte ReadByte(void) {
   
  while(!(SPSR & (1<<SPIF)))
    return SPDR;
}

Do you see a similar problem here?

MarkT said:

(So easy to miss a semicolon after a while, use a blank block instead, harder to misread)

Respected Sir

When I use ; it goes in infinite loop and does not give any output and without ; it gives output as
Output:

Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0
Read value 
0

Sir ,
Is this code correct, please suggest if something is wrong:

#include <SPI.h>// include the SPI library:

const int spidata = 10;//Pin 11 is data(MOSI) and pin 13 SCK ,set pin 10(SS) as the slave select for the digital pot:

void setup() {
  
  pinMode (spidata, INPUT);// set the spi_data_pin as an output:
  SPI.setDataMode(SPI_MODE3);
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  SPI.begin();// initialize SPI:
  Serial.begin(9600);}
  
  byte ReadByte(void) {
   
  while(!(SPSR & (1<<SPIF)));
    return SPDR;
}

void loop() {
   
      int rxData;
  
    digitalWrite(spidata,LOW);
      rxData = ReadByte();
      Serial.println("Read value ");
     Serial.println(rxData, DEC);
    digitalWrite(spidata,HIGH);
   delay(1500);
}

Will you please explain why you are not using SPI.transfer() ?

That's a good point - SPI.transfer will work for both master and slave I think (master mode doesn't require the SPDR to be read, but transfer does this anyway).

There was an almost exact same problem on this thread

http://arduino.cc/forum/index.php/topic,118712.0.html

Same code even.

I still don't know why it didn't work but using SPI.transfer() fixed it.


Rob

Graynomad:
There was an almost exact same problem on this thread

http://arduino.cc/forum/index.php/topic,118712.0.html

Same code even.

I still don't know why it didn't work but using SPI.transfer() fixed it.


Rob

Dear Sir

Thanks a lot for your kind support.

Can you please provide us the both master and slave codes, it will be great help for me.

Thanks & Regards..

Respected Sir

Thanks a lot for your kind support. Now I am able to receive data form master but after receiving I want to send some data to master back, how can we do this. I have used SPI.transfer() in the master/data-sending code.
Working code.

Sending data code:

#include <SPI.h>// include the SPI library:

const int spidata = 10;//Pin 11 is data(MOSI) and pin 13 SCK ,set pin 10(SS) as the slave select for the digital pot:
int mm =0;

void setup() {
  
  pinMode (spidata, OUTPUT);// set the spi_data_pin as an output:
  
  SPI.begin();// initialize SPI:
  Serial.begin(9600);
}

void loop() {
    
      digitalWrite(spidata,LOW);
      SPI.transfer(0x3b); //  send in the address and value via SPI:
      digitalWrite(spidata,HIGH);// take the SS pin high to de-select the chip:
      delay(1500);
    }

Receiving data code:

#include <SPI.h>
#include <stdio.h>
#include <avr/io.h>
#include <stdlib.h> 

#define MOSI 11
#define MISO  12
#define SCK  13
#define SS 10

int data = 0;
char buff[8]; 


void setup()
{
  pinMode(MOSI, INPUT);
  pinMode(MISO, OUTPUT);
  pinMode(SCK,INPUT);
  pinMode(SS,INPUT);

  Serial.begin(9600);
  SPCR = 0x40;  // Enable SPI in slave mode
//  SPI.begin();
  delay(500);
  
}

void loop()
{
 
  Serial.println("Data Received from Master Board");
  data = SPI_SlaveReceive();
   Serial.println(data, HEX);
  data = 0;

}

unsigned char SPI_SlaveReceive()
{
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
}

Output from receiving code:

Data Received from Master Board
3B
Data Received from Master Board
3B
Data Received from Master Board
3B
Data Received from Master Board
3B

And now what should I do modification in the code so that I can send some data to master once I receive 0x3B from master.
I am trying like this at receiving(slave) side, it is receiving 0x3B from master but not able to send data to master

#include <SPI.h>
#include <stdio.h>
#include <avr/io.h>
#include <stdlib.h> 

#define MOSI 11
#define MISO  12
#define SCK  13
#define SS 10
#define sss 9
int data = 0;
char buff[8]; 


void setup()
{
  pinMode(MOSI, INPUT);
  pinMode(MISO, OUTPUT);
  pinMode(SCK,INPUT);
  pinMode(SS,INPUT);
  pinMode(sss, OUTPUT);

  Serial.begin(9600);
  SPCR = 0x40;  // Enable SPI in slave mode
//  SPI.begin();
  delay(500);
  
}

void loop()
{
 int xx;
  Serial.println("Data Received from Master Board");
  data = SPI_SlaveReceive();
  
  xx = data;
  
   Serial.println(data, HEX);
  data = 0;
  delay(20);
  if(xx == 59)
  {
    delay(600);
    void master_init();
    unsigned char send2();
    delay(600);
  }
}
  unsigned char send2(){
  digitalWrite(SS, LOW);
  WriteByte(16);
  digitalWrite(SS, HIGH);
  delay(600);}

unsigned char SPI_SlaveReceive()
{
  while(!(SPSR & (1<<SPIF)));
  return SPDR;
} 
void master_init()
{
    pinMode(MOSI, OUTPUT);
  pinMode(MISO, INPUT);
  pinMode(SCK,OUTPUT);
  pinMode(SS,OUTPUT);
  pinMode(sss, OUTPUT);
  
}
void WriteByte(byte value) {
  SPDR = value;
  while (!(SPSR & (1<<SPIF))) ;
  return;
}

And at the master side I am doing like this but it is not able to receive the data

#include <SPI.h>// include the SPI library:

const int spidata = 10;//Pin 11 is data(MOSI) and pin 13 SCK ,set pin 10(SS) as the slave select for the digital pot:
#define sss 9
int mm =0;
unsigned char data1 = 0; 

void setup() {
  
  pinMode (spidata, OUTPUT);// set the spi_data_pin as an output:
  
  SPI.begin();// initialize SPI:
  Serial.begin(9600);
}

void loop() {
     //for(mm=0; mm<23;mm++){
      digitalWrite(spidata,LOW);
      //Serial.println("I am writting on SPI");
      //Serial.println(mm, BIN);
      SPI.transfer(0x3b); //  send in the address and value via SPI:
     // SPI.transfer('IMU');
      
      digitalWrite(spidata,HIGH);// take the SS pin high to de-select the chip:
      delay(600);
      //digitalWrite(sss,LOW);
      
      
      unsigned char read1();
      delay(600);
      //digitalWrite(sss,HIGH);
      
     }
     unsigned char read1()
      {
        void slave_init();
      data1 = read_ready();
      
      Serial.println(data1, DEC);
      data1 = 0;
      
      delay(60);
      
      }
      
      
      unsigned char read_ready()
      {
        while(!(SPSR & (1<<SPIF)));
        return SPDR;
     
    }
   void slave_init()
   {
     SPCR = 0x40;
    pinMode(11, INPUT);
    pinMode(12, OUTPUT);
    pinMode(13, INPUT);
    pinMode(10, INPUT);
    delay(600);
    
   }

Kindly suggest me for the modification.