Forum: Mikrocontroller und Digitale Elektronik ATMEGA_SPI vom SLAVE zum MASTER senden


von bestname_torben (Gast)


Lesenswert?

hi,

hoffe ich krieg mein problem gut erklärt.


bei mir läuft spi soweit, bloß will ich auch, dass der slave mir sofort 
daten sendet.



ich sende mit dem master entweder das char 'Z' oder 'R'.

wenn der slave etwas erhält, startet ISR(SPI_STC_vect)

falls etwas anderes als R ankommt, dann soll der wert, der der slave 
erhält, angezeigt werden.

bei 'R' soll der slave zum master 'X' übertragen.

wenn ich 'Z' vom master zum slave sende, kommt Z beim slave korrekt an 
und wird auf einem Display angezeigt.

wenn ich jedoch 'R' vom master zum slave sende (per Knopfdruck), 
passiert erstmal nichts, erst wenn ein zweites mal 'R' gesendet wird, 
erhaltet der master sein 'X'.

ich weiß, dass das interrupt startet, wenn die übertragung erfolgt ist 
und das spif bit gesetzt wurde.


hier ist der code vom slave

1
ISR(SPI_STC_vect)
2
{
3
  
4
  buffer = SPDR; // globale variable
5
  
6
  
7
8
    if(buffer == 'R')
9
    {
10
      
11
      SPI_Transmit_char('X');  // X senden
12
      // sendSymbolToLine_c(" ", 2, 1, 16); // Funktion fürs Display
13
      //  sendStringToPos("send X", 1, 10); // Funktion fürs Display
14
      
15
    }
16
    
17
    else if(buffer == 'Z')
18
    {
19
    
20
      PORTB ^= (1 << PINB0);  // LED toggle
21
      //  sendSymbolToLine_c(" ", 1, 10, 16);
22
      //  send_new_StringToPos("recv: ", 2, 1);
23
      // sendChar(&buffer); Funktion fürs Display
24
      
25
    }
26
}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

bestname_torben schrieb:
> if(buffer == 'R')
>     {
>       SPI_Transmit_char('X');  // X senden
>     }

 Aha.
 Und wie soll der Slave senden ?

 Takt wird vom Master erzeugt, also kann der Slave erst beim nächsten
 Senden vom Master etwas zurücksenden.

von Karl H. (kbuchegg)


Lesenswert?

bestname_torben schrieb:

> wenn ich jedoch 'R' vom master zum slave sende (per Knopfdruck),
> passiert erstmal nichts, erst wenn ein zweites mal 'R' gesendet wird,
> erhaltet der master sein 'X'.

Logisch.
Woher soll denn der Slave wissen, was er im Austausch antworten soll, 
wenn er noch gar nicht gesehen hat, was der Master will?

SPI ist ein Austausch von Bytes!

Während 1 Byte vom Master zum Slave geht, geht 1 Byte vom Slave zum 
Master.
Wenn der Master daher was vom Slave will, muss es 2 derartige 
Austauschmanöver geben. Das erste, damit der Master seinen Wunsch dem 
Slave vorträgt, das zweite damit er dem Slave die Gelegenheit gibt, 
seine Antwort kund zu tun.

Der Slave kann von sich aus überhaupt nichts tun. Alle Aktivität liegt 
beim Master.

von Peter D. (peda)


Lesenswert?

Beim Slave SPI Senden des AVR haben schon viele graue Haare gekriegt und 
sie sich dann büschelweise ausgerissen.

Der Master muß nach jedem Byte lange Gedenkpausen einlegen, damit der 
Slave alle laufenden Interrupts beenden, in den SPI-Interrupt springen, 
die Daten parsen und das Sendebyte laden kann.
Je nach Aufwand und Programmierfertigkeiten werden dafür ~50..500 
Slave-CPU-Zyklen benötigt.

von bestname_torben (Gast)


Lesenswert?

also SPI_Transmit_char()

sieht so aus :

1
  
2
void SPI_Transmit_char(unsigned char data)
3
  {
4
  
5
    SPDR = data;
6
    /* Wait for reception complete */
7
    while(!(SPSR & (1 << SPIF)));
8
  
9
  }

für master und slave

ich dachte master und slave warten solange, bis es fertig ist

von bestname_torben (Gast)


Lesenswert?

