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;
}
2 Answers 2
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 ();
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.
-
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!R1S8K– R1S8K2016年10月05日 15:56:57 +00:00Commented Oct 5, 2016 at 15:56