arduino-spi

Migrate from https://cmakerhk.wordpress.com/2018/10/12/arduino-spi/


https://www.microchip.com/wwwproducts/en/ATmega328p
https://www.arduino.cc/en/Reference/SPI

The Arduino Lib is for SPI Master, if you would like to play with SLAVE >> 0) –> to enable SPI module

https://github.com/PaulStoffregen/SPI/blob/master/SPI.h

//master loopback
#include 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  SPI.begin();
}

void loop() {
  // put your main code here, to run repeatedly:

}

void serialEvent(){
//statements
      Serial.print(SPI.transfer(Serial.read()));
}

//unfinished

#define pinIsSlave 2
#define pinNSS 10
//pin2 is High --> Slave
//pin2 is Low  --> Master

#define DDR_SPI DDRB
#define DD_MOSI DDB3
#define DD_MISO DDB4
#define DD_SCK  DDB5
#define DD_NSS  DDB2

//==========
//pin   Master    Slave
//MOSI  User      INPUT
//MISO  INPUT     User
//SCK   User      INPUT
//NSS   User      INPUT

//__enable_interrupt();
void SPI_MasterInit(void);
char SPI_MasterTransmit(char cData);
void SPI_SlaveInit(void);
char SPI_SlaveReceive(void);

void setup() {
  pinMode(pinIsSlave, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Master/Slave SPI - USART Firmware V1.0");
  Serial.println("pin2 is High --> Slave || pin2 is Low  --> Master");

  //Program Start
  if(digitalRead(pinIsSlave)){
   //========================= SLAVE ===================
   Serial.println("\n\n====Slave Mode is Selected====");
   SPI_SlaveInit();
  }else{
   //========================= MASTER ==================
   Serial.println("\n\n====Master Mode is Selected====");
   pinMode(pinNSS, OUTPUT);
   SPI_MasterInit();

   char a = SPI_MasterTransmit('i');
   Serial.print(a);

  }
}

void SPI_MasterInit(void){
  // Set MOSI and SCK output, all others untouch
  PORTB = 0xFF;
  DDR_SPI = (1 << DD_MOSI)|(1 << DD_SCK);

  //Enable SPI, Master,
  SPCR = (1 << SPE)|(1 << MSTR);

  //SPI0 Clock Rate Select to f_osc/16
  SPCR |= (1 << SPR0);
}

char SPI_MasterTransmit(char cData){
  //Start Transmission
  SPDR = cData;

  //wait until Commication complete
  while(!(SPSR & (1 << SPIF)));

  return SPDR;
//
//    SPDR = cData;
//    asm volatile("nop");
//    while (!(SPSR & _BV(SPIF))) ; // wait
//    return SPDR;

}

void SPI_SlaveInit(void){
  //Set MISO output, all other untouch
  DDR_SPI = (1 << DD_MISO);

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

char SPI_SlaveReceive(void){
  //wait until Commication complete
  while(!(SPSR & (1 << SPIF)));

  //Start Transmission
  return SPDR;
}










void loop() {
  // put your main code here, to run repeatedly:

}


ref:
http://www.gammon.com.au/forum/?id=10892&reply=1#reply1