Daten lesen mit ATMega8 als SPI Master

Gast #1641626
Lesenswert?

Hallo Leute,

im Forum sind ja schon haufenweise Artikel über AVRs und SPI Probleme. 
Leider konnte ich nach mehreren Stunden eine Frage nciht beantworten: 
Wie kann ich mit dem SPI Master Daten lesen?!?

initialisierung:
1
void spi_init(void) {
2
  DDRB = _BV(PB2) | _BV(PB3) | _BV(PB5);    // set SCK,MOSI,PB0 (SS) as output
3
  DDRB &= ~_BV(PB4);              // set MISO as input
4
  PORTB = _BV(PB5) | _BV(PB2);        // SCK and PB0 high 
5
  SPCR = _BV(SPE) | _BV(MSTR);        // SPI master, clock fck/4
6
  status = SPSR;                // clear status
7
}

Das Senden klappt von beginn an ohne Schwierigkeiten. Hier der code 
dazu:
1
void spi_send(unsigned char* data, unsigned char len) {
2
  unsigned char i;  
3

4
  PORTB &= ~_BV(PB2);              // set SS low
5
  for(i=0; i<len; i++) {
6
    SPDR = data[i];              // write byte
7
    while (!(SPSR & (1<<SPIF)));
8
  }
9
  PORTB |= _BV(PB2);              // set SS high
10
}

Kennt jemand vielleicht einen Codeschnipsel zum empfangen?
Besten Dank
Adrian
#1641639
Lesenswert?

Das Senden und Empfangen läuft bei SPI natürlich immer gleichzeitig ab. 
Daher kann nach jedem gesendeten Byte das jeweils empfangene direkt aus 
SPDR gelesen werden (und muss es auch, da es ansonsten mit dem nächsten 
Byte überschrieben wird).
1
void spi_send(unsigned char* data, unsigned char len) {
2
  unsigned char i;  
3

4
  PORTB &= ~_BV(PB2);              // set SS low
5
  for(i=0; i<len; i++) {
6
    SPDR = data[i];              // write byte
7
    while (!(SPSR & (1<<SPIF)));
8
    data[i] = SPDR;              // save received byte
9
  }
10
  PORTB |= _BV(PB2);              // set SS high
11
}
Gast #1641677
Lesenswert?

Danke Richard funktioniert jetzt.
Genau so hab ich es sogar schon versucht, jedoch hatte ich da wohl noch 
Verkabelungsprobleme und hab deshalb schon gezweifelt, ob ich etwas 
grundsätzliches falsch mache.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren