Migrate from https://cmakerhk.wordpress.com/2018/10/13/avr-c-programming/
_BV is only defined in the avr-libc headers. Extracted from avr/sfr_defs.h in avr-libc::::BV=Bit Value
#define _BV(bit) (1 << (bit)) TCCR2 = _BV(COM20)|_BV(CTC2)|_BV(CS20); DDRD = _BV(PD7); == TCCR2 = (1< //bit masking // BM => Bit Mask #define _BM(bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0) \ ( \ ((bit7 == 7) << (bit7 & 7)) | \ ((bit6 == 6) << (bit6 & 6)) | \ ((bit5 == 5) << (bit5 & 5)) | \ ((bit4 == 4) << (bit4 & 4)) | \ ((bit3 == 3) << (bit3 & 3)) | \ ((bit2 == 2) << (bit2 & 2)) | \ ((bit1 == 1) << (bit1 & 1)) | \ ((bit0 == 0) << (bit0 & 0)) \ ) UCSR0A = _BM (RXC0, TXC0, ~UDRE0, ~FE0, ~DOR0, ~UPE0, ~U2X0, ~MPCM0);#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====”);
pinMode(pinNSS, INPUT);
SPI_SlaveInit();while(1){
if(digitalRead(pinNSS) == LOW)
Serial.print(SPI_SlaveReceive());
}}else{
//========================= MASTER ==================
Serial.println(“\n\n====Master Mode is Selected====”);
pinMode(pinNSS, OUTPUT);
SPI_MasterInit();while(1){
digitalWrite(pinNSS, HIGH);
char a = SPI_MasterTransmit(‘h’);
digitalWrite(pinNSS, LOW);
Serial.print(a);
delay(2000);
}}
}void SPI_MasterInit(void){
// Set MOSI and SCK output, all others untouch
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
Serial.print(“I am fucking here”);
while(!(SPSR & (1 << SPIF)));
Serial.println(“Something is here”);//Start Transmission
return SPDR;
}void loop() {
// put your main code here, to run repeatedly:}