8

[每日电路图] 12、带自动烧写能力的 ESP8266 开发板制作

 3 years ago
source link: http://www.cnblogs.com/zjutlitao/p/14353305.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

目录

前言

ESP8266 是乐鑫公司面向物联网应用的高性价比、高度集成的 WiFi MCU。乐鑫靠这颗芯片扭转了 WiFi SOC 的市场格局,甚至加速了国内智能家居产业的爆发。也因此乐鑫上市科创板受投资者看好,目前总市值达106.04亿人民币(最近一年下跌,购买需谨慎)。本文介绍如何用 KiCad 设计一个 ESP8266 最小开发板。

1、芯片先关信息

  • ESP8266EX 集成了 32 位 Tensilica 处理器、标准数字外设接口、天线开关、射频 balun、功率放大器、低噪放大器、过滤器和电源管理模块等,仅需很少的外围电路,可将所占 PCB 空间降低。
  • ESP8266EX 专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了超低功耗。ESP8266EX 具有的省电模式适用于各种低功耗应用场景。
  • ESP8266EX 内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,支持实时操作系统 (RTOS) 和 Wi-Fi 协议栈,可将高达 80% 的处理能力留给应用编程和开发。

bUNfiiA.png!mobile

2、原理图介绍

我们这里直接采用 ESP-12F 模块来设计开发板,会简单不少,原理图如下:

FBZrqiY.png!mobile

2.1 供电电路

供电采用 ASM1117-3.3,能够将USB的 5V 转 3.3V。除此之外,我还用了一个 ASM1117-5.0 来产生 5V 的稳压,供其他外围电路使用(如舵机、马达等)。该芯片的参数如下:

jyEJB3Q.png!mobile

常用封装:

RfUrmy2.png!mobile

2.2 串口电路

ESP8266 烧写和调试一般都是用串口的,因此我们开发板上需要集成一个串口电路,选择一颗比较便宜的:CH340。其典型电路:

ZVryy2Y.png!mobile

典型封装为:SSOP-20

NFrUfmy.png!mobile

我们使用的电路没有那么复杂,只要电源部分加个滤波,RX 和 TX 各串一个470R 的电阻(这颗芯片偏大,还有更小一些的国产串口芯片,也非常好用)。

2.3 自动烧写电路

ESP8266工作模式

  • 下载模式:芯⽚启动时,若 IO0 为低电平,芯⽚会进⼊下载模式;
  • 运⾏模式:芯⽚启动时,若 IO0 为⾼电平,芯⽚会进⼊运⾏模式;

ZVVv6vy.png!mobile

上图的逻辑关系如下:

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

显然,这种逻辑关系下 EN 和 IO0 不可能同时为 0

然而,ESP8266 进入下载模式却需要如下条件:

  • EN = 0,IO0 = 0,ESP8266 芯片掉电复位;
  • EN = 1,IO0 = 0,保持 IO0 为低电平重新上电

此时要看下 esp8266 的下载烧录脚本(esptool.py):

def _connect_attempt(self, mode='default_reset', esp32r0_delay=False):
        """ A single connection attempt, with esp32r0 workaround options """
        # esp32r0_delay is a workaround for bugs with the most common auto reset
        # circuit and Windows, if the EN pin on the dev board does not have
        # enough capacitance.
        #
        # Newer dev boards shouldn't have this problem (higher value capacitor
        # on the EN pin), and ESP32 revision 1 can't use this workaround as it
        # relies on a silicon bug.
        #
        # Details: https://github.com/espressif/esptool/issues/136
        last_error = None

        # If we're doing no_sync, we're likely communicating as a pass through
        # with an intermediate device to the ESP32
        if mode == "no_reset_no_sync":
            return last_error

        # 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
            self._setRTS(True)   # EN=LOW, chip in reset
            time.sleep(0.1)
            if esp32r0_delay:
                # Some chips are more likely to trigger the esp32r0
                # watchdog reset silicon bug if they're held with EN=LOW
                # for a longer period
                time.sleep(1.2)
            self._setDTR(True)   # IO0=LOW
            self._setRTS(False)  # EN=HIGH, chip out of reset
            if esp32r0_delay:
                # Sleep longer after reset.
                # This workaround only works on revision 0 ESP32 chips,
                # it exploits a silicon bug spurious watchdog reset.
                time.sleep(0.4)  # allow watchdog reset to occur
            time.sleep(0.05)
            self._setDTR(False)  # IO0=HIGH, done

        for _ in range(5):
            try:
                self.flush_input()
                self._port.flushOutput()
                self.sync()
                return None
            except FatalError as e:
                if esp32r0_delay:
                    print('_', end='')
                else:
                    print('.', end='')
                sys.stdout.flush()
                time.sleep(0.05)
                last_error = e
        return last_error

其中:

  • 利用 RTS 控制 EN 或 nRST,因为它们都是低电平触发芯片复位;
  • 利用 DTR 控制 IO0,低电平启动则进入下载模式;
# ie True = pin @ 0V, False = pin @ VCC.

注意,此处 True 为低电平,False 为高电平

程序解析如下:

self._setDTR(False)  # IO0=HIGH
self._setRTS(True)   # EN=LOW, chip in reset

.

设置 DTR = 1,RTS = 0,此时 Q1 导通,Q2 截止,EN = RTS = 0,IO0 = 1,芯片掉电复位;

time.sleep(0.1)

延时 100ms,为了确保 EN 为低电平,因为 EN 附近有一个 RC 电路,充放电都是需要时间的。

IBNreab.png!mobile

例如低电平为 0.25VCC,则由高电平放电至低电平需要的时间可按如下公式计算:

QfIb2qu.png!mobile

此处,t ≈ 0.29ms,延时 100ms 绰绰有余

self._setDTR(True)   # IO0=LOW
self._setRTS(False)  # EN=HIGH, chip out of reset

.

设置 DTR = 0,RTS = 1,此时 Q1 截止,Q2 导通,EN = 1,IO0 = 0,芯片重新上电,由于 IO0 为低电平,芯片进入下载模式;

time.sleep(0.05)

延时 50ms,为了确保 EN 为高电平:(高电平认为 0.75V,用上面公式计算,t ≈ 1.39ms,延时 50ms 绰绰有余)

self._setDTR(False)  # IO0=HIGH, done

设置 DTR = 1,RTS = 1,此时 Q1 导通,Q2 导通,EN = 1,IO0 = 1,确保下载完成后再复位芯片正常运行。

补充一下,不点击下载按钮的话,实际测试 DTR 和 RTS 均为高电平,也就是说不会影响 ESP8266 芯片的正常运行。

3、PCB 效果展示

n2aMFvi.png!mobile

a6Vvqa.png!mobile

附录

: 希望这个简单的小 DEMO 能帮助你快速上手画 ESP8266 最新开发板 ~ 后续还有更多实用 IoT 技术文章~

uQFRb2f.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK