#include <SPI.h>
#define SPI_MASTER_SLAVE_SEL_PIN (2)
#define SS_PIN (53)
boolean is_spi_master;
volatile boolean slave_received = false;
volatile uint8_t slave_recv_data = 0xff;
void setup() {
Serial.begin(115200);
pinMode(SPI_MASTER_SLAVE_SEL_PIN, INPUT_PULLUP);
if (digitalRead(SPI_MASTER_SLAVE_SEL_PIN) == LOW) {
is_spi_master = true;
} else {
is_spi_master = false;
}
if (is_spi_master) {
pinMode(SS_PIN, OUTPUT);
digitalWrite(SS_PIN, HIGH);
SPI.begin();
SPI.setDataMode(SPI_MODE0); // Corrected from SPI_MPDE0 to SPI_MODE0
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV16);
Serial.println(F("SPI Master..."));
delay(100);
} else {
pinMode(SS_PIN, INPUT_PULLUP); // Moved this line to the correct place
pinMode(MISO, OUTPUT); // Corrected the syntax for pinMode
SPCR &= ~_BV(MSTR); // Ensure this is set correctly for slave mode
SPCR &= ~_BV(CPOL); // Corrected from CP0L to CPOL
SPCR &= ~_BV(CPHA);
SPCR &= ~_BV(DORD);
SPCR |= _BV(SPE); // Set SPE to enable SPI
Serial.println(F("SPI Slave..."));
}
}
void loop() {
if (is_spi_master) {
static uint8_t send_data = 0x00, recv_data;
Serial.print(F("Master> sent: 0x"));
Serial.print(send_data, HEX);
digitalWrite(SS_PIN, LOW);
recv_data = SPI.transfer(send_data);
digitalWrite(SS_PIN, HIGH);
Serial.print(F(", received: 0x"));
Serial.println(recv_data, HEX);
send_data += 1;
delay(100); // Corrected from dalay to delay
} else {
if (slave_received) {
SPDR = slave_recv_data; // Send data to master
slave_received = false;
Serial.print(F("Slave: received 0x"));
Serial.println(slave_recv_data, HEX);
}
delay(1);
}
}
ISR(SPI_STC_vect) {
slave_recv_data = SPDR; // Read data from master
slave_received = true;
}