Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 2 months ago.
How to enable duplex SPI communication with two F401RE boards?
Hi
Could you please help me to setup a duplex communication i.e. How can I read data sent by slave SPI board? So far, I have been able to send data from master to slave and the code is as follows:
Thanks a lot
//======================== SPI Master====================================
#include "mbed.h"
Serial pc(USBTX, USBRX);
SPI deviceMaster (PB_5, PB_4, PB_3);// mosi, miso, sclk
DigitalOut cs(PA_9);
int main() {
pc.printf("Communicating with PC...\n");
cs = 1; // Chip must be deselected
deviceMaster.format(8,2);
deviceMaster.frequency(1000000);
int values[5] = {0, 5, -15, 10, 55};
int i = 0;
int val = 0;
while(1) {
if (i < 4){
i++;
}
else
{
i = 0;
}
val = values[i];
cs = 0; // Select the device by seting chip select low
deviceMaster.write(val);
cs = 1;
//int value = deviceMaster.read();
pc.printf("Master Transmission...\n");
pc.printf("%d \r\n", val);
wait_us(1000000);
}
}
//======================== SPI Slave ====================================
// Reply to a SPI master as slave
#include "mbed.h"
#include <SPISlave.h>
Serial pc(USBTX, USBRX);
SPISlave device(PB_5, PB_4, PB_3, PA_4); // mosi, miso, sclk, ssel
int main() {
pc.printf("Communicating with PC...\n");
int v = 0;
device.format(8,2);
device.frequency(1000000);
device.reply(0x00); // Prime SPI with first reply
while(1) {
if(device.receive() == 1) {
v = device.read(); // Read byte from master
//device.reply(v); // Make this the next reply
pc.printf("Slave Transmission...\n");
pc.printf("%d \r\n", v);
}
}
}
1 Answer
9 years, 7 months ago.
The SPI Master is always in control of the communication with the Slave. A Slave can never send data on its own initiative. It will send its data while it receives a byte from the Master. Try this code
//Master
....
char slavedata;
cs = 0; // Select the device by setting chip select low
slavedata = deviceMaster.write(val); // Master is sending and receiving at the same time
cs = 1;
pc.printf("Master Received..%d\r\n", slavedata);
...
// Reply to a SPI master as slave
...
device.reply(0x00); // Prime SPI with first reply, this data will be send to the Master
if (device.receive() == 1) { // check to see if anything was received from the Master
v = device.read(); // Read byte from master
//device.reply(v); // Make this the next reply
pc.printf("Slave Received..%d\r\n", v);
}
...