SPI interface with other board_AVR_ESK1100 or among Arduino itself

MarkT:
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).

Dear Sir

Thanks a lot for your kind support. Kindly go through the post Reply #23 on: Today at 05:15:07 PM and please suggest for the modification on the code.

Thanks and Regards.

ranjeetray:
Kindly go through the post Reply #23 ...

Kindly stop ignoring our suggestions.

Dear Sir

Where do you want me to use this SPI.transfer() function in my code, And I am not trying to avoid yours suggestion. Please guide me and help me out.

Thanks & Regards..

Respected Sir,

This code is able to send the data but not able to receive, what is wrong in this;

//send receive
#include <SPI.h>// include the SPI library:
#define SCK_PIN   13
#define MISO_PIN  12
#define MOSI_PIN  11
//#define SS_PIN    10
unsigned char receive_data(void);




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:

unsigned char rd = 0;

void SlaveInit(void) {
  // Set MISO output, all others input
  pinMode(SCK_PIN, INPUT);
  pinMode(MOSI_PIN, OUTPUT);
  pinMode(MISO_PIN, INPUT);
  pinMode(spidata, INPUT);
  Serial.begin(9600);

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

void setup() {
  
   pinMode(SCK_PIN, OUTPUT);
  pinMode(MOSI_PIN, INPUT);
  pinMode(MISO_PIN, OUTPUT);
  pinMode(spidata, OUTPUT);
  
  //pinMode (spidata, OUTPUT);// set the spi_data_pin as an output:
  
  SPI.begin();// initialize SPI:
  Serial.begin(9600);
  //SPI.setBitOrder(LSBFIRST);
  //SPCR = 0x90;
}

void loop() {digitalWrite(spidata,LOW);
            SPI.transfer(0x3b); //  send in the address and value via SPI:
            digitalWrite(spidata,HIGH);
            delay(400);
           receive_data();
            
            }
    
    
    unsigned char read_data(void)
    {  //SPCR = 0x60;
      while(!(SPSR & (1<<SPIF)));
      return SPDR; }
    
    unsigned char receive_data(){
      
    pinMode(spidata, INPUT);
     SlaveInit();
     rd = read_data();
      Serial.println(rd, DEC);
      rd = 0;
      delay(400);
      return 0;
    }

PaulS:

Even this code is working fine .

Then, what IS your problem?

Respected Sir,

Can we read/transmit here 16 bit data on Arduino board using SPI protocol. Will it generate 16 continuous clock signal.

The Arduino has an 8-bit SPI peripheral and therefore only transmits 8 bits at a time.

However you can just transmit two bytes in a row, the end result is the same.


Rob

Graynomad:
The Arduino has an 8-bit SPI peripheral and therefore only transmits 8 bits at a time.

However you can just transmit two bytes in a row, the end result is the same.


Rob

Thanks a lot Sir for your kind reply.

I have done like this only , I am sending SPI.transfer(0x3B); SPI.transfer(0x2C); together in a row, and I am happy that it is transmitting both the data and generating 16 clock cycles on Oscilloscope but Sir, between these two consecutive 8 bit data there is a gap or delay on the Oscilloscope. So, for implementation like IMU(ADIS16405) chip where we need to send 16 bit command, how it will work.
The gap/delay between these two 8 bit data will be considered as 0.

Please suggest something on this.

Thanks & Regards..... :slight_smile:

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.