mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Slave SPI mehrere Byte empfangen


Autor: Matze Niemand (hupe123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich sende von meinem SPI-Master zwei Byte (das geht auch, mein 
Oszilloskop bestätigt das).
Die Byte werden gesendet, ohne daß die SS-Leitung zwischendurch auf HIGH 
leget wird.
Die Slave-Empfangsroutine sieht wie folgt aus:
ISR (SPI_STC_vect)
{
  data[i] = SPDR;
  i++;
}

in der Slave-Main werden sollen die zwei Byte per UART ausgegeben 
werden. Alla:
  while(1)
  {
    if(data[1] != 0)
      {
        i=0;
        uart_puts(itoa(data[0],buffer,10));
        uart_puts(itoa(data[1],buffer,10));
        
        data[0]=0;
        data[1]=0;
      }
  }

Nur wird nur das erste Byte ausgegeben und auch nur bei jedem zweiten 
Senden von Master...
Ich find den fehler nicht! Hilfe!

data und i sind wie folgt deklariert:
volatile unsigned char data[10], i=0;

Achja, Ich verwende nen ATmega8 und AVR-gcc...

Grüße!

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
deine Ausgabe wird vermutlich schon nach dem 1. empfangenen Byte aktiv, 
und wird dann evl. schon wieder von der ISR unterbrochen.

>  while(1)
>  {
>    if(i > 1)
> .....

versuch's mal so (für 2 Dyte die empfangen werden)

Sascha

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei du zwischen den Bytes ein bischen Zeit lassen solltest, da ein AVR 
beim SPI nicht puffert. Folglich ist es beim ersten Bit vom zweiten Byte 
schon zu spät um im Interrupt-Handler die Daten aus dem Register zu 
fischen.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Wobei du zwischen den Bytes ein bischen Zeit lassen solltest, da ein AVR
> beim SPI nicht puffert.

Falsch. Zitat aus dem Datenblatt: "The system is single buffered in the 
transmit direction and double buffered in the receive direction." Beim 
Senden musst du warten, bis das vorherige Byte vollständig gesendet 
wurde, bevor du etwas neues in SPDR schreiben kannst, beim Empfangen 
musst du SPDR auslesen, bevor das zweite Byte vollständig empfangen 
wurde.

Andreas

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast recht. Zum Problem wird das erst, wenn man nicht ausschliesslich 
empfängt, sondern auch Daten zurück liefern will.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.