1
\$\begingroup\$

I have a problem with a custom board.

I have tried to implement the CP2102N with the ESP32-S3-WROOM-1 module and an USB-C port in order to enable auto-download and write directly to the chip via a USB connection.

To be safe I also exposed the GND, 3V3, IO0, TXD0, and RXD0 pins in order to use an external USB-to-UART connector to program the board. However, it seems that I am not able to receive serial data from the ESP32 in any way.

I get a stable 3.3 V by using power from the USB and a linear regulator. Voltage at EN is around 3.3 V and stable. However, I am not able to program the board via USB.

It seems that the CP2102N chip is correctly seen and recognized by Windows. I am able to write to serial and a loopback test (connecting the RXD0 and TXD0 exposed pins) successfully outputs the input. I can also see activity on the ESP32 RXD0 pin, but no activity on the TXD0 pin - indeed, I get a "No serial data received" when running esptool.py -t chip_id.

What is strange is that even by not connecting the USB cable and using an external 3.3 V power supply, I am not able to program the board via the exposed TXD0/RXD0 pins. It seems that either the ESP32 is not responding, or the presence of the CP2102N forces the TXD0 to be constantly at 3.3 V.

Attached you can find the schematics of the USB/CP2102N/ESP32 connection. I tried swapping TXD0 and RXD0, using different cables, power supplies, etc. with no luck.

Schematic of the USB/CP2102N/ESP32 connection

Is anyone able to spot any error in the schematic? Would at least de-soldering the CP2102N help in using the exposed pin to program the chip?

EDIT: I tried to de-solder the CP2102N chip from the board but nothing changes, I am still unable to program the ESP32 with the exposed pins. I even replaced the module with a brand-new one but the behavior remains the same.

\$\endgroup\$
6
  • \$\begingroup\$ Have you confirmed that the ESP32 is successfully put into programming mode (by pulling down IO0 during reset)? \$\endgroup\$
    – StarCat
    Sep 5, 2022 at 14:08
  • \$\begingroup\$ @StarCat I verified the IO0 PIN being low by measuring the voltage and it is actually near 0V. I even put a jumper between GND and IO0 to force boot mode, but no luck. \$\endgroup\$ Sep 5, 2022 at 14:49
  • 1
    \$\begingroup\$ Do not connect a LED or other GND related load to the EN signal. The ESP will probably not start with that. What voltage do you have at the EN pin? \$\endgroup\$
    – Jens
    Sep 5, 2022 at 16:23
  • \$\begingroup\$ Like Jens mentions, what is the EN voltage? I guess you modified the huzzah32 schematic, but maybe forgot to feed the EN pin with 3.3V. If you look at the huzzah schematic, at the top below nr 3, the reset net should have the pull up of 10K with 3.3V and a 1uF cap to arrange a correct sequence for programming (Q2A/Q2B). \$\endgroup\$
    – RemyHx
    Sep 6, 2022 at 16:09
  • 1
    \$\begingroup\$ Blame on me. I forgot to connect the EN pin to the EN connector. I shorted the EN pin to the 3V3 and now programming works good by manually shorting IO0 to ground. \$\endgroup\$ Sep 6, 2022 at 16:18

1 Answer 1

0
\$\begingroup\$

The problem is solved already, but I just want to describe a related issue with this programming interface. Many boards need manual interaction to proper start the download or 1 of N attempts fails.

The typical solution is to add big capacitors between EN and GND, the recommended values range from 1 uF to 10 uF. Many users report too low capacitors on common ESP32 development boards.

The ESP32 reads the GPIO00 status at the rising edge of EN, but the time for the takeover between DTR and RTS is variable. The VCOM driver on the PC side will often send two separate USB frames, one for the DTR change and one for the RTS change. The standard API does not provide a function to change both handshake signals at once. So the timing depends on the capabilities and the load of the operating system. The big capacitor holds EN low to close this gap.

This introduces a design flaw, because a fast falling ESP32 supply will draw current out of the big capacitor via internal protection diodes. A correct design should contain a resistor of e.g. 1 kohm between this capacitor and the EN pin and a diode to VCC to discharge the cap.

The RTS output of the serial interface IC must discharge this big capacitor via one of the two NPN transistors. The discharge current is beyond the capabilities of this IC and introduces stress.

In my ESP32 designs I use pull-up resistors with relative high values from 68 - 75 kohm in combination with a 1 uF capacitor and a dual NPN with prebias resistors like PUMH4,115. No problems so far.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.