Troubleshooting
Flashing problems can be fiddly to troubleshoot. The underlying issue can be caused by the drivers, OS, hardware, or even a combination of these. If your board is a custom design, check the ESP Hardware Design Guidelines or consider using our free-of-charge schematic and PCB review service.
Try the following suggestions if your issues persist:
Bootloader Won’t Respond
If you see errors like “Failed to connect” then your chip is probably not entering the bootloader properly:
Check you are passing the correct serial port on the command line.
Check you have permissions to access the serial port, and other software (such as modem-manager on Linux) is not trying to interact with it. A common pitfall is leaving a serial terminal accessing this port open in another window and forgetting about it.
Check the chip is receiving 3.3V from a stable power source (see Insufficient Power for more details.)
Check that all pins are connected as described in Boot Mode Selection. Check the voltages at each pin with a multimeter, “high” pins should be close to 3.3V and “low” pins should be close to 0V.
If you have connected other devices to GPIO pins, try removing them and see if esptool starts working.
Try using a slower baud rate (
-b 9600is a very slow value that you can use to verify it’s not a baud rate problem).
Writing to Flash Fails Part Way Through
If flashing fails with random errors part way through, retry with a lower baud rate.
Power stability problems may also cause this (see Insufficient Power.)
Writing to Flash Succeeds but Program Doesn’t Run
If esptool can flash your module with write-flash but your program doesn’t run, check the following:
Wrong Flash Mode
Some devices only support the dio flash mode. Writing to flash with qio mode will succeed but the chip can’t read the flash back to run - so nothing happens on boot. Try passing the -fm dio option to write-flash.
See the SPI Flash Modes page for a full description of the flash modes and how to determine which ones are supported on your device.
Insufficient Power
The 3.3V power supply for the ESP chip has to supply large amounts of current (up to 70mA continuous, 200-300mA peak, might be slightly higher). You also need sufficient capacitance on the power circuit to meet large spikes of power demand.
Insufficient Capacitance
If you’re using a pre-made development board or module then the built-in power regulator & capacitors are usually good enough, provided the input power supply is adequate.
Note
This is not true for some very simple pin breakout modules - similar to this. These breakouts do not integrate enough capacitance to work reliably without additional components. Surface mount OEM modules like ESP-WROOM02 and ESP-WROOM32 require an external bulk capacitor on the PCB to be reliable, consult the module datasheet.
Power Supply Rating
It is possible to have a power supply that supplies enough current for the serial bootloader stage with esptool, but not enough for normal firmware operation. You may see the 3.3V VCC voltage droop down if you measure it with a multimeter, but you can have problems even if this isn’t happening.
Try swapping in a 3.3V supply with a higher current rating, add capacitors to the power line, and/or shorten any 3.3V power wires.
The 3.3V output from FTDI FT232R chips/adapters or Arduino boards do not supply sufficient current to power an ESP chip (it may seem to work sometimes, but it won’t work reliably). Other USB TTL/serial adapters may also be marginal.
Missing Bootloader
ESP-IDF and uses a small firmware bootloader program. The hardware bootloader in ROM loads this firmware bootloader from flash, and then it runs the program. On ESP32-C2, the bootloader image should be flashed by ESP-IDF at offset 0x0.
Refer to ESP-IDF documentation for details regarding which binaries need to be flashed at which offsets.
SPI Pins Which Must Be Disconnected
Compared to the ROM bootloader that esptool talks to, a running firmware uses more of the chip’s pins to access the SPI flash.
If you set “Quad I/O” mode (-fm qio, the esptool default) then GPIOs 7, 8, 9 & 10 are used for reading the SPI flash and must be otherwise disconnected.
If you set “Dual I/O” mode (-fm dio) then GPIOs 7 & 8 are used for reading the SPI flash and must be otherwise disconnected.
Try disconnecting anything from those pins (and/or swap to Dual I/O mode if you were previously using Quad I/O mode but want to attach things to GPIOs 9 & 10). Note that if GPIOs 9 & 10 are also connected to input pins on the SPI flash chip, they may still be unsuitable for use as general purpose I/O.
In addition to these pins, GPIOs 6 & 11 are also used to access the SPI flash (in all modes). However flashing will usually fail completely if these pins are connected incorrectly.
Early Stage Crash
Use any of serial terminal programs to view the boot log. (ESP32-C2 baud rate is 115200bps). See if the program is crashing during early startup or outputting an error message.
Serial Terminal Programs
There are many serial terminal programs suitable for debugging & serial interaction. The pySerial module (which is required for esptool) includes one such command line terminal program - miniterm.py. For more details see the related pySerial documentation or run miniterm -h.
For exact serial port configuration values, see Serial Port Settings.
Tracing Esptool Interactions
Running esptool --trace will dump all serial interactions to the standard output (this is a lot of output). This can be helpful when debugging issues with the serial connection, or when providing information for bug reports.
See the related Advanced Topics page for more information.
Configuration File
Although esptool has been tuned to work in the widest possible range of environments, an incompatible combination of hardware, OS, and drivers might cause it to fail. If you suspect this is the case, a custom configuration of internal variables might be necessary.
These variables and options can be specified in a configuration file. See the related Configuration File page for more information.
Common Errors
This is a non-exhaustive list of the most common esptool errors together with explanations of possible causes and fixes. Before reading any error-specific advice, it is highly recommended to go through all of the Troubleshooting section first.
No serial data received.
Esptool didn’t receive any byte of data or a successful slip packet. This error usually implies some kind of a hardware issue. This may be because the hardware is not working properly at all, the RX/TX serial lines are not connected, or because there is some problem with resetting into the download mode.
Wrong boot mode detected (0xXX)! The chip needs to be in download mode.
Communication with the chip works (the ROM boot log is detected), but it is not being reset into the download mode automatically.
To resolve this, check the autoreset circuitry (if your board has it), or try resetting into the download mode manually. See Manual Bootloader for instructions.
Download mode successfully detected, but getting no sync reply: The serial TX path seems to be down.
The chip successfully resets into the download mode and sends data to the host computer, but doesn’t receive any response sent by esptool. This implies a problem with the TX line running from the host to the ESP device. Double-check your board or breadboard circuit for any problems.
Invalid head of packet (0xXX): Possible serial noise or corruption.
This error is usually caused by one of the following reasons:
Using bad quality USB cable.
Sometimes breadboards can short the SPI flash pins on the board and cause this kind of problem. Try removing your development board from the breadboard.
The chip might be browning out during flashing. FTDI chips’ internal 3.3V regulator is not enough to power an ESP, see Insufficient Power.
Other things to try:
Try to sync and communicate at a much lower baud rate, e.g.
esptool --baud 9600 ....Try tracing the interactions running
esptool --trace ...and see if anything is received back at all.Try skipping chip autodetection by specifying the chip type, run
esptool --chip ESP32-C2 ....
If none of the above mentioned fixes help and your problem persists, please open a new issue.
A serial exception error occurred
esptool uses the pySerial Python module for accessing the serial port.
If pySerial cannot operate normally, it raises an error and terminates.
An example of a pySerial error:
A serial exception error occurred: read failed: [Errno 6] Device not configured
Errors originating from pySerial are, therefore, not a problem with esptool, but are usually caused by a problem with hardware or drivers.
Some of the most common pySerial error causes are:
The port is being already used by other software.
The port doesn’t exist.
The device gets unexpectedly disconnected.
The necessary serial port drivers are not installed or are faulty.
You don’t have permission to access the port.
On Linux, read and write access the serial port over USB is necessary. You can add your user to the dialout or uucp group to grant access to the serial port. See Adding user to dialout or uucp on Linux.
Failed to write to target RAM (result was 0107: Operation timed out)
esptool requires a working and stable serial connection to the target. This connection can be affected by various factors, one of them being the OS drivers.
Some USB-to-Serial drivers exhibit unstable behavior in certain situations. This becomes especially apparent when transferring larger data packets (e.g., uploading the flasher stub or writing to flash).
This specific issue can sometimes be mitigated by:
Using a configuration file to increase esptool internal timeout values (mainly
timeoutandmem_end_rom_timeout).Updating or changing the USB-to-Serial drivers.
Using a different USB-to-Serial adapter.
Shortening the Host–>ESP serial communication path as much as possible (e.g., getting rid of USB hubs, using a shorter properly shielded cable, etc.).
Known Limitations and Issues
This section documents the currently known limitations and issues affecting esptool:
Flash and External Memory Support Limitations
esptool has the following limitations when working with external flash and memory devices:
NAND flash is currently not supported. Only NOR flash chips are supported.
PSRAM access is not supported - esptool cannot read from or write to PSRAM.
Octal (OPI) flash is supported only on ESP32-S3 devices.
Accessing flash chip areas beyond 16MB (32-bit addressing) is supported only if all of the following conditions are met:
The flasher stub is used, as the ROM bootloader does not support 32-bit addressing.
The target chip is ESP32-S3, ESP32-C5, or ESP32-P4.
The flash chip is one of the following supported models:
W25Q256
GD25Q256
XM25QH256D
Secure Download Mode Limitations
When Secure Download Mode is enabled, the available serial protocol commands are restricted. In addition to being unable to read flash data or read/write RAM, the following limitations apply:
The entire flash cannot be erased using
erase-flash. Only flash regions aligned to multiples of4096(flash sector size) can be erased usingerase-region.Writing a binary with purely
0xFFbytes can be used as a workaround to essentially erase flash if necessary, but this is slow and achieves the same result aserase-region.
The baud rate cannot be changed with the
--baudoption on ESP32-C5 and ESP32-C2.Esptool needs to read specific registers to first detect the crystal frequency, which is then used to calculate the baud rate parameter for the
CHANGE_BAUDRATE(0x0F) command. This is not possible in Secure Download Mode, because reading any registers is disabled.The baud rate can be changed manually when using the esptool API by sending the
CHANGE_BAUDRATEcommand with the desired baud rate based on trial and error (e.g., seeing if the data is scrambled or not in a serial terminal program).
Flash write or erase operations might fail with the
0164or0106error codes.This is usually caused by incorrect flash size settings. Since the actual flash size cannot be detected in Secure Download Mode, the ROM bootloader defaults to a flash size of 2MB. Trying to access flash regions larger than 2MB will then fail.
The flash size must be set manually using the
--flash-sizeoption in CLI mode, or by calling theflash_set_parametersfunction when using the esptool API.Esptool prints a warning about this whenever possible.
Accessing SPI flash memory regions larger than 16MB is not possible when Secure Download Mode is enabled.
This is only possible if the flasher stub is used as described in Flash and External Memory Support Limitations, but stub flasher cannot be used in Secure Download Mode.
Any data written beyond the 16MB boundary will wrap around to the beginning of the flash because the 4-byte address gets truncated to 3 bytes.
An application running on the ESP device itself can still access data beyond 16MB (for example, during an OTA update).
It is recommended to only enable the Secure Download Mode if working with <16MB apps, if the app development is successfully finished, or if other ways to update the >16MB regions are available.
Esptool prints a warning about this whenever possible.
See the Supported in Secure Download Mode section for more details.
Secure Boot Limitations
The flasher stub cannot currently be used on ESP32-C3 when Secure Boot is enabled.
This is due to a bug in the ROM bootloader that prevents custom code loaded into RAM from being executed.
Watchdog Reset Limitations
The --after watchdog-reset reset mode mechanism was introduced to help to solve certain situations where the classic DTR/RTS reset lines are not available or not working properly. By its nature, it is a hack (hijacking the RTC WDT to trigger immediately and cause a full system reset).
Since it is not a standard reset mechanism, esptool uses it only when it is safe and beneficial. In other situations, it can be unstable or not available at all:
Works and allows resetting out of download mode when USB-OTG is used for communication.
Disabled on the ESP32-C6 because it can cause a full system freeze requiring a power cycle to recover.
Not available at all on the ESP8266, ESP32, and ESP32-H2 because of hardware limitations.
Cannot be used in Secure Download Mode (SDM).
Can change its behavior between different chip ECO revisions.
Cannot be used to enter the download mode programmatically, the boot strapping pins have to still be physically pulled low.
Leaving Download Mode in USB-Serial/JTAG Mode
If USB-Serial/JTAG is used for communication and the download mode is entered manually (typically by pressing the EN button while holding the Boot button on a DevKit), esptool cannot exit download mode using the default reset behavior.
Specifically, the USB-Serial/JTAG peripheral can only trigger a core reset, which does not re-sample the state of the boot strapping pin. As a result, the state of the boot pin remains sampled as LOW, even if it is physically released, and the chip stays in download mode instead of entering SPI boot mode (which requires the boot pin to be sampled as HIGH).
To automatically leave the download mode, the --after watchdog-reset option must be used. This triggers a full system reset, forcing the boot strapping pins to be re-sampled and allowing normal boot to proceed. This behavior is not enabled automatically, as doing so could introduce the issues described above.
Triggering a system reset manually is as easy as pressing the EN button on the DevKit or power-cycling it.