Forum: Mikrocontroller und Digitale Elektronik Daten lesen mit ATMega8 als SPI Master


von Adrian (Gast)


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

von Richard U. (ronw)


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
}

von Adrian (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.