Forum: Mikrocontroller und Digitale Elektronik Slave SPI mehrere Byte empfangen


von Matze N. (hupe123)


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:
1
ISR (SPI_STC_vect)
2
{
3
  data[i] = SPDR;
4
  i++;
5
}

in der Slave-Main werden sollen die zwei Byte per UART ausgegeben 
werden. Alla:
1
  while(1)
2
  {
3
    if(data[1] != 0)
4
      {
5
        i=0;
6
        uart_puts(itoa(data[0],buffer,10));
7
        uart_puts(itoa(data[1],buffer,10));
8
        
9
        data[0]=0;
10
        data[1]=0;
11
      }
12
  }

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:
1
volatile unsigned char data[10], i=0;

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

Grüße!

von Sascha W. (sascha-w)


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

von (prx) A. K. (prx)


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.

von Andreas F. (aferber)


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

von (prx) A. K. (prx)


Lesenswert?

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

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.