Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen STM32 und RaspberryPi über 50m Distanz


von Manuel N. (manuelambaum)


Lesenswert?

Hallo zusammen,

ich habe ein Setup, bei dem ein STM32 als Slave fungiert und ein 
Raspberry Pi als Master. Der Raspberry Pi soll alle paar Minuten einige 
Bytes vom STM32 auslesen. Zusätzlich möchte ich bei Bedarf 
Firmware-Updates durchführen – also den STM32 über den Bootloader (ggf. 
eigenen Bootloader) direkt vom Raspberry Pi flashen.

Zur eigentlichen Aufgabenstellung:

Der STM32 und der Raspberry Pi sollen über ein rund 50 m langes 
Netzwerkkabel miteinander verbunden werden. Für die Kommunikation stehen 
mir exakt zwei Datenleitungen zur Verfügung. Diese müssen nicht zwingend 
I²C oder UART sein – jede zuverlässige Lösung ist denkbar, solange sie 
mit zwei Leitungen auskommt.
Es gibt keine zusätzliche Leitung für Enable/Direction o. Ä., die 
komplette Kommunikation muss ausschließlich über diese beiden Signale 
laufen.

Am STM32 habe ich 1,8 V Logikpegel, die bereits auf 3,3 V gewandelt 
werden. Der Raspberry Pi arbeitet ebenfalls mit 3,3 V Pegeln.

Frage:
Welches Übertragungssystem oder welche Schnittstelle eignet sich für 
eine robuste, bidirektionale Kommunikation über 50 m, wenn nur zwei 
Leitungen verfügbar sind – idealerweise so, dass auch Firmware-Updates 
vom Raspberry Pi zum STM32 möglich sind?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Manuel N. schrieb:
> Es gibt keine zusätzliche Leitung für Enable/Direction o. Ä.,

Sind denn die GND's beider Systeme verbunden? Dann wäre CAN eine 
einfache und robuste Lösung.

Wenn nicht, isoSPI oder Single-Pair-Ethernet.

von Wastl (hartundweichware)


Lesenswert?

Manuel N. schrieb:
> Zusätzlich möchte ich bei Bedarf
> Firmware-Updates durchführen – also den STM32 über den Bootloader (ggf.
> eigenen Bootloader) direkt vom Raspberry Pi flashen.

Manuel N. schrieb:
> Für die Kommunikation stehen
> mir exakt zwei Datenleitungen zur Verfügung.

Für den Update darf man sich dann mal einen entsprechend
fähigen Bootloader selbst schreiben ....

von Nemopuk (nemopuk)


Lesenswert?

Es gibt vermutlich isolierte RS485 Treiber, die mit zwei Leitungen ohne 
GND auskommen.

von Manuel N. (manuelambaum)


Lesenswert?

Niklas G. schrieb:
> Sind denn die GND's beider Systeme verbunden? Dann wäre CAN eine
> einfache und robuste Lösung.
>
> Wenn nicht, isoSPI oder Single-Pair-Ethernet.

Habe im Gesamten beim STM32 und RaspberryPi nur zwei Datenpins zur 
verfügung. SPI hat meines Kenntnisstandes mehr als zwei.

von Manuel N. (manuelambaum)


Lesenswert?

Nemopuk schrieb:
> Es gibt vermutlich isolierte RS485 Treiber, die mit zwei Leitungen ohne
> GND auskommen.

Habe die GND's verbunden.

von Manuel N. (manuelambaum)


Lesenswert?

Wastl schrieb:

> Für den Update darf man sich dann mal einen entsprechend
> fähigen Bootloader selbst schreiben ....

Schreibe gerne einen selbst :)

von Nemopuk (nemopuk)


Lesenswert?

Manuel N. schrieb:
> Habe die GND's verbunden.

Na dann ruft es erst Recht nach RS485.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Manuel N. schrieb:
> SPI hat meines Kenntnisstandes mehr als zwei.

isoSPI hat genau zwei Pins, ein differentielles bidirektionales 
galvanisch getrenntes Paar genau wie Ethernet.

Manuel N. schrieb:
> Habe die GND's verbunden.

Dann geht auch CAN oder RS485. CAN ist schön einfach für Multi-Master 
Systeme weil die Hardware schon fast alles erledigt. Bei nur zwei 
Endpunkten ist RS485 aber vermutlich ausreichend, und etwas praktischer 
bei größeren Datenmengen wie für das Firmware Update nötig.

von Wastl (hartundweichware)


Lesenswert?

Manuel N. schrieb:
> Habe im Gesamten beim STM32 und RaspberryPi nur zwei Datenpins zur
> verfügung. SPI hat meines Kenntnisstandes mehr als zwei.

