PaulS:
Even this code is working fine .
Then, what IS your problem?
Sir,
Please help me out on this.
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 threadhttp://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.
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..