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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.