Take the 2-minute tour ×
Electrical Engineering Stack Exchange is a question and answer site for electronics and electrical engineering professionals, students, and enthusiasts. It's 100% free, no registration required.

For a project I want to have two microcontrollers talk to each other via an SPI interface. I wrote the following code for the slave:

volatile uint8_t data;

void spi_init_slave (void)
{
 DDRB=(1<<PINB4);               //MISO as OUTPUT
 SPCR=(1<<SPE)|(1<<SPIE);       //Enable SPI && interrupt enable bit
 SPDR=0;
}

uint8_t SPI_SlaveReceive(void)
{      
  /* Wait for reception complete */
  while (!(SPSR & (1<<SPIF)))   ;
  /* Return data register */
  return    SPDR;
}

ISR(SPI_STC_vect)
{
  uint8_t y = SPI_SlaveReceive();
  PORTD = y;
}

int main(void)
{
    DDRD = (1<<PIND0) | (1<<PIND1) | (1<<PIND2) | (1<<PIND3) | (1<<PIND4);
    spi_init_slave();                             //Initialize slave SPI

    sei();
    while(1)
    {

    }
}

The master is sending a number which the slave displays using the LEDs attached to port D. I'm using an Atmega8P for this project.

share|improve this question
    
Above code is working now, fixed typo. –  BoboProg Apr 19 at 11:17

1 Answer 1

up vote 2 down vote accepted

The most apparent problem I can see is the following line:

SPCR=(1<<SPE)|(1<SPIE);

Is missing a less than sign and should include (1<<SPIE) to enable the SPI interrupt. Note that the current expression (1<SPIE) will be equivalent to the boolean expression (1 < 7) which will result in a value of 1. So that also means at the moment you'll be setting SPR0 for a speed of fosc/16 on the master.

share|improve this answer
    
You've made my day. Thanks! Only the slave doesn't have to "match" the speed of the master. Quoted atmel datasheep pp 126: "Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0. These two bits control the SCK rate of the dev ice configured as a Master. SPR1 and SPR0 have no effect on the Slave." –  BoboProg Apr 19 at 11:15
    
Ahh yes good point of course I re-worded that part. –  PeterJ Apr 19 at 11:21

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.