Durch diese Fehlplanung wird es im Endeffekt sehr teuer bzw.
sehr aufwendig das Vorhaben zu realisieren. Also lieber nochmal
alles von vorn, mit mehr Pins für die Kommunikation.

von Manuel N. (manuelambaum)


Lesenswert?

Niklas G. schrieb:
> isoSPI hat genau zwei Pins, ein differentielles bidirektionales
> galvanisch getrenntes Paar genau wie Ethernet.
Aber der STM32 und RaspberryPi müssen die daten via SPI ausgeben und 
empfangen oder? SPI hat mehr als zwei Pins (SDO/SDI/SCK/NSS) und ich 
habe physisch am STM32 und RaspberryPi exakt zwei Pins zur verfügung


> Dann geht auch CAN oder RS485. CAN ist schön einfach für Multi-Master
> Systeme weil die Hardware schon fast alles erledigt. Bei nur zwei
> Endpunkten ist RS485 aber vermutlich ausreichend, und etwas praktischer
> bei größeren Datenmengen wie für das Firmware Update nötig.

Habe nur zwei Endpunkte, würde daher lieber RS485 nehmen. Welche IC's 
empfiehlst du mir? Was für eine baudrate über 50m ist realistisch? Eine 
baudrate von 115200 wäre wünschenswert

von Rainer W. (rawi)


Lesenswert?

Manuel N. schrieb:
> Niklas G. schrieb:
>> ...
>> Wenn nicht, isoSPI oder Single-Pair-Ethernet.
>
> ... SPI hat meines Kenntnisstandes mehr als zwei.

isoSPI ≠ SPI

Hier kannst du deinen Kenntnisstand erweitern: ;-)
https://www.analog.com/media/en/technical-documentation/data-sheets/ltc6820.pdf

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Manuel N. schrieb:
> Aber der STM32 und RaspberryPi müssen die daten via SPI ausgeben und
> empfangen oder?

Ja. Daher muss auf beiden Seiten ein Umsetzer und Transformator 
dazwischen, LTC6820. Der macht aus den 4 SPI-Pins ein differentielles 
Paar.

Manuel N. schrieb:
> Welche IC's empfiehlst du mir?

https://www.ti.com/product-category/isolation/isolated-interface-ics/rs-485-transceivers/overview.html

von Mi. W. (mikuwi)


Lesenswert?

Manuel N. schrieb:
> Hallo zusammen,
>
> ich habe ein Setup, bei dem ein STM32 als Slave fungiert und ein
> Raspberry Pi als Master. Der Raspberry Pi soll alle paar Minuten einige
> Bytes vom STM32 auslesen.

Also nix schnelles

> Zusätzlich möchte ich bei Bedarf
> Firmware-Updates durchführen – also den STM32 über den Bootloader (ggf.
> eigenen Bootloader) direkt vom Raspberry Pi flashen.

also hat auch das Zeit - solange es zuverlässig funktioniert?

> Der STM32 und der Raspberry Pi sollen über ein rund 50 m langes
> Netzwerkkabel miteinander verbunden werden. Für die Kommunikation stehen
> mir exakt zwei Datenleitungen zur Verfügung. Diese müssen nicht zwingend
> I²C oder UART sein – jede zuverlässige Lösung ist denkbar, solange sie
> mit zwei Leitungen auskommt.

>
> Frage:
> Welches Übertragungssystem oder welche Schnittstelle eignet sich für
> eine robuste, bidirektionale Kommunikation über 50 m, wenn nur zwei
> Leitungen verfügbar sind – idealerweise so, dass auch Firmware-Updates
> vom Raspberry Pi zum STM32 möglich sind?

kA wie die Umgebung aussieht, ich würde das unter allen Umständen 
galvanisch getrennt ausführen, 50m sind auch inhouse nicht trivial was 
Störsicherheit betrifft. CAN eignet sich dafür ideal. Auch ein 
Bootloader der über CAN arbeitet ist kein Hexenwerk, manche uCs können 
das out of the box...

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Mi. W. schrieb:
> aussieht, ich würde das unter allen Umständen galvanisch getrennt
> ausführen, 50m sind auch inhouse nicht trivial was Störsicherheit
> betrifft. CAN eignet sich dafür ideal.

CAN ist aber normalerweise nicht galvanisch getrennt. 50m werden bei 
Industrieanlagen auch oft ohne galvanische Trennung gemacht.

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Manuel N. schrieb:
> Was für eine baudrate über 50m ist realistisch? Eine baudrate von 115200
> wäre wünschenswert

Locker, auch 1 Mbit. Aber da du nur zwei Pins zur Verfügung hast, wird 
einer davon die Richtung umschalten müssen, so dass der zweite Pin 
sowohl RxD als auch TxD ist. Das läuft dann wohl auf eine 
interruptbasierte Implementierung in Software hinaus. Lässt der Rest des 
Systems, insbesondere das OS des Raspberry Pi so eine Implementierung 
zu?

