Forum: Mikrocontroller und Digitale Elektronik Serielle Kommunikation STM32 -> ESP8266 klappt nicht


von Peter M. (pbm)


Angehängte Dateien:

Lesenswert?

Ich möchte Daten von einem STM32 über serielle Schnittstelle zu einem 
ESP8266 senden. Dort kommen die Daten auch an, aber der ESP mag sie 
nicht.

Zunächst mal sieht man auf dem angehängten Bild die vom STM32 gesendeten 
Daten, gemessen am UART0-RX-Pin des ESP. Die Daten sollten nun mit 
diesem ESP-Arduino-Sketch verarbeitet werden:
1
void setup() 
2
{
3
  Serial.begin(BAUD);
4
  Serial1.begin(9600);
5
}
6
7
void loop()
8
{
9
  int len;
10
11
  if ((len = Serial.available())) {
12
    Serial1.println("Received bytes ...");
13
    // ...
14
  }
15
}

Eine erweiterte Trace-Ausgabe zeigt aber, dass Serial.available() 
konstant 0 zurückgibt.

Muß ich für den ESP das UART-Interface vom STM32 irgendwie besonders 
konfigurieren? Oder hat mein Sketch einen Denkfehler? Baud und Parität 
passen zusammen, und TX/RX sind gekreuzt.

von Rainer B. (katastrophenheinz)


Lesenswert?

Hi,
- GND ist verbunden?
- Loopbacktest ( TX/RX kurzschließen) auf ESP-Seite klappt auch?
- Was sagen die UART-Fehlerbits auf ESP-Seite ?
- ist die Baudrate auf beiden Seiten von einer ausreichend genauen 
Quelle (zB Quarz/kalibrierter RC-Oszillator) abgeleitet, so dass der 
Baudratenfehler ausreichend klein bleibt?

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Bei der gezeigten Kurve und angenommenen 100µs/Kästchen wären 9600 Baud 
um ca. Faktor 10 falsch.

Bei 9600 Baud wäre ein Bit ungefähr ein Kästchen breit. Oben im Bild 
sind run 10 Bits/Kästchen - also eher 115200 Baud.

von Guest (Gast)


Lesenswert?

Jim M. schrieb:
> Bei 9600 Baud wäre ein Bit ungefähr ein Kästchen breit. Oben im Bild
> sind run 10 Bits/Kästchen - also eher 115200 Baud.

Da schließe ich mich an. Ich zähle 11 statt 10 Bit aber das ist 
Haarspalterei. 9600 Baud ist das nicht.

Wie hast du die Baudrate am STM denn eingestellt?

von Peter M. (pbm)


Lesenswert?

Also erstmal: GND ist da. Am Loopback arbeite ich, ist aber auf der 
Platine nicht so einfach hinzufummeln.

Die Kommunikation ist mit 115200 Baud. Die 9600 Baud gelten nur für 
Serial1, also den Trace.

Zu den Fehlerbits kann ich nichts sagen, dazu kenne ich auf ESP-Seite 
(zumal mit Arduino) nicht gut genug aus.

Der ESP ist ein aufgelötetes ESP-07S-Modul, und der STM32 läuft mit HSI. 
Ich kann mal testweise die Baudrate reduzieren, vielleicht hilft das.

von Rainer B. (katastrophenheinz)


Lesenswert?

Peter M. schrieb:
> Der ESP ist ein aufgelötetes ESP-07S-Modul .
Kann das Ding überhaupt mehr als einmal U(SART) und hast du die GPIOs so 
konfiguriert, dass die entsprechenden GPIOs Tx und Rx des zweiten 
U(S)ART sind? Der Loopbacktest wird das zeigen.


> Ich kann mal testweise die Baudrate reduzieren, vielleicht hilft das.
Wenn der Baudratenteiler bei hoher Baudrate nicht von sich aus schon 
einen Fehler beinhaltet, dann hilft das nix.

von GEKU (Gast)


Lesenswert?

Bei mir waren die ESP8266 werkseitig auf 115kBaud eingestellt. 
Funktionieren die AT Kommandos mit dieser Übertragungsgeschwindigkeit?

von Stefan F. (Gast)


Lesenswert?

Überprüfe das Timing vom seriellen Signal. Die horizontale Auflösung 
deines Oszilloskop-Bildes reicht dazu nicht aus. Ein Logic Analyzer kann 
das besser.

von Rainer B. (katastrophenheinz)


Lesenswert?

Und poste bitte mal eine Malung vom Schaltungsaufbau und eine genaue 
Beschreibung des verwendeten ESP-Moduls und des STM32-Boards, sonst 
bleibt das hier Stochern im Nebel.

Weiterhin würde es helfen, wenn du z.B. mit einen USB-to-Serial-Adapter 
mal auf dem Übertragungssignal mithören/mitloggen lassen könntest.

von Harry L. (mysth)


Lesenswert?

Peter M. schrieb:
> Die Kommunikation ist mit 115200 Baud. Die 9600 Baud gelten nur für
> Serial1, also den Trace.

Ja...nee...is klar!

Finde den Fehler!

von Peter M. (pbm)


Lesenswert?

Loopback funktioniert offenbar auch nicht. Wenn ich diesen Sketch 
ausführe
1
void loop()
2
{
3
  Serial.print("xxx");
4
  
5
  if (Serial.available())
6
    Serial1.println("!");
7
}

und dann direkt RX mit TX verbinde, passiert gar nix.

Um auf das Timing (und zur Schaltung) zurückzukommen, ich habe vor TX- 
und RX-Pin je 1K Widerstand, wie von Stefan Frings empfohlen. 
Wahrscheinlich sollte ich die entfernen, aber kann das (bei geringer 
Geschwindigkeit) die Ursache sein?

von Peter M. (pbm)


Lesenswert?

Harry L. schrieb:
> Ja...nee...is klar!
>
> Finde den Fehler!

So sicher nicht.

von Rainer B. (katastrophenheinz)


Lesenswert?

Peter M. schrieb:
> ich habe vor TX-und RX-Pin je 1K Widerstand,

Schaltplan?

Was zeigt das Oszi am verbundenen Rx-Tx-Pin? Kommen die drei 'x' da 
raus?
Und nimm mal 'U' statt 'x', dann kannst du die Bits/Bitzeiten besser 
auszählen.

von drm (Gast)


Lesenswert?

TX an TX und Rx an Rx angeschlossen ? Passiert selbst den Besten mal.

von Peter M. (pbm)


Angehängte Dateien:

Lesenswert?

Ich habe zwischenzeitlich noch einmal alles überprüft und frisch 
angeschlossen, und siehe da:
1
 ets Jan  8 2013,rst cause:2, boot mode:(3,2)
2
3
load 0x4010f000, len 1384, room 16 
4
tail 8
5
chksum 0x2d
6
csum 0x2d
7
v8b899c12
8
~ld
9
   Init done.

Dieser Fehler wiederholt sich ca. alle Sekunde.

rst cause 2 steht für "External reset or wake-up from Deep-sleep". Der 
RST-Pin ist mit einem GPIO-Pin des STM32 verbunden, welcher als Input 
ohne Pullup/-down konfiguriert ist. Testweise habe ich auch Output mit 
HIGH ausprobiert, aber der Fehler blieb.

Diese Verbindung habe ich für den Fall, dass der STM32 den ESP resetten 
muss. Wahrscheinlich wäre ein Pullup geschickt gewesen, aber wieso tritt 
der Fehler immer wieder auf?

Anbei die Schaltung. Man beachte, dass die Verdrahtung sowohl UART als 
auch SPI unterstützen sollte. Leider ist der Anschluß am STM32 
fehlerhaft: anstelle von RTS/CTS wurde MOSI/NSS doppelt verbunden. Die 
Kommunikation ist jedoch ohne RTS/CTS.

Dabei fällt mir gerade auf: Verwendet der ESP denn RTS/CTS per default? 
In der Arduino-Doku steht dazu nichts.

von Arno (Gast)


Lesenswert?

Peter M. schrieb:
> Um auf das Timing (und zur Schaltung) zurückzukommen, ich habe vor TX-
> und RX-Pin je 1K Widerstand, wie von Stefan Frings empfohlen.
> Wahrscheinlich sollte ich die entfernen, aber kann das (bei geringer
> Geschwindigkeit) die Ursache sein?

Ja, kann sein. Überbrück die mal testweise, ich bin in der RX-Leitung 
von einem 5V-Chip (mit separater Clamping-Diode) auf wimre 220 Ohm 
runtergegangen, damit das zuverlässig funktioniert.

