ESP32/8266 timed out waiting for packet header与自动下载原理

一、自动下载原理

esp32代码最常用的下载方式是通过串口,也就是TXD和RXD。但只有这两个线还不能完成自动下载。因为需要想办法让esp32进入下载启动模式,而进入下载启动模式的方法是让系统重启,重启时GPIO0和GPIO2保持低电平,这个在官方的文档中有说明。
在这里插入图片描述
关于自动reset和自动拉低就需要借用串口的流控,RTS和DTR。流控本身不是给我们用来自动下载代码用的,但是因为可以修改他们的功能,所以就可以人为的控制它们的时序,变成类似普通gpio的功能。官方给出的电路是这样的:
ESP32 Pico kit v4.1 的自动下载电路如下:
ESP32 Pico kit v4.1

具体三极管原理就不分析了,直接看真值表就可以。可以先给EN一个低电平的脉冲,让系统重启,同时在EN拉高的瞬间让IO0和IO2拉低,这样就能让系统进入下载启动模式。这样似乎完美的解决了自动下载的问题。

二、下载模式时序

ESP8266/ESP32进入下载模式的条件很简单:
EN(也称为RST)上升沿时候GPIO0保持为低电平,如图所示。
在这里插入图片描述

三、问题

但是在实际使用中,我经常会遇到自动下载超时的问题,同一批主板有一些可以自动下载,有一些不可以,ESP8266可以,ESP32不可以;在有些电脑上可以,在有些电脑不可以。不过当时也没有太在意,毕竟工程中可以通过在IO0上接一个对地的按键,下载时按着按键就可以了。

四、分析及解决方法

分析

分析一下esptool.py里下载相关的代码

	# 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信号连接在一个电容充放电电路上。
在这里插入图片描述
CHIP_PU即EN,代码中23阶段之后会延时一段时间,而EN由于电容充电,电平并不会立马变为高电平,而是缓慢上升,以如上参数为例计算,同时参考芯片电气参数特性
在这里插入图片描述
高电平为0.75VDD,则达到高电平按照如下公式计算:

在这里插入图片描述

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

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

以上方法未验证

解决方法二(推荐)

在vscode 中安装PlatformIO IDE插件。

在这里插入图片描述
原因未知,可能是PlatformIO IDE安装了什么驱动,只要安装了PlatformIO IDE之后即使卸后,依然可以自动下载。参考https://forum.arduino.cc/t/esp-8266-timed-out-waiting-for-packet-header/597634
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值