SPI interface with other board_AVR_ESK1100 or among Arduino itself

The gap/delay between these two 8 bit data will be considered as 0.

No it won't because the receiving device only clocks in bits on the clock pulses. There is no "clocked" gap.

Thanks a lot Sir, for your kind reply.

Thanks & Regards... :slight_smile:

Respected Sir

After receiving data as data[1] = Slave_receive(); data[2] = Slave_receive(); which are suppose 0x3b and 0x34, Can we concatenate this and display as 0x3b34 on Serial.println(data*, HEX); is it possible to do this.*
I am getting two separate data as 0x3b and 0x34 but want to display together as 0x3b34.
Can you please guide me how to do this.
Thanks and Regards...!!!

Serial.println((data[1] << 8 ) + data[2], HEX);


Rob

Graynomad:
Serial.println((data[1] << 8 ) + data[2], HEX);


Rob

Respected Sir

Thanks a Ton. it is working. You are mind blowing Sir.

Thanks & Regards...... :slight_smile:

We aim to please :slight_smile: (if possible)


Rob

Respected Sir

Why this following code is not generating 16 clock cycle continuously. Here I am using two continuous SPI.transfre(); but it is not giving 16 clock cycle.

#include <SPI.h>


#define SCK_PIN   13
#define MISO_PIN  12
#define MOSI_PIN  11
#define SS_PIN    10

unsigned char data;
int array[6] = {0x0A04, 0x0107, 0x0E05, 0x0209, 0x0B08, 0x0507 }, ii;

void SlaveInit(void) {
  // Set MISO output, all others input
  pinMode(SCK_PIN, INPUT);
  pinMode(MOSI_PIN, INPUT);
  pinMode(MISO_PIN, OUTPUT);
  pinMode(SS_PIN, INPUT);

  // Enable SPI
  SPCR = B00101100;
  SPCR = (1<<SPE);
}

void setup(){ Serial.begin(9600);
            SPI.begin();
            //SPI.setDataMode(SPI_MODE2);
            //SPI.setBitOrder(LSBFIRST);
          }

void loop()
{
  unsigned char hg = 0;
  Serial.println("Data Received from Master Board");
  SlaveInit();
  data = SPI_SlaveReceive();
   Serial.println(data, HEX);
   hg = data;
   data = 0;
   if(hg == 0x3B)
   {
     Serial.println("Writting Data on SPI bus");
     pinMode(SS_PIN, OUTPUT);
     digitalWrite(SS_PIN, LOW);
     SPI.transfer(0x3b);
     SPI.transfer(0x2b);   
     digitalWrite(SS_PIN, HIGH);
     Serial.println();
     Serial.println("Sending Done");
    delay(10);  
   }

}

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

ranjeetray:
Why this following code is not generating 16 clock cycle continuously. Here I am using two continuous SPI.transfre(); but it is not giving 16 clock cycle.

Prove it. Where is your logic analyzer output?

but it is not giving 16 clock cycle.

How do you know that?


Rob

Graynomad:

but it is not giving 16 clock cycle.

How do you know that?


Rob

Respected Sir

I am seeing the output on Oscilloscope, Tektronix TDS2024C, 200MHz 2GS/s.

Thanks & Regards... :slight_smile:

ranjeetray:

Graynomad:

but it is not giving 16 clock cycle.

How do you know that?


Rob

Respected Sir

I am seeing the output on Oscilloscope, Tektronix TDS2024C, 200MHz 2GS/s.

Thanks & Regards... :slight_smile:

Respected Sir

With the following code Arduino board is not able to generate its own clock it takes another boards when connected with MISO, MOSI, CS and SCK.
I found that once SPI_SlaveReceive(); function is initialized it is not able to generate the clock, if I comment this function or send the data or use SPI.transfer(); before SPI_SlaveReceive(); then it is able to generate the clock.
What would be the reason and how to overcome this problem.

#include <SPI.h>


#define SCK_PIN   13
#define MISO_PIN  12
#define MOSI_PIN  11
#define SS_PIN    10

unsigned char data;
int array[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 }, ii;

