# ESP32-CAM will not upload: GPIO 0, FTDI wiring and reset

> Fix an ESP32-CAM that fails to upload: GPIO 0 to ground during upload, TX and RX crossed, a stable 5 V supply and pressing reset.

Canonical: https://roboticsengineering.in/fix/esp32-cam-wont-upload-gpio0-ftdi/ | Published: 2026-11-03 | Updated: 2026-11-04

**The ESP32-CAM has no USB chip on many boards, so upload needs an adapter, GPIO 0 held to ground and a steady 5 V supply.** Follow the order below.

## What the message means

To flash the chip it must start in download mode, which needs GPIO 0 low at reset. An external USB-serial adapter provides the link. Power is a common weak point.

## Fix it in this order

1. Connect the adapter: adapter TX to the board U0R (RX), adapter RX to the board U0T (TX), and ground to ground.
2. Power the board with 5 V that can supply enough current. The adapter 3.3 V pin is usually too weak.
3. Connect GPIO 0 to ground, then press the reset button to enter download mode, and start the upload.
4. After the upload finishes, remove GPIO 0 from ground and press reset to run the sketch.
5. Choose the AI Thinker ESP32-CAM board in the Arduino IDE if that is your module.
6. If it still fails, see the failed to connect page and the camera init page.

## Why it happens

The ESP32-CAM has no USB chip, so upload needs an FTDI adapter and a boot-mode step. GPIO 0 must be connected to GND while the board resets so it enters the upload mode, and the board needs a supply that can give enough current.

Connect GPIO 0 to GND, press the reset button, start the upload, then remove the jumper and reset again to run the sketch. Cross TX and RX between the adapter and the board, and power from 5 V.

## If you see this, do this

| You see | Do this |
| --- | --- |
| Connecting dots forever | GPIO 0 not low, or TX and RX crossed wrongly. |
| Resets during upload | Weak power. Use a better 5 V supply. |

## Related

[ESP32 failed to connect](https://roboticsengineering.in/fix/esp32-failed-to-connect-timed-out-waiting-for-packet-header/), [camera init failed](https://roboticsengineering.in/fix/esp32-camera-init-failed-0x105/), [ESP32-CAM vision streaming](https://roboticsengineering.in/esp32-cam-robot-vision-streaming/).

Last reviewed: November 2026. These are the usual causes and the order that finds them fastest. Test on your own board; clones and cables differ.

## Why this happens

The ESP32 starts in download mode when GPIO 0 is held low during reset. Many ESP32-CAM boards have no USB-serial chip, so the upload runs through an external adapter on the U0R and U0T pins, and you have to create the boot conditions yourself with a jumper. If GPIO 0 is not low at the moment of reset, the chip runs its old program and ignores the upload.

The second common cause is power. The camera, the radio and the processor draw current in bursts of several hundred milliamps, and an adapter’s 3.3 V pin or a weak USB port cannot supply it. The voltage sags, the board resets in the middle of the upload, and the tool reports a timeout or a failed connection.

## How to confirm the cause

- Check each wire against the list: adapter TX to U0R, adapter RX to U0T, adapter GND to GND, 5 V to the 5 V pin, and GPIO 0 to GND for upload.
- Set the adapter’s logic level to 3.3 V if it has a selector.
- Measure the 5 V pin and the 3.3 V pin on the board while the upload starts. A big dip means weak power.
- Watch the serial output after reset with GPIO 0 grounded. A message that says waiting for download means the chip is in the right mode.
- Use a slower upload speed in the IDE, such as 115200.

## Worked example

The sequence, step by step, for an adapter and the AI Thinker board selected in the IDE:

```
Wires:  adapter TX  -> U0R
        adapter RX  -> U0T
        adapter GND -> GND
        5 V supply  -> 5V
        GPIO0       -> GND  (jumper, for upload only)

1. Press RESET with the jumper in place.
2. Click Upload; wait for 100 percent.
3. Remove the jumper from GPIO0.
4. Press RESET to run the sketch.
5. Open the monitor at 115200 baud.
```

## Common mistakes

- Joining TX to TX and RX to RX.
- Leaving the jumper on after the upload, so the board stays in download mode.
- Powering from the adapter’s 3.3 V pin.
- Forgetting to press reset after placing the jumper.
- Selecting a board type that does not match the module.

## If this did not fix it

- A brownout or reset loop from a weak supply; add a bulk capacitor at the 5 V input.
- GPIO 12 held high at boot, which can stop the board from starting.
- A damaged USB-serial adapter or a bad cable.
