问题发现

最近在做ESP32的LCD和联网功能,发现运行到 phy_init 后就会重启,也就是启动网卡的时候导致重启,原来是因为电压过低导致的复位,开发板电压供电还是不太够。

关于ESP32-D0WD执行到phy_init就重启这件事

phy初始化时导致供电不足,导致把en拉下去了,引起硬件复位。因为rst:0x1 (POWERON_RESET)就是EN拉低复位的意思。
可是我看了看EN是通过10K接在3V3上的,而3V3接的是一个巨胖的100uF mlcc…都100uF了还能被拉低,这也太猛了吧…这不太正常

我在网上查询了ESP32 phy_init导致重启的事件,别说还真有:

1)第一种说法是phy_init时模块功率会比较大,供电不足就会引起电压不稳,导致ESP32的Brownout Detector被触发。

我看了看menuconfig,还真有这设置,默认就勾选了Hardware brownout detector reset,触发电压是2.43V +/- 0.05,可是这和我的情况有些差异。因为终端中提示的是0x1,也就是EN被拉低引起的硬件复位。这说明是掉电了没错,但还不至于触发brownout,因为brownout是软件复位,是0xc,且会在终端看到如下提示(软件复位详见:brownout引起的软件复位):

Brownout detector was triggered
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

我尝试过在phy_init前将bt_tx_power拉到最低了,但是效果不明显…

我用万用表测量单独锂电池供电的情况,3V3电压在3.16-3.19之间摆动,这应该是就是phy_init期间造成的,确实没到ESP32的brownout阈值,因为我的ESP32不是软件复位,那menuconfig的brownout没必要改,改了也无济于事。

2)第二种说法是usb数据线太垃圾了,内阻大,供电能力不足(详见:ESP32 不断重启解决办法)。phy_int启动时较大的功率导致重启。

这种情况解决办法就是换一根好一点的数据线。
我试了下,找了一根拼夕夕送的极短的数据线做为辅助供电,别说,是这么回事,问题解决了。那忽闪忽闪的led稳了,phy_init顺利初始化。看到的是下面的内容:

I (4457) phy_init: phy_version 4860,6b7a6e5,Feb 6 2025,14:47:07I (4522) BT_API: BT enabled
I (4522) BT_AV: controller initialized
I (4838) BT_AV: bluedroid initialized
I (4944) BT_AV: bluedroid enabled

3)第三种说法是ESP32板子天线设计问题,不好匹配网络会导致phy_init期间功率过大。详细可以看这篇帖子:关于ESP32模块天线设计问题

重点来了,进一步分析电路
有意思的部分来了,我的板子还连着一块锂电池,那就考虑锂电池供电这种电压更低的情况。
我用万用表测量单独锂电池供电的情况,3V3电压在3.16-3.19之间摆动,而EN电压在0.84-3.19V之间摆动,我去,这太离谱了吧!说明EN确实是被拉低了,引起ESP32重启。
我仔细看了看我的板子LyratV43的原理图,我去,这上面怎么有这么个破玩意——IMP809REUR/T(2.63V),这是IMP809R系列,属于低电压复位检测器,EN被复位器通过2N7002控制,而复位器检测的就是EN的电压波动,原理图上说的是采用IMP809REUR/T(2.63V),但是到底用的啥得看实际情况。

如果用的是IMP809R,其复位电压是2.63V +/- 2.5%,这很合理,也接近ESP32的brownout阈值;但是如果用的是IMP809T,那他的复位电压就是3.08V +/- 2.5%,那这就太巧了,3.08 * (1 + 2.5%) = 3.157V,我的EN在phy_init期间就在3.16-3.19之间摆动,合理,说明我手里这个乐鑫的LyratV43极有可能使用了T系列低压复位芯片。。。

先看看低压复位芯片的应用,可以看到应用电路中低压复位芯片输出是直接控制mcu的EN,可以用来实现上电自动复位,比如来电自启动之类。

再看看LyratV43原理图,低压复位芯片输出通过两个2N700K间接控制EN,和上述应用一致。所以上电的过程会因为电压缓慢升高而复位一次,后面phy_init期间拉低3V3又会产生一次复位。

对于目前的情况,极大可能是使用了IMP809T这个复位器,考虑误差,会在3.16V附近产生复位。通常电源是稳定的3.3V则不会被phy_init拉到3.16V,可巧的是我这板子用的是1117,大名鼎鼎的“高压差”LDO,测量锂电池供电时1117的输入输出,输入是4.01-4.05V,输出是3.16-3.19V

看了下LyratV43板子的确用的是ST的LD117S33,丝印LD33,规格书是:ST-LD1117S33,让我意外的是规格书称LD1117是低压差,还特意标注了典型值是1V,知道1V对锂电设备意味着什么?简直是灾难啊,3.3V + 1V是4.3V,意味着输入电压至少是4.3V才能稳定输出3.3V,这是不可能做到的,大多数锂电池极限电压是4.2V,就算插入电源,锂电池保护芯片也会将电压限制在4.25V以下,这会使得LD1117的输入永远到不了4.3V,自然输出永远也到不了3.3V了!

LD1117S33 Vi_max很大是15V,Io_max电流800mA,Vd很高是1-1.1V,Iq高达5mA,价格也不便宜。

再看看可供代替的ME6217C33,Vi_max比较小是6.5V,Io_max是800mA,Vd很低是100mV,Iq低至0.1mA,价格也很便宜。这才是真正的低压差LDO!对于LyratV43这种使用microUSB(梯形安卓口)供电,使用锂电池的板子,6.5V输入的LDO完全够了,性能强大还便宜。真搞不懂画电路的人是怎么想的,这破microUSB就是5.0-5.1V,你搞个高压差大静态电流的1117是什么意思?贵就算了,性能还拉跨,1117唯一的优势高输入电压在这里毫无用处

分析到这一步,很明确了:

  • phy_init是会拉低总电源,也仅仅是从3.19V拉到3.16V,仅仅降低了0.03V,问题不大;
  • 低压复位器IMP809T/R仅仅是触发电平高低的问题,就当是灵敏度不同好了,能接受;
  • 而总电源LDO居然用的是极不符合使用场景的LD1117S33,1V的极高压差使得无论是锂电池(通常满电4.1V左右)供电还是USB供电(会经过电源管理芯片不会超过4.2V),都会被消弱到3.2V以下,这对于这类microUSB+锂电的设备来说是致命的。况且LD1117S33不仅仅是高压差这一缺点,还有高静态电流(5mA)这一缺点,这简直是双重打击。

好好好,分析到这里都清楚了,所以解决LyratV43板子蓝牙phy_init期间掉电复位的最佳方式就是把这个破LD1117S33拆下来扔了,换成真正的低压差LDO,比如ME6217C33,100mV的压差,无论是锂电池供电还是micro USB供电都能稳定的输出3.3V。这样哪怕phy_init干掉0.03V,那也有3.27V,完全大于3.16V,不会触发IMP809T的低压复位!,由于我没有ME6217C33,我只有ME6211A33,压差120mV,电流500mA,问题不大。但是要注意ME6211A33的引脚和LD1117S33的引脚有差异,具体是输入输出是反过来的,这里千万要注意,不能直接焊上去。


相关链接(侵删)

  1. 关于ESP32-D0WD执行到phy_init就重启这件事

=================我是分割线=================

欢迎到公众号来唠嗑: