[每日電路圖] 12、帶自動燒寫能力的 ESP8266 開發板製作

beautifulzzzz發表於2021-01-31


前言

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% 的處理能力留給應用程式設計和開發。


2、原理圖介紹

我們這裡直接採用 ESP-12F 模組來設計開發板,會簡單不少,原理圖如下:


2.1 供電電路

供電採用 ASM1117-3.3,能夠將USB的 5V 轉 3.3V。除此之外,我還用了一個 ASM1117-5.0 來產生 5V 的穩壓,供其他外圍電路使用(如舵機、馬達等)。該晶片的引數如下:

常用封裝:


2.2 串列埠電路

ESP8266 燒寫和除錯一般都是用串列埠的,因此我們開發板上需要整合一個串列埠電路,選擇一顆比較便宜的:CH340。其典型電路:

典型封裝為:SSOP-20

我們使用的電路沒有那麼複雜,只要電源部分加個濾波,RX 和 TX 各串一個470R 的電阻(這顆晶片偏大,還有更小一些的國產串列埠晶片,也非常好用)。


2.3 自動燒寫電路

ESP8266工作模式

  • 下載模式:芯⽚啟動時,若 IO0 為低電平,芯⽚會進⼊下載模式;
  • 運⾏模式:芯⽚啟動時,若 IO0 為⾼電平,芯⽚會進⼊運⾏模式;

上圖的邏輯關係如下:

  • 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 電路,充放電都是需要時間的。

例如低電平為 0.25VCC,則由高電平放電至低電平需要的時間可按如下公式計算:

此處,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 效果展示


附錄

[1]. 樂鑫官網
[2]. CSDN ESP8266 自動燒錄原理分析


: 希望這個簡單的小 DEMO 能幫助你快速上手畫 ESP8266 最新開發板 ~
後續還有更多實用 IoT 技術文章~

相關文章