0

I'm working with Arduino boards with AVR C coding to perform simple SPI communication from master for simple blink application on slave side.

They don't work, the TX function on the master side doesn't seem to work, after serial monitor debugging is discovered the function never get over the while loop! Why is that?

Here are the codes I worked on last night:

Master:

/* nano board is the Master and transmit
 data to slave to blink LEDs */
void SPI_Init(void);
void SPI_TX(uint8_t data);
void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);//start Serial
 Serial.println("Setting Up");
 void SPI_Init();
 delay(100);
 Serial.println("SPI intialization is complete");
}
void loop() {
 uint8_t d = 0x20;
 SPI_TX(d);
 Serial.println("just sent the 1st byte");
 _delay_ms(400);
 d = 01;
 SPI_TX(d);
 Serial.println("just sent the 2nd byte");
 _delay_ms(400);
}
void SPI_Init(void)
{
 DDRB = (1 << DDB3) | (1 << DDB1); // DDB2 MOSI, DDB1 SCK
 SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);
}
void SPI_TX(uint8_t data)
{
 SPDR = data;
 while (!(SPSR & (1 << SPIF)));
}
-------------------------------------------------------------- -

Slave:

-------------------------------------------------------------- -
/* pro micro as slave and receives data then push them on
 PORTD and PORTB to blink LEDs */
void SPI_Init_S(void);
void SPI_RX(void);
void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);//start Serial
 Serial.println("Setting Up");
 SPI_Init_S();
 delay(100);
 Serial.println("SPI intialization is complete");
 DDRD = (1 << DDD5); // TX LED as output
 DDRB = (1 << DDB0); // RX LED as output
}
void loop() {
 // put your main code here, to run repeatedly:
 SPI_RX();
 PORTD = SPDR; // blink the TX LED on pro micro board
 _delay_ms(500);
 SPI_RX();
 PORTB = SPDR; // blink the RX LED on pro micro board
 _delay_ms(500);
}
void SPI_Init_S(void)
{
 SPCR = (1 << SPE) | (1 << SPR0);
}
void SPI_RX(void)
{
 return SPDR;
}
asked Oct 3, 2016 at 3:59

2 Answers 2

1
 void setup() {
// put your setup code here, to run once:
 Serial.begin(9600);//start Serial
 Serial.println("Setting Up");
 void SPI_Init(void); // <---------------- this is wrong!
 delay(100);
 Serial.println("SPI intialization is complete");
 }

That isn't how you call a function.

It should read:

SPI_Init ();
answered Oct 3, 2016 at 5:50
0

You should use SS (Select Slave) pin for synchronization on both devices. If you have master with default settings for SS pin (= INPUT), any interferences will switch your master into the slave mode and SPI_TX will wait forever for clock pulses from outside.

Without using SS on both sides it can be also shifted (unsynchronized).

Edit: And yes, also not calling SPI_Init causes pretty similar deadlock.

answered Oct 3, 2016 at 5:49
1
  • Where is the SS pin on the pro micro board? I couldn't find it! So I switched the configuration to Uno master and Nano slave and it's still not working! Why? the master TX function is not passing and not executing the next commands! Commented Oct 5, 2016 at 15:56

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.