Forum: Mikrocontroller und Digitale Elektronik Automatische Programmierung mit esptool ohne manuellen Reset


von Karsten W. (lsmod)


Angehängte Dateien:

Lesenswert?

Es kann sein das zu dieser Frage bereits ein Thread existiert, der 
einfach übersehen worden ist.

Gibt es eine funktionierende Lösung um einen ESP8266 (12-F) zu 
programmieren, ohne manuelle Buttons für Flash (GPIO0) und Reset zu 
benutzen?
Ich habe hier ein paar CH340G Adapter bei denen ich nun RTS und DTR 
rausgeführt habe, aber anscheinend liefert weder esptool.py no upload.py 
(Arduino) die notwendige Signal-Reihenfolge dafür.
Es muß ja zuerst Flash auf Low gezogen werden und danach Reset Low-High 
und abschließend Flash auf High gehen.

Schaut man sich den Signalverlauf an der mit den Python-Programmen 
erzeugt wird, ist nur entweder RTS oder DTR auf Low.
Kanal 1 ist DTR und Kanal 2 ist RTS.
Ansteuerung unter Linux mit
1
python3 esptool.py --port /dev/ttyUSB0 flash_id

Selbst die Schaltung vom NODEMCU-DEVKIT kann diese Signalfolge so 
eigentlich nicht erzeugen.

Hier hat jemand etwas 2017 dazu geschrieben, was jedoch mit einer 
neueren Version von esptool.py (3.3) nicht überein zu stimmen scheint.
https://forum.arduino.cc/t/esp8266-dtr-rts-fur-automatischen-upload/429400/2

Wo ist also der Trick, außer das esptool.py zu patchen?

: Bearbeitet durch User
von Karsten W. (lsmod)


Angehängte Dateien:

Lesenswert?

Selbst hier wird es so dargestellt, als ob RTS einfach mit Reset und DTR 
mit GPIO0/Flash zu verbinden ist:
http://arduino.esp8266.com/Arduino/versions/2.0.0/doc/boards.html#generic-esp8266-modules

Im esptool.py stellt es sich so dar:
1
    def bootloader_reset(self, usb_jtag_serial=False, extra_delay=False):
2
        """ Issue a reset-to-bootloader, with USB-JTAG-Serial custom reset sequence option
3
        """
4
        # RTS = either CH_PD/EN or nRESET (both active low = chip in reset)
5
        # DTR = GPIO0 (active low = boot to flasher)
6
        #
7
        # DTR & RTS are active low signals,
8
        # ie True = pin @ 0V, False = pin @ VCC.
9
        if usb_jtag_serial:
10
            # Custom reset sequence, which is required when the device
11
            # is connecting via its USB-JTAG-Serial peripheral
12
            self._setRTS(False)
13
            self._setDTR(False)  # Idle
14
            time.sleep(0.1)
15
            self._setDTR(True)  # Set IO0
16
            self._setRTS(False)
17
            time.sleep(0.1)
18
            self._setRTS(True)  # Reset. Note dtr/rts calls inverted so we go through (1,1) instead of (0,0)
19
            self._setDTR(False)
20
            self._setRTS(True)  # Extra RTS set for RTS as Windows only propagates DTR on RTS setting
21
            time.sleep(0.1)
22
            self._setDTR(False)
23
            self._setRTS(False)
24
        else:
25
            # This fpga delay is for Espressif internal use
26
            fpga_delay = True if self.FPGA_SLOW_BOOT and os.environ.get("ESPTOOL_ENV_FPGA", "").strip() == "1" else False
27
            delay = 7 if fpga_delay else 0.5 if extra_delay else 0.05  # 0.5 needed for ESP32 rev0 and rev1
28
29
            self._setDTR(False)  # IO0=HIGH
30
            self._setRTS(True)   # EN=LOW, chip in reset
31
            time.sleep(0.1)
32
            self._setDTR(True)   # IO0=LOW
33
            self._setRTS(False)  # EN=HIGH, chip out of reset
34
            time.sleep(delay)
35
            self._setDTR(False)  # IO0=HIGH, done

https://github.com/espressif/esptool/blob/master/esptool/loader.py#L500

: 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.