von Bauform B. (bauformb)


Lesenswert?

Nemopuk schrieb:
> Aber da du nur zwei Pins zur Verfügung hast, wird
> einer davon die Richtung umschalten müssen, so dass der zweite Pin
> sowohl RxD als auch TxD ist. Das läuft dann wohl auf eine
> interruptbasierte Implementierung in Software hinaus.

Das vereinigt doch so ziemlich alle Nachteile? Wenn das ok ist, würde 
ich gleich ganz normales UART mit normalen RS-232 Transceivern nehmen. 
Das funktioniert auf beiden Seiten sofort ohne Tricks und ohne spezielle 
Software. Du kannst sogar den integrierten STM32-UART-Bootloader 
verwenden.

STM32-Reset und Start des Bootloaders funktionieren auch über diese zwei 
Datenadern, wenn du einen 4060 und einen Transistor spendierst. Der RPi 
muss dazu ein Break senden, kurz für Reset und doppelt so lang für Boot.

Es gibt auch RS-232 Transceiver für 1.8V: LT2801, LT2803-1.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Nemopuk schrieb:
> Aber da du nur zwei Pins zur Verfügung hast, wird
> einer davon die Richtung umschalten müssen

Wieso das? Dann ist es auch nicht mehr differenziell. Bus-Systeme wie 
USB, CAN, isoSPI kommen mit einem einzelnen differenziellen Paar aus, 
ohne zusätzliche Ader zur Richtungsumschaltung.

Man kann einfach differenzielles RS485 über die zwei Adern betreiben. 
Die Umschaltung der Richtung macht man "smart" in Software. Ganz simpel 
z.B.: Der "Slave" (vermutlich der STM32) ist standardmäßig immer auf 
Empfang auf dem Leitungspaar, und der "Master" (vermutlich der PI) 
sendet auf Wunsch ein Datenpaket und schaltet danach sofort auf Empfang 
um. Der Slave empfängt dieses, bearbeitet es, schickt eine Antwort 
zurück und schaltet wieder auf Empfang. Wenn der Master die Antwort 
nicht innerhalb einer fixen Zeit (z.B. 10ms) bekommen hat, ist was 
schief gelaufen und der Master fängt von vorn an. USB funktioniert 
praktisch genau so.

Man kann es noch beliebig steigern, sodass z.B. beide Seiten jederzeit 
spontan senden können und Kollisionen erkannt werden (wie CAN). Je 
nachdem wie die Anforderungen sind. Prüfsummen (CRC) und Timeouts sollte 
man sowieso verwenden, und den Nachrichten einen Zähler hinzufügen, 
sodass eine doppelt empfangene Nachricht eine Aktion nicht 2x auslöst 
(wenn die Antwort nicht ankam, die initiale Nachricht aber schon).

von Nemopuk (nemopuk)


Lesenswert?

Niklas G. schrieb:
> Wieso das?

Weil RS485 Treiber ein Steursignal für die Ruchtungsumschaltung 
brauchen. Und ohne Treiber würde ich das bei der Distanz nicht mal 
versuchen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Nemopuk schrieb:
> Weil RS485 Treiber ein Steursignal für die Ruchtungsumschaltung
> brauchen.

Das muss man aber nicht über die Leitung schicken, sondern kann es lokal 
per GPIO in Software erzeugen.

von Nemopuk (nemopuk)


Lesenswert?

Niklas G. schrieb:
> Das muss man aber nicht über die Leitung schicken, sondern kann es lokal
> per GPIO in Software erzeugen.

Eben, dafür braucht er einen von zwei I/O Pins. Bleibt nur nich einer 
für die Daten übrig. Oder zähle ich falsch bis zwei?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Nemopuk schrieb:
> Eben, dafür braucht er einen von zwei I/O Pins.

Ach du meinst weil PI und STM32 keine GPIOs übrig haben? Ist das so?

Beim STM32 kann man einen UART-Pin bidirektional betreiben und einen 
GPIO zur Richtungsumschaltung nutzen, beim PI vielleicht auch. Das 
ändert aber das Konzept der Übertragung auf der Leitung nicht (immer 
noch RS485 differenziell+bidirektional) und die Software nur marginal. 
Auf Seite des PI könnte man einfach einen USB-RS485 Adapter nutzen, da 
wird das Transmit-Enable Signal automatisch generiert...

von Nemopuk (nemopuk)


Lesenswert?

Niklas G. schrieb:
> Ach du meinst weil PI und STM32 keine GPIOs übrig haben? Ist das so?

