最近接觸一了一個開源項目,名字叫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 了。