Forum: Mikrocontroller und Digitale Elektronik while Schleife bei SPI, Dauer


von Eugen T. (der_eugen_thorben)


Lesenswert?

Hi, ich hätte eine Frage zu SPI.

Man sendet ein Byte und wartet ja mit

1
 while(!(SPSR & (1 << SPIF)));

.
Ich würde gern, falls der Master absturzt, nicht, dass es ewig in der 
while Schleife hängen bleibt.

Ich dachte, dass der Master zusätzlich in einer for Schleife hochzählt 
und falls es zu lange dauert, die while Schleife unterbrochen wird.

Jedoch weiß ich nicht so genau, wie hoch ich den Zähler setzen sollte 
oder evtl einen Timer nutzen sollte, obwohl ich lieber die Timer 
freihalte für anderes Zeugs.

Hat da jemand Erfahrung mit?

Hab eine Frequenz von 16 Mhz

von chris (Gast)


Lesenswert?

Eugen Thorben schrieb:
> Ich dachte, dass der Master zusätzlich in einer for Schleife hochzählt
> und falls es zu lange dauert, die while Schleife unterbrochen wird.

SPI kann nicht "hängen bleiben", da einfach nur ein Byte rausgetaktet 
wird.
Bei maximaler SPI-Frequenz (0.5*F_CPU) dauert ein Byte per SPI gerade 
mal 16 CPU-Takte.

von Eugen T. (der_eugen_thorben)


Lesenswert?

cool, danke.

von Frank (Gast)


Lesenswert?

Ich würde so was in der Art machen:
1
while(!(SPSR & (1 << SPIF)))
2
{
3
 cnt++;
4
 if(cnt>MAXCNT)
5
 {
6
  setSpiError();
7
  break;
8
 }
9
}

Oder schöner, wenn du einen ms-Timer hast:
1
uint16 u16timeBefore = getActms();
2
3
while(!(SPSR & (1 << SPIF)))
4
{
5
 if( (getActms() - u16timeBefore) > MAXTIME)
6
 {
7
  setSpiError();
8
  break;
9
 }
10
}

Oder gleich mit Interrupts arbeiten und garnicht warten.
Ein Timeout sollte man trotzdem implementierten.

von Eugen T. (der_eugen_thorben)


Lesenswert?

ja, finde ich auch. ich denke auch, dass es mit einem timer besser ist.

von Thomas E. (thomase)


Lesenswert?

Frank schrieb:
> Ein Timeout sollte man trotzdem implementierten.

Welchen Sinn soll das haben? Da kann nichts abstürzen, hängen bleiben 
oder sonstwas. Es sei denn, der Controller geht kaputt. Aber dann ist es 
ohnehin egal.

> if( (getActms() - u16timeBefore) > MAXTIME)

Wenn das SPI mit F_CPU/2 läuft, wartet man nicht aufs SPI, sondern auf 
das Ende dieser Berechnung.

mfg.

von Frank (Gast)


Lesenswert?

Wilder Pointer schaltet den Clock der SPI Peripherie ab...oder sonst 
irgendwas wo es der HW nicht möglich ist die Daten auszutakten. Ich hab 
schon Pferde kotzen sehen.
Beim senden gebe ich euch vllt noch Recht.

Beim empfangen gibt es mehr als genügend Fälle wo es ohne Timeout schief 
gehen kann.

von Falk B. (falk)


Lesenswert?

@ Eugen Thorben (der_eugen_thorben)

>ja, finde ich auch. ich denke auch, dass es mit einem timer besser ist.

Finden kannst du das, es bleibt aber totaler Unsinn. SPI ist eine 
relativ schnelle, serielle Schnittstelle. Da will man ganz sicher nicht 
viel Zeit verplempern. Im Gegenteil. Also wird man meist versuchen, die 
Daten so schnell wie möglich auszugeben bzw. zu lesen. Und wie schon 
mehrfach gesagt, kann bei SPI niemals was hängen bleiben, weil der Slave 
keinerlei Handshake macht. Einen Interrupt nutzt man bei SPI auch 
selten, weil die Übertragungsrate meist so hoch ist (nahe F_CPU/2), dass 
die Zeit zwischen 2 Bytes eher knapp ist, der Interrupt spart dabei rein 
gar nichts an Rechenzeit, im Gegenteil.

Bei I2C ist das vollkommen anders, dort ist ein Timeout angeraten!

von Falk B. (falk)


Lesenswert?

@ Frank (Gast)

>Wilder Pointer schaltet den Clock der SPI Peripherie ab...oder sonst
>irgendwas wo es der HW nicht möglich ist die Daten auszutakten. Ich hab
>schon Pferde kotzen sehen.

Unfug. Und morgen fällt der Mond runter . . .

>Beim empfangen gibt es mehr als genügend Fälle wo es ohne Timeout schief
>gehen kann.

Schon wieder falsch. Auch beim Empfangen, welches parallel zum Senden 
läuft, gibt der Master den Takt vor und ist durch rein GAR NICHTS 
aufzuhalten!

von Thomas E. (thomase)


Lesenswert?

Frank schrieb:
> Wilder Pointer schaltet den Clock der SPI Peripherie ab
Ja nee, is klar.

Blödsinn ist das. Dann ist dein Programm Murks. Da nützt dir ein Timeout 
auch nichts.

mfg.

von Wolfgang A. (Gast)


Lesenswert?

Eugen Thorben schrieb:
> Ich würde gern, falls der Master absturzt, nicht, dass es ewig in der
> while Schleife hängen bleibt.

Wenn die Hardware von deinem µC ausfällt, laufen noch ganz andere Sachen 
im µC nicht. Hast du schon ein einziges Mal erlebt, dass die SPI 
Hardware die Bits nicht richtig raus tackert? IMHO fehlen da ein paar 
Grundlagen über die SPI Baugruppe.

von Clemens L. (c_l)


Lesenswert?

Frank schrieb:
> Wilder Pointer schaltet den Clock der SPI Peripherie ab...oder sonst
> irgendwas wo es der HW nicht möglich ist die Daten auszutakten. Ich hab
> schon Pferde kotzen sehen.

Solche kotzenden Pferde erledigt man mit dem Wachhund, äh, Watch Dog 
Timer.

von S. Landolt (Gast)


Lesenswert?

> Unfug. Und morgen fällt der Mond runter . . .

Ihn dünkt', er säh' 'ne SPI,
  die blieb auf einmal stehen.
Er guckt' noch mal und merkt', es war
  die Welt am Untergehen.
"Herrje, Herrjemine," sprach er,
  "ich kann das nicht verstehen."

von Nosnibor (Gast)


Lesenswert?

Geht es denn überhaupt um die Master-Seite, oder ist hier jemand in der 
unglücklichen Lage, mit seinem µC die Slave-Rolle übernehmen zu müssen?

Aus Sicht des Slave kann es ja sehr wohl passieren, daß der Master 
mitten in der Übertragung abbricht (z.B. wegen Reset), und damit muß man 
dann irgendwie klarkommen. Das sollte dann aber über die SS-Leitung 
gehen und nicht über irgendwelche willkürlichen Timeouts.

von Thomas E. (thomase)


Lesenswert?

Nosnibor schrieb:
> Geht es denn überhaupt um die Master-Seite

Ja.

Eugen Thorben schrieb:
> Ich dachte, dass der Master zusätzlich in einer for Schleife hochzählt
> und falls es zu lange dauert, die while Schleife unterbrochen wird.

mfg.

von Pandur S. (jetztnicht)


Lesenswert?

Was bedeutet Empfangen im Master ?

Er clockt soviele 0xFF raus wie er Daten erwartet und liest jeweils das 
SPI Register aus. Da ist nichts mit Warten. Je nach Interrupt 
Implementierung ist eine Soft SPI nicht allzu viel schlechter. Denn wenn 
der compiler fuer einen SPI Interrupt 16 Register push&pop-t...

von Thomas E. (thomase)


Lesenswert?

Jetzt Nicht schrieb:
> Denn wenn
> der compiler fuer einen SPI Interrupt 16 Register push&pop-t...

Deswegen ist das Warten auch meist günstiger.

mfg.

von c-hater (Gast)


Lesenswert?

Nosnibor schrieb:

> Geht es denn überhaupt um die Master-Seite

Nein, auch wenn einige Leute nicht lesen können. Es geht im OP ganz 
eindeutig um die Implementierung einer Slave-Rolle.

Die Verwirrung im Thread entstand wohl nur dadurch, dass der TO von SPI 
unglaublicherweise so erschreckend wenig Ahnung hat, dass er glaubte, 
als Slave irgendwas aus eigenem Antrieb senden zu können. Das hat wohl 
einige (weniger gründliche) Leser zu der Annahme verleitet, dass es um 
einen Master ginge.

> Aus Sicht des Slave kann es ja sehr wohl passieren, daß der Master
> mitten in der Übertragung abbricht (z.B. wegen Reset)

Genau so ist das auch.

> und damit muß man
> dann irgendwie klarkommen. Das sollte dann aber über die SS-Leitung
> gehen und nicht über irgendwelche willkürlichen Timeouts.

Vollkommene Überwachung geht nicht ohne sinnvolle Timeouts. Es geht aber 
natürlich ohne "willkürliche" Timeouts. Und nein: nicht die SS-Leitung 
wäre dafür zu überwachen, sondern die SCK-Leitung. Am besten aber beide. 
SCK mit Timeout, SS auf Pegel.
Allerdings: man kann es mit Sicherheitsfunktionalität auch so 
übertreiben, dass die Sicherheitsfunktionen (bzw. ihr Verbrauch an 
Rechenzeit) erst die Soll-Funktion so dermaßen stören, daß es zu Fehlern 
kommt...

Das ist eigenartigerweise nichtmal den hochbezahlten Ingenieuren 
diverser Standardisierungsorganisationen klar. Die können wohl alle nur 
C...

von Rudolph R. (rudolph)


Lesenswert?

c-hater schrieb:
>> Geht es denn überhaupt um die Master-Seite
>
> Nein, auch wenn einige Leute nicht lesen können. Es geht im OP ganz
> eindeutig um die Implementierung einer Slave-Rolle.

Interessante Theorie, sehe ich jetzt auch nicht so.

Bei einem Slave würde ich jetzt auch nicht per Polling darauf warten, 
dass vielleicht irgendwann mal ein Byte eingetrudelt kommt.

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.