Manuel N. schrieb:
> Habe im Gesamten beim STM32 und RaspberryPi nur zwei Datenpins zur
> verfügung. SPI hat meines Kenntnisstandes mehr als zwei.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Nemopuk schrieb:
> Niklas G. schrieb:
>> Ach du meinst weil PI und STM32 keine GPIOs übrig haben? Ist das so?
>
> Manuel N. schrieb:
>> Habe im Gesamten beim STM32 und RaspberryPi nur zwei Datenpins zur
>> verfügung. SPI hat meines Kenntnisstandes mehr als zwei.

Hatte ich anders interpretiert, aber OK. Beim STM32 ist es wie gesagt 
kein Problem dank UART mit Half-Duplex:

> USART single-wire Half-duplex communication: Single-wire Half-duplex mode is 
selected by setting the HDSEL bit in the USART_CR3 register. ... The USART can be 
configured to follow a Single-wire Half-duplex protocol where the TX and RX lines 
are internally connected. ... The TX pin is always released when no data is 
transmitted. Thus, it acts as a standard I/O in idle or in reception.

Auf PI-Seite nimmt man einen USB-RS485 Adapter, ggf. via Hub. In 
Software muss man da dann praktisch nichts machen.

von Rainer W. (rawi)


Lesenswert?

Nemopuk schrieb:
> Eben, dafür braucht er einen von zwei I/O Pins. Bleibt nur nich einer
> für die Daten übrig. Oder zähle ich falsch bis zwei?

RS-485 mit Richtungsumschaltung ist auch nur semi-duplex, d.h. auch nur 
eine diff. Datenleitung. Dann reicht bei geeignetem Hardwareaufbau auch 
ein I/O Pin für die Daten ;-)

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

PS: Bei CAN ist es nochmal einfacher, da braucht es genau 2 Leitungen am 
Controller, den Rest erledigt der Transceiver-IC.

von Nemopuk (nemopuk)


Lesenswert?

Rainer W. schrieb:
> RS-485 mit Richtungsumschaltung ist auch nur semi-duplex, d.h. auch nur
> eine Datenleitung. Dann reicht bei geeignetem Hardwareaufbau auch ein
> I/O Pin für die Daten

Ach was!?

Nemopuk schrieb:
> da du nur zwei Pins zur Verfügung hast, wird einer davon die Richtung
> umschalten müssen, so dass der zweite Pin sowohl RxD als auch TxD ist.

von Wastl (hartundweichware)


Lesenswert?

Niklas G. schrieb:
> Hatte ich anders interpretiert, aber OK.

Bei der Aussage des TO sehe ich da keinen Spielraum für
Interpretationen.

Manuel N. schrieb:
> Habe im Gesamten beim STM32 und RaspberryPi nur zwei Datenpins zur
> verfügung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Manuel N. schrieb:
> Für die Kommunikation stehen mir exakt zwei Datenleitungen zur Verfügung.
Denn das verleitet zur Annahme, dass lediglich 2 Kupferleitungen 
zwischen diesen beiden Komponenten sind. Und schlimmstenfalls muss man 
davon ausgehen, dass diese 2 Kupferleitungen nicht verdrillt sind.

Aber ich sehe keinen Grund daraus herzuleiten, dass auf beiden Seiten 
nur noch 2 µC-Pins frei belegbar sind. Und zwar am besten solche 
µC-Pins, die nur EA können und gar keine Schnittstellenfunktion haben.

Niklas G. schrieb:
> Ist das so?
Das ist es, warum ich Schaltpläne so liebe. Gerne dürfen in diesen 
**Schaltplan** dann auch Kästchen mit Fragezeichen reingemalt werden, 
wenn dort die fragliche Komponente rein soll.

: Bearbeitet durch Moderator
von Nemopuk (nemopuk)


Lesenswert?

Lothar M. schrieb:
> Aber ich sehe keinen Grund daraus herzuleiten, dass auf beiden Seiten
> nur noch 2 µC-Pins frei belegbar sind.
> Und schlimmstenfalls muss man davon ausgehen, dass diese 2 Kupferleitungen nicht 
verdrillt sind.

Vielleicht mal beide Beiträge des TO zusammen berücksichtigen:

Manuel N. schrieb:
> ein rund 50 m langes Netzwerkkabel miteinander verbunden werden. Für die
> Kommunikation stehen mir exakt zwei Datenleitungen zur Verfügung.

Manuel N. schrieb:
> Habe im Gesamten beim STM32 und RaspberryPi nur zwei Datenpins zur
> verfügung. SPI hat meines Kenntnisstandes mehr als zwei.

Und der vollständigkeit halber:

Manuel N. schrieb:
> Habe die GND's verbunden.

: Bearbeitet durch User
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.