ESP8266 - DTR & RTS für automatischen Upload ?!

Bekannterweise wird ein Arduino mittels DTR-Signal via COM/USB resettet und kann dann auch neu geflasht werden.
Ein ESP braucht zu flashen dazu jedoch 2 Info's: RST an Masse und GPIO-0 an Masse.
Und zwar in der Reihenfolge: GPIO-0 H -> L, RESET H -> L -> H, GPIO-0 L -> H.

Es gibt da nun eine Reihe von Schaltungs-Tricks im WWW, die sich nur des DTR bedienen, was ich recht "unglücklich" gelöst finde, wenn DTR oft mals automatisch beim Programmstart div. Progs gesetzt wird (auch der IDE-Monitor).

NodeNMU benutzt dazu ein FlipFlop (siehe hier: https://raw.githubusercontent.com/nodemcu/nodemcu-devkit/master/Documents/NODEMCU_DEVKIT_SCH.png), dessen Sinn mir nicht ganz klar wird, da hier RTS nicht während DTR "wirkt".

Leider bin ich im WEB bisher nicht schlau geworden, ob die Arduino-IDE neben DTR auch RTS setzt - und wenn ja: in welcher Sequenz.
Weiß da jemand (relativ) zuverlässig ? Oder hat einen Link zur entsprechenden Info ?
Mega-Dank dafür im voraus !

PS - bevor Fragen kommen....
Ja, könnte ich auch selbst austesten. Aber: A) Mit Speicher-Scope wäre das einfacher und B) muss ich hier sehr zeitnah ein umfangreiches Platinen-Layout zum Fertiger geben, wo diese "Reset-/Flash-Mimik" richtig implementiert ist.

So - nun hab ich’s raus.
Nach langer rumsucherei fand ich unter Incompatibility in pin assignments between esptool and esp8266/Arduino · Issue #91 · esp8266/Arduino · GitHub folgenden Text:

When flashing with esptool the setup sequence looks like this:
RTS goes LOW
DTR goes LOW
RTS goes HIGH
DELAY
DTR goes HIGH
which means that your wiring looks like this…
RTS → CH_PD (i.e reset)
DTR → GPIO0

When flashing with the Arduino IDE
RTS and DTR go LOW
DTR goes HIGH
DELAY
RTS goes HIGH
which means that your wiring looks like this…
RTS → GPIO0
DTR → CH_PD (i.e reset)

Dazu passend fand ich unter http://esp8266.github.io/Arduino/versions/2.0.0/doc/boards.html#generic-esp8266-modules eine Schaltung “ESP to Serial ^” (etwa mitte der Seite) welche das Scenario mit flashen durch ESPTOOL darstellt.

Das wird sicherlich soweit funktionieren, aber es gibt da ein paar Kleinigkeiten zu beachten:

RTS-RESET und DTR-GPIO0 sind dirkt verbunden und mit PullUp-Rs versehen.
Schaut man sich mal das Datenblatt z.B. eines CP2102 an, liest man dort:

“Unused handshaking pins should be left floating to avoid any bus contention. This will prevent a condition where the host application inadvertantly sets a handshaking pin to a state opposite the state to which the pin is tied. For instance, a pin could be set to a high state when the pin has been grounded. This contention will cause excessive supply current, and may violate the USB power specifications.”

Auf Deutsch:
Alle Handshake-Ausgänge (hier DTR und CTS) des CP2102 (auch FTDI232 und CH340G) sind richtige Digitalausgänge - KEINE OPEN-COLLECTOR !
Im inaktivem Zustand liegen hier definitive HIGH-Pegel an, was einen PullUp-R eigentlich unnötig macht.

Möchte man aber nun ggf. zusätzlich einen Taster von RESET nach Masse haben, verursacht dieser einen (wenn auch kurzen) Kurzschluss im CP2102 - was das IC ggf. zerstören könnte.

Gleichermaßen ist GPIO0 für weitere Verwendung unbrauchbar - Problem wie vor, wenn dieser Pin als OUT oder auch IN mit mit weiteren Schaltungen (OC) nutzen will.

Es gibt da nun div. Lösungen mit RTS & DTR, bekannteste offensichtlich die auf dem NodeLUA-Boards benutzte Schaltung mit 2 npn-Transistoren. wie z.B. hier diskutiert / gezeigt: Different circuit neeeded for automatic upload using CP210x · Issue #480 · esp8266/Arduino · GitHub - 9. Posting.

Allerdings liest man auch des öfteren, dass das nicht wirklich funktioniert, was mich nicht wundert - denn hier gehen GPIO0 und REST niemals gleichzeitig auf LOW.

Schaltungsvarianten mit Kondensatoren, Dioden u. a., welche nur mittels DTR nicht nur Reset sondern auch zeitversetzt GPIO0 bedienen halte ich für nicht wirklich tauglich, landet der ESP nach "normalem Reset (Monitor) immer im Flash-Modus.

Meine Lösung sieht so aus:
Man entkopple RTS und DTR mittels 2 PNP-Transistoren.
Sind RTS und DTR inaktiv (HIGH), liegen RESET und GPIO0 ganz normal über den PullUps an 3V3 und man kann die Pins auch zusätzlich anderweitig beschalten.
RESET z.B. mit GPIO16 für DeepSleep o. manuellem Reset, bzw. GPIO0 als Aus- oder Eigang (PullDown über OC).
Mit den dargestellten Lötbrücken kann man den “Anschlusstyp” anpassen (Hier für’s Platinenlayout gedacht, damit später keine Leiterbahnkratzerei nötig ist).

Beim Betrieb mit der Ardino IDE löst DTR wie bisher einen normalen Reset aus (was auch der Monitor tut) und RTS versetzt den ESP in den Flash-Modus per UART.

Hast du dir mal die WeMos D1 Mini angeschaut wie die das machen?

Da ist das gleiche “FlipFlop” wie bei NodeLUA.
Mit der o.g. Impulsfolge kann das nicht funzen - es sei denn hier benutzt “man” seitens IDE eine andere.
… die ich (noch) nicht kenne.

Hi TERWI,
ein sehr hilfreicher Beitrag von dir. Möchte den in die Praxis umsetzen und habe dazu ein (kleines ) Problem mit der Implementierung der Schaltung mit den beiden Transistoren.

Ich habe ein NodeMCU von AZ Delivery: https://www.az-delivery.de/products/esp32-developmentboard

Meine Frage: Welche Umsetzung ist richtig?
“DevKitUmbauVariante1.jpg” oder “DevKitUmbauVariante2.jpg”

lg

Zusatz.JPG

esp32_devkitc_v4-sch-20180607a.pdf (72.2 KB)

georg1010:
Ich habe ein NodeMCU von AZ Delivery: https://www.az-delivery.de/products/esp32-developmentboard

Das habe ich auch und ich lade neue Programme, wenn nicht mittels OTA, dann einfach per USB. Mit einem 10 µF Elektrolytkondensator zwischen EN (+ vom Kondensator) und GND (- vom Kondensator) geht das auch ohne Knöpfchendrücken. Wäre das eine Alternative für Dich?