经典深度分析!ESP8266/ESP32自动下载电路究竟是如何巧妙实现的

8853e365ee4f0052a846d8ec319a5be4.jpeg

背景

前一段时间需要自己制作一片ESP32单板,成本和封装考虑,计划选择CH340E作为USB转串口芯片,ESP8266/ESP32的单板一般都有自动下载电路,用户无需按钮即可令单板自动进入下载模式实现固件烧录,然而自动下载电路需要串口芯片支持DTR和RTS,CH340E却只有RTS信号,没有DTR信号,于是研究学习了一下自动下载电路的原理,准备用一些奇淫技巧解决CH340E的自动下载问题。

遗憾的是, 目前的中文互联网上,关于ESP8266/ESP32自动下载原理,所有能搜索到的解释大部分都是错误的,差之毫厘,谬以千里,如果随意的假设,自以为是,最终得出的只能是一厢情愿的结论。

下载模式

ESP8266/ESP32进入下载模式[1]的条件很简单:

EN(也称为RST)上升沿时候GPIO0保持为低电平,如下图所示:

123d990c12f573bb42ebed1906708626.png

分析1

下载电路如下所示,其结构与RS触发器比较类似,注意EN和IO0信号均连接在三极管集电极,通过控制三极管只能拉低此信号,若三极管截止,则此信号的状态由其他电路决定(一般来说,此类信号会默认接电阻上拉到VCC)

0681b32abbd68c9838bced9da415c706.png

逻辑关系如下:

DTR = 0; RTS = 0, 此时Q1截止,Q2截止,EN = 1; IO0 = 1
DTR = 0; RTS = 1,此时Q1截止,Q2导通, EN = 1; IO0 = 0
DTR = 1; RTS = 0, 此时Q1导通,Q2截止, EN = 0; IO0 = 1
DTR = 1; RTS = 1, 此时Q1截止,Q2截止, EN = 1; IO0 = 1

真值表:

DTRRSTENIO0
0011
0110
1001
1111

简单总结:当DTR和RTS同时为0或者同时为1时,三极管Q1和Q2均为截止状态,此时EN和IO0的状态由其他电路决定(内部/外部上拉电阻)

当不同时为0或者1时:

EN  = RTS
IO0 = DTR

注意这种逻辑下 EN和IO0是不可能同时为0的,然而进入下载模式则需要如下的序列:

1.  IO = 0; EN = 0
2.  IO = 0; EN 0 -> 1

从逻辑表上看是根本无法正常进入下载模式的,此为疑惑1

分析2

再来继续分析一下esptool.py[2]里下载相关的代码

# issue reset-to-bootloader:
        # RTS = either CH_PD/EN or nRESET (both active low = chip in reset
        # DTR = GPIO0 (active low = boot to flasher)
        #
        # DTR & RTS are active low signals,
        # ie True = pin @ 0V, False = pin @ VCC.
        if mode != 'no_reset':
            self._setDTR(False)  # IO0=HIGH
        1)  self._setRTS(True)   # EN=LOW, chip in reset
            time.sleep(0.1)
        2)  self._setDTR(True)   # IO0=LOW
        3)  self._setRTS(False)  # EN=HIGH, chip out of reset
            time.sleep(0.05)
        4)  self._setDTR(False)  # IO0=HIGH, done

注意True是低电平,False为高电平,另外代码中的setDTR()和setRTS()两条语句之间虽然看上去紧挨着没有延时,然而由于这里是高级语言python,两条语句之间的延时并不能忽略,因此分析的时候必须依次的进行状态分析,以下分为四个阶段依次分析:

  1. 设置DTR = 1; RTS = 0, 此时Q1导通,Q2截止, EN = 0; IO0 = 1

  2. 设置DTR = 0; RTS = 0, 此时Q1截止,Q2截止, EN = 1; IO0 = 1

  3. 设置DTR = 0; RTS = 1, 此时Q1截止,Q2导通, EN = 1; IO0 = 0

  4. 设置DTR = 1; RTS = 1, 此时Q1截止,Q2截止, EN = 1; IO0 = 1