void SlaveInit(void) {
  // Set MISO output, all others input
  pinMode(SCK_PIN, INPUT);
  pinMode(MOSI_PIN, INPUT);
  pinMode(MISO_PIN, OUTPUT);
  pinMode(SS_PIN, INPUT);

  // Enable SPI
  SPCR = B00101100;
  SPCR = (1<<SPE);
}

void setup(){ Serial.begin(9600);
            SPI.begin();
          }

void loop()
{
  unsigned char hg = 0;
  Serial.println("Data Received from Master Board");
  SlaveInit();
  data = SPI_SlaveReceive();
   Serial.println(data, HEX);
   hg = data;
   data = 0;
   delay(1000);
  
   if(hg == 0x3D)
   {
     Serial.println("Writting Data on SPI bus");
     pinMode(SS_PIN, OUTPUT);
     digitalWrite(SS_PIN, LOW);
     delay(1000);
     for(ii=0;ii<10;ii++){
     SPI.transfer(array[ii]);
     Serial.println(array[ii], BIN);
       delay(1000);      
     }
     digitalWrite(SS_PIN, HIGH);
     delay(1000);
   Serial.println("Sending Done");
    delay(1000);  
   }

}

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

Thanks & Regards.... :slight_smile:

I found that once SPI_SlaveReceive(); function is initialized it is not able to generate the clock ...

I don't understand what you are saying here. The master generates the clock, not the slave.

Respected Sir

Actually once it receive a data in slave mode then SPI clock becomes dead from this board, I want that my both the board should work as master and both should receive the data and send the data. Can we do like this. Is multimaster concept is same as what I am trying to do. Please guide me Sir.

Thanks & Regards.... :slight_smile:

ranjeetray:

