ESP32 自動下載原理分析

01/06 14:18
4638
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

最近接觸一了一個開源項目,名字叫meshtastic。主要是以LoRa這種擴頻通信的方式組建一個去中心化的網(wǎng)絡。在中國境內(nèi)的話,估計比較適合山區(qū),救援等通信場景,畢竟咱們只要不進入深山都是可以打電話的。

這個項目基本上都是使用了ESP32作為主控MCU和LoRa通信模塊來實現(xiàn)的,其原因在于ESP32的生態(tài)確實比較好,同時,ESP32具備了藍牙和WiFi功能,這使得我們可以輕松的通過手機APP來和設備的藍牙通信,打通了去中心化網(wǎng)絡的用戶界面。另一方面,基于WiFi鏈路,我們可以通過MQTT的服務將遠距離的多個子網(wǎng)絡連接起來,形成一張大網(wǎng)。

再開始設計這個開源項目的硬件時,首先遇到了程序下載問題,meshtastic項目提供了一個基于web端的頁面,可以直接調(diào)用串口,對我們的目標板進行Download。

這確實是一個很有意思的事情,web調(diào)用usb設備要是用Chrome瀏覽器,同時,對于USB 轉串口來說,我們需要使用它的DTR和RTS兩個引腳信號。利用這兩個引腳產(chǎn)生一個特殊的時序,用來激發(fā) ESP32 進入 ISP 模式。

串口工具中的 DTR(Data Terminal Ready)和 RTS(Request to Send)是 RS-232C 接口標準中的兩個引腳,它們分別具有以下含義:

DTR(數(shù)據(jù)終端準備好):當該引腳為高電平時,表示數(shù)據(jù)終端設備(如計算機)已經(jīng)準備好進行數(shù)據(jù)傳輸。通常,DTR 信號由數(shù)據(jù)終端設備發(fā)送給串口設備(如 Modem),以指示串口設備開始數(shù)據(jù)傳輸。

RTS(請求發(fā)送):當該引腳為高電平時,表示數(shù)據(jù)終端設備(如計算機)請求串口設備(如 Modem)開始數(shù)據(jù)傳輸。通常,RTS 信號由數(shù)據(jù)終端設備發(fā)送給串口設備,以請求啟動數(shù)據(jù)傳輸過程。

總之,DTR 和 RTS 是串口通信中用于控制數(shù)據(jù)傳輸?shù)年P鍵信號,它們分別表示數(shù)據(jù)終端設備的準備狀態(tài)和傳輸請求。通過這兩個信號,可以實現(xiàn)數(shù)據(jù)終端設備與串口設備之間的協(xié)同工作,完成數(shù)據(jù)傳輸任務。

在實際應用中,DTR 和 RTS 通常用于實現(xiàn)全雙工通信,即在同一時刻,可以實現(xiàn)數(shù)據(jù)的發(fā)送和接收。當 DTR 和 RTS 同時為高電平時,表示數(shù)據(jù)終端設備準備好發(fā)送數(shù)據(jù),并請求串口設備開始接收數(shù)據(jù)。此時,串口設備收到 RTS 信號后,會啟動數(shù)據(jù)接收過程。

這里簡單說,就是計算機,也就是我們的上位機程序,可以控制這兩個引腳輸出高低電平。

那么,ESP32 若要進入 ISP 模式,需要什么的電平和時序呢?

從官網(wǎng)手冊中查看,選擇 UART Download Boot 模式,這樣直接利用 uart0 進行程序下載。這個模式的進入方式就是,我們需要再芯片啟動的時候,拉低 GPIO0。具體的時序,官方也給出了規(guī)范,如下圖:

由此,我們可以確定,在芯片的 RST 引腳和 GPIO0 這兩個引腳上需要什么樣的時序。

這里,我主要研究了一下下面這個電路,它同時兼容了手動下載和自動下載兩種模式,比較方面的兼容了各種不同的下載軟件。

首先,電路圖的左邊比較簡單,就是使用兩個按鍵的配合,對 ESP32 的下載模式進行控制。

然后,他右面的電路就是通過 USB 轉串口芯片的 DTR 和 RTS 兩個引腳進行配置,其中 CHIP_PU就是 ESP32 的 EN 引腳,也就是 RST 復位引腳,而 R7 上端的 0 就是 GPIO0 的網(wǎng)絡。芯片 2N7002BKS 是一個雙MOS 管封裝的芯片,通過引腳名稱可以看出,它有兩對 GDS 這樣的MOS 管。

我把他簡化一下來分析

當 DTR=0,RTS=0 時,此時 Q2 和 Q3 都截止,因此,EN 和 GPIO0 就會走手動下載的邏輯。

當 DTR=0,RTS=1 時,此時 Q3 導通,Q2 截止,EN 保持外部狀態(tài),GPIO0 則被拉低為 0 。

當 DTR=1,RTS=0 時,此時 Q2 導通,Q3 截止,EN 被拉低為 0,GPIO0 保持外部狀態(tài)。

當 DTR=1,RTS=1 時,此時 Q2 和 Q3 都截止,狀態(tài)回歸,都會變成外部保持狀態(tài)。

時序圖中看,我們其實需要 EN 和 GPIO0 同時拉低的一段,但是從上面的狀態(tài)轉移來看,并沒有實現(xiàn) EN 和 GPIO0 同時拉低的邏輯。

這里就要看一下電路圖的設計,我簡化的太多了,以至于把掛在 EN 引腳上的電容給忽略掉了。

有了這個電容后,默認上電后,保持手動模式,此時 GPIO0 和 EN 都被拉高。

我們發(fā)送串口狀態(tài),拉高 DTR = 1,RTS = 0。這時GPIO0 保持外部狀態(tài),被拉高。EN 就被拉低為 0。這時候 C10 已經(jīng)被充電。

然后,我們再拉高 RTS = 1,DTR = 0。此時,GPIO0 將被迅速拉低為 0 。但是 EN 引腳不會立刻變?yōu)楦唠娖剑驗橛须娙莸拇嬖?,?DTR 為 0 。要想再次變?yōu)楦唠娖叫枰袀€放電充電過程。

于是,我們就獲得了一個上升邊沿,且此時 GPIO0 已經(jīng)快速的被拉低為 0 了。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

多年硬件從業(yè)經(jīng)驗,專注分享從研發(fā)到供應鏈,再到精益制造過程中的經(jīng)驗和感悟!