Forum: Mikrocontroller und Digitale Elektronik 2 Mikrocontroller über USART verbinden


von Matthias S. (jimbo4711)


Lesenswert?

Hallo,

ich habe folgendes vor: Auf einem Board sollen sich zwei Microcontroller 
(STM32F373) befinden. Der Eine soll einen Schrittmotor ansteuern, der 
Andere soll Kommunikationsschnittstellen zum PC (USB, CAN) 
bereitstellen.

Die Kommunikation der Controller untereinander soll per USART laufen. 
Damit sich die beiden nicht "in die Quere" kommen, soll ein Handshake 
über digitale IOs laufen.

Meine Frage lautet nun, hat schon jemand Erfahrung mit dieser Art der 
Kommunikation und kann mir sagen, worauf ich achten muss, bzw. wie man 
das am besten umsetzt. Oder kennt jemand einen guten Artikel/Tutorial?

Danke bereits im Voraus!

von Blackbird (Gast)


Lesenswert?

Handshake?
Wozu?
Bei USART-Kommunikation kommt sich niemand "in die Quere".
Jeder kann jederzeit senden und jederzeit empfangen.

Blackbird

von Dirk H. (dirk_h63)


Lesenswert?

Die Handshake-Leitungen verstehe ich auch nicht!
So etwas verwirklich ich immer wie folgt:
1.) Einer wird "Master"
2.) Master pollt Slave, ober er Daten hat, Wenn ja sendet Slave Daten.
3.) Master Sendet Daten an Slave
sicherheitshalber immer eine CRC und dann passt das schon.
mfg
Dirk

von Blackbird (Gast)


Lesenswert?

Master - Slave kann man machen, ist bei nur 2 Teilnehmern aber nicht 
erforderlich.
Wer was zu "sagen" hat, sendet.

Blackbird

von Dirk H. (dirk_h63)


Lesenswert?

Ist nur etwas aufwendiger zu programmieren, als ein M-S -System.
Und wer bei der Aufgabenstellung mit HW-Handshake arbeiten möchte......

von Magic S. (magic_smoke)


Lesenswert?

Ich denke im Moment über das gleiche Patent nach, zwischen zwei AVRs 
über Optokoppler. Ich würd da auch einfach senden, den Rest machen die 
Interrupts.

von Karl H. (kbuchegg)


Lesenswert?

Dirk H. schrieb:
> Ist nur etwas aufwendiger zu programmieren, als ein M-S -System.

Nicht ... wirklich

Denn auch in einem M-S System muss gewährleistet sein, dass das 
restliche System nicht steht, nur weil sich der M mit dem S gerade was 
aushandelt.

: Bearbeitet durch User
von Dirk H. (dirk_h63)


Lesenswert?

Vom Prinzip ist das ja klar mit den Interrupts.
Nur bekommst du einen pro Zeichen.

Jetzt musst du nur eine State-Machine bauen, die genau weiß, das du 
gerade auf eine Antwort wartest, oder ob es eine fremdmotivierte 
Nachricht vom Gegenpart ist. Alles machbar aber etwas mehr Aufwand.

Ich mache es fast immer mit dem Polligen verfahren. Also einfaches 
simples Protokoll.
Master Sendet: "?" Zurück kommt 0 oder die Anzahl der Daten die dann 
kommen + CRC.
Master Sendet: "!"+Anzahl der Daten, gefolgt von den Daten + CRC
ggfs. kann man noch ein ACK und NAK definieren.

von Magic S. (magic_smoke)


Lesenswert?

Was mein Plan war: Maximal 255 Byte pro Telegramm werden wohl reichen.

Also erstes Byte Länge des Telegramms, danach die Nutzdaten und 1-2 Byte 
Prüfsumme. Das lege ich erstmal so wie es ist in den Speicher ab und 
wenn es korrekt empfangen wurde sende ich ein ACK-Telegramm zurück und 
übergebe die Daten an das Hauptprogramm. Wenn nach dem Senden kein ACK 
kommt, kann der Sender sein Telegramm nach kurzer Zeit wiederholen.

von Daniel V. (danvet)


Lesenswert?


von Lothar (Gast)


Lesenswert?

Karl Heinz schrieb:
> Denn auch in einem M-S System muss gewährleistet sein, dass das
> restliche System nicht steht, nur weil sich der M mit dem S gerade was
> aushandelt.

Der STM soll für USART DMA unterstützen:
Beitrag "STM32F4 USART und DMA"

von Matthias S. (jimbo4711)


Lesenswert?

OK, danke schon mal an alle für die vielen Antworten, dass hilft mir 
schon weiter...

Die Idee mit dem Handshake war, dass der Master dem Slave sagt, wann er 
senden darf. Das kommt daher, das auf dem Master evt. zeitkritische 
Sachen laufen und der Slave den Master nicht durch eine Kommunikation 
stören soll.

von Magic S. (magic_smoke)


Lesenswert?

Das müßten dann schon sehr zeitkritische Sachen sein, damit der USART 
Recieve Interrupt da auffällt. Der soll ja nichts weiter machen als das 
empfangene Byte aus dem Puffer in den Speicher kopieren und prüfen ob 
das Telegramm vollständig ist. Wenn ja, dann noch ein Flag setzen, damit 
sich das Hauptprogramm bei der nächsten Gelegenheit darum kümmert.

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.