[quote author=Nick Gammon link=topic=120454.msg942840#msg942840 date=1349235975]

I found that once SPI_SlaveReceive(); function is initialized it is not able to generate the clock ...

I don't understand what you are saying here. The master generates the clock, not the slave.

Respected Sir

Actually once it receive a data in slave mode then SPI clock becomes dead from this board, I want that my both the board should work as master and both should receive the data and send the data. Can we do like this. Is multimaster concept is same as what I am trying to do. Please guide me Sir.

Thanks & Regards.... :slight_smile:
[/quote]

Respected Sir

It receives the data in slave mode after receiving the data I want to compare the data and want to send another data on SPI bus in master mode. Is it possible. Please guide me on this.

#include <SPI.h>


#define SCK_PIN   13
#define MISO_PIN  12
#define MOSI_PIN  11
#define SS_PIN    10

unsigned char data;
int array[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 }, ii;

void SlaveInit(void) {
  // Set MISO output, all others input
  pinMode(SCK_PIN, INPUT);
  pinMode(MOSI_PIN, INPUT);
  pinMode(MISO_PIN, OUTPUT);
  pinMode(SS_PIN, INPUT);

  // Enable SPI
  SPCR = B00101100;
  SPCR = (1<<SPE);
}

void setup(){ Serial.begin(9600);
            SPI.begin();
          }

void loop()
{
  unsigned char hg = 0;
  Serial.println("Data Received from Master Board");
  SlaveInit();
  data = SPI_SlaveReceive();
   Serial.println(data, HEX);
   hg = data;
   data = 0;
   delay(1000);
  
   if(hg == 0x3B)
   {
     Serial.println("Writting Data on SPI bus");
     pinMode(SS_PIN, OUTPUT);
     digitalWrite(SS_PIN, LOW);
     delay(1000);
     for(ii=0;ii<10;ii++){
     SPI.transfer(array[ii]);
     Serial.println(array[ii], BIN);
       delay(1000);      
     }
     digitalWrite(SS_PIN, HIGH);
     delay(1000);
   Serial.println("Sending Done");
    delay(1000);  
   }

}

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

You can see in the image of Oscilloscope while transmitting data from slave after comparing 0x3b , it is sending even 0x3B also with each data. Why it is happening. Can we clear the buffer before transmission of data.

Thanks & Regards.... :slight_smile:

TEK0000.BMP (76.1 KB)

ranjeetray:

ranjeetray:

[quote author=Nick Gammon link=topic=120454.msg942840#msg942840 date=1349235975]

I found that once SPI_SlaveReceive(); function is initialized it is not able to generate the clock ...

I don't understand what you are saying here. The master generates the clock, not the slave.

Respected Sir

Actually once it receive a data in slave mode then SPI clock becomes dead from this board, I want that my both the board should work as master and both should receive the data and send the data. Can we do like this. Is multimaster concept is same as what I am trying to do. Please guide me Sir.

Thanks & Regards.... :slight_smile:

Respected Sir

It receives the data in slave mode after receiving the data I want to compare the data and want to send another data on SPI bus in master mode. Is it possible. Please guide me on this.

#include <SPI.h>


#define SCK_PIN   13
#define MISO_PIN  12
#define MOSI_PIN  11
#define SS_PIN    10

unsigned char data;
int array[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 }, ii;

void SlaveInit(void) {
  // Set MISO output, all others input
  pinMode(SCK_PIN, INPUT);
  pinMode(MOSI_PIN, INPUT);
  pinMode(MISO_PIN, OUTPUT);
  pinMode(SS_PIN, INPUT);

  // Enable SPI
  SPCR = B00101100;
  SPCR = (1<<SPE);
}

void setup(){ Serial.begin(9600);
            SPI.begin();
          }

void loop()
{
  unsigned char hg = 0;
  Serial.println("Data Received from Master Board");
  SlaveInit();
  data = SPI_SlaveReceive();
   Serial.println(data, HEX);
   hg = data;
   data = 0;
   delay(1000);
  
   if(hg == 0x3B)
   {
     Serial.println("Writting Data on SPI bus");
     pinMode(SS_PIN, OUTPUT);
     digitalWrite(SS_PIN, LOW);
     delay(1000);
     for(ii=0;ii<10;ii++){
     SPI.transfer(array[ii]);
     Serial.println(array[ii], BIN);
       delay(1000);      
     }
     digitalWrite(SS_PIN, HIGH);
     delay(1000);
   Serial.println("Sending Done");
    delay(1000);  
   }

}

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

You can see in the image of Oscilloscope while transmitting data from slave after comparing 0x3b , it is sending even 0x3B also with each data. Why it is happening. Can we clear the buffer before transmission of data.

Thanks & Regards.... :slight_smile:
[/quote]

Hi...!!!

Respected Sir,

Can we flush the buffer like SPDR, SPSR registers. How can we do this.

Thanks & Regards... :slight_smile:

I don't understand what you are doing here:

  SlaveInit();
  data = SPI_SlaveReceive();
  Serial.println(data, HEX);
  hg = data;
  data = 0;
  delay(1000);

  if(hg == 0x3B)
  {
    Serial.println("Writting Data on SPI bus");
    pinMode(SS_PIN, OUTPUT);
    digitalWrite(SS_PIN, LOW);
    delay(1000);
    for(ii=0;ii<10;ii++){
      SPI.transfer(array[ii]);
      Serial.println(array[ii], BIN);
      delay(1000);      
    }
    digitalWrite(SS_PIN, HIGH);
    delay(1000);
    Serial.println("Sending Done");
    delay(1000);  
  }

You are receiving a byte from a SPI master (in slave mode) and then sending it back? Why bother? Plus, you are not changing to master mode. So you won't be sending anything back.

Respected Sir

Thanks a lot for your kind reply. I am reading data on SPI bus and trying to send back data on the same bus to other board from which I have received a byte of data. But I am not able to change the mode, please suggest me how to change mode from slave to master.
And I am thinking that once it comes out the slave mode loop it should act as a master by default. Can it happen like this.

Thanks & Regards... :slight_smile:

What other board? How is everything wired up?

And I am thinking that once it comes out the slave mode loop it should act as a master by default. Can it happen like this.

By default? I don't think so.

Respected Sir

Please suggest how to do it and can we clear the buffer also.

Please guide me Sir.

Because received one byte data is going back on to SPI bus again when I send back data from slave.

Thanks & Regards... :slight_smile: