前言
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 技術文章~