Hast du für den Loopback-Test die STM32-Pins auf "Eingang" geschaltet?

Peter M. schrieb:
> Anbei die Schaltung. Man beachte, dass die Verdrahtung sowohl UART als
> auch SPI unterstützen sollte. Leider ist der Anschluß am STM32
> fehlerhaft: anstelle von RTS/CTS wurde MOSI/NSS doppelt verbunden. Die
> Kommunikation ist jedoch ohne RTS/CTS.

Man sieht auch - wenn das die reale Platine ist - dass du sehr dünne 
Leiterbähnchen verwendest. Das kann eine Fehlerquelle sein, vor allem, 
weil auch die VCC/GND-Leiterbahnen nicht breiter sind und der ESP ja 
bekanntlich sehr steile Peaks in der Stromaufnahme hat (die Versorgung 
selbst ist hoffentlich ausreichend?)

Mein anderer Verdacht wäre ein Bug bei der Verwendung von zwei 
verschiedenen seriellen Schnittstellen - hast du mal verschiedene 
Versionen des esp8266-arduino-Core getestet?

> Dabei fällt mir gerade auf: Verwendet der ESP denn RTS/CTS per default?

Nein, tut er nicht.

MfG, Arno

von Peter M. (pbm)


Lesenswert?

Gut, aber erst muss der rst cause Fehler weg.

Wifi wird noch gar nicht genutzt, daher denke ich, die Stromversorgung 
reicht aus - wäre sonst nicht auch die Fehlermeldung "rst cause:1"?

von Rainer B. (katastrophenheinz)


Lesenswert?

Peter M. schrieb:
> Diese Verbindung habe ich für den Fall, dass der STM32 den ESP resetten
> muss. Wahrscheinlich wäre ein Pullup geschickt gewesen, aber wieso tritt
> der Fehler immer wieder auf?

Hi,

was ist mit den roten Leiterbahnen, die einfach so im rough enden?

Ist WRST sicher active low? Dann zieh den WRST-Pin mal mit einem 
externen Widerstand 4k7 auf High. ggf auch noch einen 100nF Kerko zw. 
WRST und GND. Und guck, ob das hilft.

Als nächstes dann das Oszilloskop an den VDD-Pin vom ESP-Modul und guck, 
ob dort Spannungseinbrüche auftreten

: Bearbeitet durch User
von Arno (Gast)


Lesenswert?

Peter M. schrieb:
> Gut, aber erst muss der rst cause Fehler weg.
>
> Wifi wird noch gar nicht genutzt, daher denke ich, die Stromversorgung
> reicht aus - wäre sonst nicht auch die Fehlermeldung "rst cause:1"?

Würde ich mich nicht drauf verlassen - bei fehlerhafter 
Spannungsversorgung kann ungefähr alles passieren.

Hat die Arduino-Umgebung einen Software-Watchdog zusätzlich zum 
HW-Watchdog? Dann kann es auch daran liegen, denn der würde den Reset 
Cause nicht ändern: 
https://www.espressif.com/sites/default/files/documentation/esp8266_reset_causes_and_common_fatal_exception_causes_en.pdf

MfG, Arno

von Stefan F. (Gast)


Lesenswert?

Peter M. schrieb:
> verwendet der ESP denn RTS/CTS per default?

Nein

von Peter M. (pbm)


Lesenswert?

So, das Problem ist gelöst!

Erstmal habe ich zwei dicke Drähte an Vdd und GND gelötet - immer noch 
der gleiche Fehler.

Dann habe ich die Schaltung mit einem Nucleo-Board auf einem Steckbrett 
nachgebaut - wieder der gleiche Fehler.

So langsam habe ich nicht mehr an einen Hardware-Fehler geglaubt und 
habe mir nochmal den (ganzen) Code angesehen:
1
uint8_t *bufptr;  // <-------------------
2
3
void loop()
4
{
5
  size_t len;
6
  
7
  if ((len = Serial.available())) {
8
    Serial.readBytes(bufptr, len);
9
    bufptr += len;
10
    Serial1.println("Received bytes ...");
11
    // ...
12
    }
13
  }

Ein ganz profaner Dereferenzierungsfehler also! Und ich hatte den 
relevanten Code nicht mitzitiert.

Trotzdem hat mich der Fehler überrascht, denn ich hätte eher was mit 
Stacktrace erwartet. Oh mann ...

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.