如果按照上面的代码分析来做结论,不论如何系统也是不可能进入下载模式的:EN和IO0首先不可能同时为0,EN由0->1的上升沿IO0也并不为0,再次确认之前的疑惑,那么系统究竟是如何进入下载模式的呢?

答案

问题的答案实际在另外一部分电路,原理其实非常简单:EN信号连接在一个电容充放电电路上

851bf1f605c6697f87acbf8c652eddbf.png

CHIP_PU即EN,代码中2-3阶段之后会延时一段时间,而EN由于电容充电,电平并不会立马变为高电平,而是缓慢上升,以如上参数为例计算,同时参考芯片电气参数特性

4e9ca376c7371f9dc16b5227795a79c5.png

高电平为0.75VDD,则达到高电平按照如下公式计算:

af7ee0c21e55126301f02f3be4dfebaa.png

解得t = 14ms,即EN经过14ms上升到电平1,在实际代码中延时了50ms的等待时间,以确保延时后EN处于电平1的状态

另外需要提的是,阶段1需要等待一段时间,让电容放电,保证EN电平下降到电平0,才能保证系统正常复位,在代码中预留了100ms的等待时间,同样可以通过电容放电公式计算出放电到电平0需要的时间,感兴趣的朋友可以自行根据公式计算确认。

感谢大家,关于ESP32的学习,希望大家Enjoy!

参考资料

[1]

ESP32下载模式: https://www.esp32.com/viewtopic.php?t=5731

[2]

关于esptool下载逻辑: https://github.com/espressif/esptool/issues/136

本文经作者muselab授权原创发表,感兴趣的小伙伴可以关注博客muselab 与 bilibili账号:主音-x

682b586a448788775cdf448e88029081.png

b552e4a840f9828eb1e056975474cd5c.jpeg

3D打印了这个杜邦线理线神器,从此桌面再也不乱了

10c83920995f51cd7668d81ac920c4b1.jpeg

如何做一个炫酷的墨水屏电子钟?

c237c479f4efdce5ec8f5cb27f741a11.jpeg

看似简单的光耦电路,实际使用中应该注意些什么?

ESP8266家庭自动化Google助手4,带电源的继电器(PCB开源) 2层PCB 86 x 100 mm FR-4,1.6 mm,1,带铅的HASL,绿色阻焊剂,白色丝印 说明 ESP8266家庭自动化Google助手4带电源的继电器。 通过Google助手在世界任何地方控制多种设备。 从世界任何地方监视传感器的数据(板上有4个DATA PIN)。 每当我们使用运动传感器进入房间时,就会使家用电器(灯,风扇等)自动化。 每当有人偷偷进入您的房间时,都会在您的手机上获取通知。 您可以使用此板完成许多项目 支持Blynk 组件: ESP8266 12e开发板(NodeMCU) 4 x 5V继电器 4 x 1n4007二极管 4个BC547晶体管 4 x 330ohm电阻 5V电源HLK-PM01 4 x 2针PCB安装螺丝端子 这是如何运作的 该项目借助两个在线平台IFTTT和Adafruit MQTT的帮助。 IFTTT代表“ If This Then That”,它是一个绝佳的平台,我们可以在该平台上通过制作applet合并两个服务。为此,我们需要提供一种条件和一种行动。只要满足特定条件,就会执行该操作。 在IFTTT的帮助下,我正在合并Google Assistant和Adafruit MQTT。我做的小程序有点像 “ 如果Google助手收听了打开风扇的消息,则将数据1发送到Adafruit MQTT。” 因此,这是我使用IFTTT制作的一种小程序,它结合了我的Google Assistant和Adafruit MQTT。现在,Adafruit MQTT如何工作?基本上,MQTT适用于“代理程序客户端发布订阅”方法,在该方法中,客户端被订阅到代理程序上的一个主题。该主题中的任何数据更改都将反映到该代理中连接到该同一主题的所有设备。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值