habs gelöst, einfach doppelt senden (dummy zeugs)

von DerMitDerShiftTaste (Gast)


Lesenswert?

bestname_torben schrieb:
> habs gelöst, einfach doppelt senden (dummy zeugs)

"gelöst" würde ich das nicht nennen, eher "hingeferkelt"

von Thomas E. (thomase)


Lesenswert?

DerMitDerShiftTaste schrieb:
> "gelöst" würde ich das nicht nennen, eher "hingeferkelt"

Dann erzähl doch mal, wie man das besser macht. Dass man das auch 
'gelöst' nennen kann.

mfg.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Eckmann schrieb:
> Dann erzähl doch mal, wie man das besser macht. Dass man das auch
> 'gelöst' nennen kann.
 Vielleicht richtig ?

 Was hat der Troll überhaupt gelöst ?

 Jeder normaler Mensch würde sagen:
 Danke an Alle, jetzt weiss ich wie es funktioniert.

 Und doppelt senden ist mit Sicherheit nicht gelöst.

von Peter D. (peda)


Lesenswert?

Thomas Eckmann schrieb:
> Dann erzähl doch mal, wie man das besser macht.

- einen Slave mit benutzbarem SPI nehmen (Sendepuffer)
- eine Handshakeleitung
- lange warten

von Thomas E. (thomase)


Lesenswert?

DerMitDerShiftTaste schrieb:
> eher "hingeferkelt"

Marc Vesely schrieb:
> Vielleicht richtig ?

Wie wäre es denn, wenn ihr Nasen mal schreibt, wie man das richtig 
macht?

mfg.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Eckmann schrieb:
> Wie wäre es denn, wenn ihr Nasen mal schreibt, wie man das richtig
> macht?

 Wie wäre es denn, wenn du mir mal den Buckel runterrutschst ?
 Außer regelmäßigem Abschreiben von mir hast du nicht viel gezeigt.
 Aber OK, für euch unwissende Nasen mal ganz kurz:

bestname_torben schrieb:
> bei mir läuft spi soweit, bloß will ich auch, dass der slave mir sofort
> daten sendet.

 Slave kann beim ersten bit überhaupt nicht wissen was der Master von
 ihm will, ist das euch Nasen klar ?

 Deswegen sendet man zuerst ein Byte in welchem mitgeteilt wird was
 verlangt wird (Daten, Zustand, etc.)

 Wenn der Slave mit Datenbearbeitung beschäftigt ist, wird SPDR mit
 NotReady geladen.
 Wenn der Slave mit seinen Hausaufgaben fertig ist, wird SPDR mit
 Ready geladen.
 Und dieser Wert wird von Slaven beim ersten Byte zurückgesendet.
 Wenn Master ein Ready empfängt, wird zweites Byte (natürlich etwas
 zeitverzögert) gesendet. Währenddessen sendet der Slave den verlangten
 Wert zurück.
 Und dieses zweite Byte kann dann ein Befehl für den Slaven sein, was
 er als nächstes machen soll oder auch nur ein ACK.

 Wenn der Master ein NotReady empfängt, wird das zweite Byte gar nicht
 erst gesendet, klar ?

 Ich hoffe, dich aus deinem Abgrund der Unwissenheit wenigstens ein
 bisschen hochgezogen zu haben.
 Ganz nach oben ist aber ein weiter Weg, da musst du alleine klettern.

von Dieter F. (Gast)


Lesenswert?

Marc Vesely schrieb:
> Wenn der Slave mit seinen Hausaufgaben fertig ist, wird SPDR mit
> Ready geladen.
> Und dieser Wert wird von Slaven beim ersten Byte zurückgesendet.

Bist Du da aus dem Tritt gekommen?

Master und Slave senden immer "gleichzeitig Zeitversetzt" - oder?

Master 1. Byte - Slave lululu

Master 2. Byte - Slave ggf. Antwort auf 1. Byte Master

Für jedes Bit, das der Master sendet gibt es 1 Bit vom Slave "im 
Austausch". Daher kann der Slave auch nur "Zeitversetzt" Antworten.

Das beschreibst Du hier ja auch vollkommen (aus meiner Sicht) korrekt:

Marc Vesely schrieb:
> Wenn Master ein Ready empfängt, wird zweites Byte (natürlich etwas
>  zeitverzögert) gesendet. Währenddessen sendet der Slave den verlangten
>  Wert zurück.

Marc Vesely schrieb:
> Ganz nach oben ist aber ein weiter Weg, da musst du alleine klettern.

Habe die Leiter ein wenig verrückt :-)

von Thomas E. (thomase)


Lesenswert?

Marc Vesely schrieb:
> Slave kann beim ersten bit überhaupt nicht wissen was der Master von
>  ihm will, ist das euch Nasen klar ?
>
>  Deswegen sendet man zuerst ein Byte in welchem mitgeteilt wird was
>  verlangt wird (Daten, Zustand, etc.)
>
>  Wenn der Slave mit Datenbearbeitung beschäftigt ist, wird SPDR mit
>  NotReady geladen.
>  Wenn der Slave mit seinen Hausaufgaben fertig ist, wird SPDR mit
>  Ready geladen.
>  Und dieser Wert wird von Slaven beim ersten Byte zurückgesendet.
>  Wenn Master ein Ready empfängt, wird zweites Byte (natürlich etwas
>  zeitverzögert) gesendet. Währenddessen sendet der Slave den verlangten
>  Wert zurück.
>  Und dieses zweite Byte kann dann ein Befehl für den Slaven sein, was
>  er als nächstes machen soll oder auch nur ein ACK.
>
>  Wenn der Master ein NotReady empfängt, wird das zweite Byte gar nicht
>  erst gesendet, klar ?

Siehste. Geht doch.

Aber erstmal unqualifiziert rummotzen:

Marc Vesely schrieb:
> Vielleicht richtig ?
>
>  Was hat der Troll überhaupt gelöst ?
>
>  Jeder normaler Mensch würde sagen:
>  Danke an Alle, jetzt weiss ich wie es funktioniert.
>
>  Und doppelt senden ist mit Sicherheit nicht gelöst.

mfg.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Dieter Frohnapfel schrieb:
> Master 1. Byte - Slave lululu
>

 Master 1. Byte - Slave Ready/NotReady

von Dieter F. (Gast)


Lesenswert?

Marc Vesely schrieb:
> Master 1. Byte - Slave Ready/NotRead

Nicht unbedingt:

Master 1. Byte (pollt) - Slave hat gewartet und gibt Daten-Byte zurück

von Christian K. (the_kirsch)


Lesenswert?

"Slave Ready/NotRead"

sollen das jetzt feste Bitmuster sein die der Slave dem Master sendet 
oder was?

Wenn ich ein Bidirektionale Kommunikation über SPI mache sendet der 
Slave als erstes Byte ein Status Register zurück, und als zweites bis 
n-tes die Daten. (Chip Select hält der Master solange auf Enabled)

Das 1. Byte des Masters sagt was der Slave senden soll (oder das ein 
Kommando folgt). Der Master bricht ab wenn er nach dem 1. Byte vom Slave 
(das Statusregister) merkt, das der Slave noch nicht so weit ist.

Zusätzlich kann man noch ein Interrupt verwenden, mit dem der Slave dem 
Master signalisiert, das sich was an seinem Status geändert hat.

von bestname_torben (Gast)


Lesenswert?

kein plan was ihr habt, finde es mit dummy nicht uncool

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

bestname_torben schrieb:
> kein plan was ihr habt, finde es mit dummy nicht uncool

 Niemand hat hier was, nur gehört es einfach zu Nettiquette, dass man
 sich zumindest bedankt, wenn einem etwas erklärt wird, was er vorher
 nicht gewusst hat.

 Und was genau wolltest du mit:
 "habs gelöst, einfach doppelt senden (dummy zeugs)"
 sagen ?

 Daß die anderen es genauso machen sollen ?
 Daß du alleine draufgekommen bist ?
 Daß das eine Lösung ist, die man in die SPI-Library aufnehmen soll ?

 Auch als Troll sollte man imstande sein, Danke zu sagen.

 Ob du danach ein Dummy oder 2K Dummys sendest, ist deine Sache.

von bestname_torben (Gast)


Lesenswert?

bin selber da drauf gekommen, also ohne hilfe so. mit den posts davor 
konnte ich ehrlich gesagt nicht so richtig was anfangen.

mit dummymein ich, dass man 2 mal was sendet

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.