最近接觸一了一個(gè)開源項(xiàng)目,名字叫meshtastic。主要是以LoRa這種擴(kuò)頻通信的方式組建一個(gè)去中心化的網(wǎng)絡(luò)。在中國境內(nèi)的話,估計(jì)比較適合山區(qū),救援等通信場景,畢竟咱們只要不進(jìn)入深山都是可以打電話的。
這個(gè)項(xiàng)目基本上都是使用了ESP32作為主控MCU和LoRa通信模塊來實(shí)現(xiàn)的,其原因在于ESP32的生態(tài)確實(shí)比較好,同時(shí),ESP32具備了藍(lán)牙和WiFi功能,這使得我們可以輕松的通過手機(jī)APP來和設(shè)備的藍(lán)牙通信,打通了去中心化網(wǎng)絡(luò)的用戶界面。另一方面,基于WiFi鏈路,我們可以通過MQTT的服務(wù)將遠(yuǎn)距離的多個(gè)子網(wǎng)絡(luò)連接起來,形成一張大網(wǎng)。
再開始設(shè)計(jì)這個(gè)開源項(xiàng)目的硬件時(shí),首先遇到了程序下載問題,meshtastic項(xiàng)目提供了一個(gè)基于web端的頁面,可以直接調(diào)用串口,對我們的目標(biāo)板進(jìn)行Download。
這確實(shí)是一個(gè)很有意思的事情,web調(diào)用usb設(shè)備要是用Chrome瀏覽器,同時(shí),對于USB 轉(zhuǎn)串口來說,我們需要使用它的DTR和RTS兩個(gè)引腳信號。利用這兩個(gè)引腳產(chǎn)生一個(gè)特殊的時(shí)序,用來激發(fā) ESP32 進(jìn)入 ISP 模式。
串口工具中的 DTR(Data Terminal Ready)和 RTS(Request to Send)是 RS-232C 接口標(biāo)準(zhǔn)中的兩個(gè)引腳,它們分別具有以下含義:
DTR(數(shù)據(jù)終端準(zhǔn)備好):當(dāng)該引腳為高電平時(shí),表示數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))已經(jīng)準(zhǔn)備好進(jìn)行數(shù)據(jù)傳輸。通常,DTR 信號由數(shù)據(jù)終端設(shè)備發(fā)送給串口設(shè)備(如 Modem),以指示串口設(shè)備開始數(shù)據(jù)傳輸。
RTS(請求發(fā)送):當(dāng)該引腳為高電平時(shí),表示數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))請求串口設(shè)備(如 Modem)開始數(shù)據(jù)傳輸。通常,RTS 信號由數(shù)據(jù)終端設(shè)備發(fā)送給串口設(shè)備,以請求啟動數(shù)據(jù)傳輸過程。
總之,DTR 和 RTS 是串口通信中用于控制數(shù)據(jù)傳輸?shù)年P(guān)鍵信號,它們分別表示數(shù)據(jù)終端設(shè)備的準(zhǔn)備狀態(tài)和傳輸請求。通過這兩個(gè)信號,可以實(shí)現(xiàn)數(shù)據(jù)終端設(shè)備與串口設(shè)備之間的協(xié)同工作,完成數(shù)據(jù)傳輸任務(wù)。
在實(shí)際應(yīng)用中,DTR 和 RTS 通常用于實(shí)現(xiàn)全雙工通信,即在同一時(shí)刻,可以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收。當(dāng) DTR 和 RTS 同時(shí)為高電平時(shí),表示數(shù)據(jù)終端設(shè)備準(zhǔn)備好發(fā)送數(shù)據(jù),并請求串口設(shè)備開始接收數(shù)據(jù)。此時(shí),串口設(shè)備收到 RTS 信號后,會啟動數(shù)據(jù)接收過程。
這里簡單說,就是計(jì)算機(jī),也就是我們的上位機(jī)程序,可以控制這兩個(gè)引腳輸出高低電平。
那么,ESP32 若要進(jìn)入 ISP 模式,需要什么的電平和時(shí)序呢?
從官網(wǎng)手冊中查看,選擇 UART Download Boot 模式,這樣直接利用 uart0 進(jìn)行程序下載。這個(gè)模式的進(jìn)入方式就是,我們需要再芯片啟動的時(shí)候,拉低 GPIO0。具體的時(shí)序,官方也給出了規(guī)范,如下圖:
由此,我們可以確定,在芯片的 RST 引腳和 GPIO0 這兩個(gè)引腳上需要什么樣的時(shí)序。
這里,我主要研究了一下下面這個(gè)電路,它同時(shí)兼容了手動下載和自動下載兩種模式,比較方面的兼容了各種不同的下載軟件。
首先,電路圖的左邊比較簡單,就是使用兩個(gè)按鍵的配合,對 ESP32 的下載模式進(jìn)行控制。
然后,他右面的電路就是通過 USB 轉(zhuǎn)串口芯片的 DTR 和 RTS 兩個(gè)引腳進(jìn)行配置,其中 CHIP_PU就是 ESP32 的 EN 引腳,也就是 RST 復(fù)位引腳,而 R7 上端的 0 就是 GPIO0 的網(wǎng)絡(luò)。芯片 2N7002BKS 是一個(gè)雙MOS 管封裝的芯片,通過引腳名稱可以看出,它有兩對 GDS 這樣的MOS 管。
我把他簡化一下來分析
當(dāng) DTR=0,RTS=0 時(shí),此時(shí) Q2 和 Q3 都截止,因此,EN 和 GPIO0 就會走手動下載的邏輯。
當(dāng) DTR=0,RTS=1 時(shí),此時(shí) Q3 導(dǎo)通,Q2 截止,EN 保持外部狀態(tài),GPIO0 則被拉低為 0 。
當(dāng) DTR=1,RTS=0 時(shí),此時(shí) Q2 導(dǎo)通,Q3 截止,EN 被拉低為 0,GPIO0 保持外部狀態(tài)。
當(dāng) DTR=1,RTS=1 時(shí),此時(shí) Q2 和 Q3 都截止,狀態(tài)回歸,都會變成外部保持狀態(tài)。
從時(shí)序圖中看,我們其實(shí)需要 EN 和 GPIO0 同時(shí)拉低的一段,但是從上面的狀態(tài)轉(zhuǎn)移來看,并沒有實(shí)現(xiàn) EN 和 GPIO0 同時(shí)拉低的邏輯。
這里就要看一下電路圖的設(shè)計(jì),我簡化的太多了,以至于把掛在 EN 引腳上的電容給忽略掉了。
有了這個(gè)電容后,默認(rèn)上電后,保持手動模式,此時(shí) GPIO0 和 EN 都被拉高。
我們發(fā)送串口狀態(tài),拉高 DTR = 1,RTS = 0。這時(shí)GPIO0 保持外部狀態(tài),被拉高。EN 就被拉低為 0。這時(shí)候 C10 已經(jīng)被充電。
然后,我們再拉高 RTS = 1,DTR = 0。此時(shí),GPIO0 將被迅速拉低為 0 。但是 EN 引腳不會立刻變?yōu)楦唠娖剑驗(yàn)橛须娙莸拇嬖?,?DTR 為 0 。要想再次變?yōu)楦唠娖叫枰袀€(gè)放電充電過程。
于是,我們就獲得了一個(gè)上升邊沿,且此時(shí) GPIO0 已經(jīng)快速的被拉低為 0 了。