作者:ZeroGrid實驗室
🎯 本篇目標
- 數據闢謠:SX1262 到底多耗電?RX 5mA vs Sleep 160nA 的巨大鴻溝。
- 指令解密:深入解析
SetSleep的位元操作,什麼是 Retention RAM? - 喚醒機制:為什麼睡眠時晶片是「聾」的?如何用 NSS 的下降緣 (Falling Edge) 叫醒它?
- 實驗驗證:不靠昂貴的電流鉤表,用程式邏輯證明「暖啟動」是否成功。
1. 前言:IoT 的宿命是等待
如果你的 LoRa 裝置是用電池供電的(例如 18650 或鈕扣電池),你必須認清一個殘酷的現實:裝置 99% 的時間都必須在睡覺。
我們來看看 SX1262 的三種狀態電流對比:
- RX (接收模式):約 5 ~ 8 mA。
- (取決於是否開啟 DC-DC Converter)。
- TX (發射模式):約 118 mA (典型值 @ +22dBm)。
- 系統設計通常會預留到 140mA 以策安全。
- Sleep (睡眠模式):160 nA (0.00016 mA)。
160 nA 是什麼概念?它比接收模式省電 30,000 倍。 掌握睡眠模式,是你的產品能用「天」計算壽命,還是用「年」計算壽命的關鍵分水嶺。
2. 深入底層:怎麼睡進去? (Enter Sleep)
SX1262 不會自己睡著,MCU 必須透過 SPI 發送指令 0x84 (SetSleep) 強制它去睡。 這個指令後面必須跟著一個 Byte 的設定值:SleepConfig。
很多開發者只知道填 0x00 或 0x04,卻不知道背後的意義。讓我們拆解這個 Byte:
SleepConfig Byte 解析
- Bit 2: Warm Start (暖啟動控制) —— 這是最關鍵的位元!
- 設定為 1 (0x04):保留記憶模式。晶片進入睡眠,但保留 Retention RAM 的供電。這意味著你的頻率設定、擴頻因子 (SF)、Sync Word 等參數都會被鎖在記憶體裡。醒來後可以直接發射,無需重新初始化。
- 設定為 0 (0x00):斷電重置模式。晶片完全斷電(除了喚醒電路)。醒來後,所有暫存器變回原廠預設值,你必須重新跑一次初始化流程 (
Init)。
- Bit 0: Wake Up RTC (RTC 喚醒)
- 設定為 1:使用晶片內部的 Timer 定時喚醒。
- 設定為 0:停用內部 Timer,完全依賴外部 MCU 叫醒它 (最省電)。
實驗室建議設定
我們通常使用 Warm Start (0x04)。 因為 LoRa 參數配置很繁瑣,保留記憶可以讓裝置在喚醒後 0.5ms 內 就準備好發射,大幅降低喚醒過程的功耗。
💻 代碼邏輯:SetSleep
C
// 讓 SX1262 進入睡眠
// is_warm_start: 決定是否保留暫存器設定
void SX1262_SetSleep(bool is_warm_start) {
// 構造 Config Byte
// 如果是暖啟動,Bit 2 設為 1 (0x04)
// 如果是冷啟動,Bit 2 設為 0 (0x00)
uint8_t sleep_config = is_warm_start ? 0x04 : 0x00;
// 發送指令 0x84
SX1262_WriteCmd(0x84, &sleep_config, 1);
}
3. 物理機制:怎麼醒過來? (Wake Up)
這部分是新手最容易卡關的地方。 請記住:在睡眠模式下,SX1262 的 SPI 介面是「聾」的。
晶片內部的數位電路時脈 (Clock) 已經停止,它無法解讀你送過來的 SPI 指令(MOSI/SCK 對它來說只是無意義的電位跳動)。
喚醒的唯一途徑:NSS 下降緣
Datasheet 明確指出:"The chip wakes up from Sleep mode when the NSS pin is driven low."
晶片內部保留了一個極低功耗的類比電路,專門監控 NSS (Chip Select) 腳位。當它偵測到 NSS 從 High 變成 Low (Falling Edge) 時,會觸發電源管理單元 (PMU) 重啟主振盪器 (RC Oscillator)。
標準喚醒時序 (Sequence)
- 拉低 NSS (Drive Low):MCU 將 CS 腳位拉低。
- 保持 (Hold):雖然 Datasheet 說瞬間即可,但為了訊號穩定,建議保持 Low 至少 20~50µs。
- 釋放 NSS (Release):將 CS 拉回 High。
- 等待忙碌訊號 (Wait BUSY):這是最重要的一步。 晶片醒來後,需要時間啟動 LDO、校正 RC 振盪器。這段期間 BUSY 腳位會保持 High。 MCU 必須死盯著 BUSY 腳位,直到它變回 Low,才能發送下一道指令(例如
SetRx)。
💻 代碼實作:Wakeup
C
void SX1262_Wakeup(void) {
// 1. 物理敲門:產生 NSS Falling Edge
gpio_put(PIN_CS, 0);
// 保持一下,確保觸發內部喚醒電路
sleep_us(100);
// 釋放
gpio_put(PIN_CS, 1);
// 2. 等待起床氣:晶片初始化期間 BUSY 會是 High
// 必須等到 BUSY 變 Low 才能繼續操作
SX1262_WaitBusy();
// 醒來後,晶片預設處於 RC Standby 模式
}
4. 韌體架構:如何安全地入睡?
寫程式不能只管驅動層,應用層的邏輯更重要。 如果你的 MCU 還有背景任務(例如每 60 秒發送一次心跳包或感測器數據),你必須確保在晶片睡覺時,這些任務絕對不能去動 SPI。
否則,當時間一到,背景任務嘗試發送 SPI 指令時,會發生兩個災難:
- 喚醒失敗:因為沒有照標準喚醒流程,指令被晶片吃掉。
- 通訊錯亂:晶片被意外的 SPI 訊號吵醒,處於不穩定的狀態。
狀態機保護機制 (State Machine Protection)
- 定義狀態旗標:在主程式中,你需要一個變數來記錄目前的 RF 狀態(例如
Idle,Tx,Rx,Sleep)。 - 鎖定背景任務: 當使用者下達
/sleep指令時,將狀態旗標切換為 Sleep Mode。 在主迴圈 (main loop) 中,執行背景任務前必須先檢查這個旗標:
如果系統處於 Sleep Mode,則跳過所有週期性發送任務(如 Heartbeat、Beacon)。
這樣能確保 MCU 尊重晶片的睡眠時間,直到使用者手動喚醒為止。
5. 實驗驗證:如何證明記憶還在?
很多工程師問:「我怎麼知道 記憶保持 (Warm Start) 真的有效?也許晶片其實重置了,只是我不知道?」
我們不需要昂貴的電流鉤表,只要利用 暫存器殘留值 就能證明。 SX1262 有一個同步字暫存器 0x0740 (Sync Word MSB),原廠預設值是 0x14。
🧪 實驗 A:暖啟動測試 (Warm Start)
- 竄改記憶:使用指令將 Sync Word 改為
0x33。 - 指令:
/reg write 0740 33
- 指令:
- 保留記憶睡眠:發送指令讓晶片進入 Warm Sleep (0x04)。
- 指令:
/sleep warm
- 指令:
- 喚醒晶片:觸發 NSS 喚醒序列。
- 指令:
/wake
- 指令:
- 檢查記憶:讀取
0x0740的值。 - 指令:
/reg read 0740 - 結果驗證:如果讀回來是 0x33,代表記憶體在睡眠期間有持續供電,暖啟動成功!
- 指令:
🧪 實驗 B:冷啟動測試 (Cold Start)
- 竄改記憶:同樣將 Sync Word 改為
0x33。 - 斷電睡眠:發送指令讓晶片進入 Cold Sleep (0x00)。
- 指令:
/sleep cold
- 指令:
- 喚醒晶片:觸發 NSS 喚醒序列。
- 檢查記憶:讀取
0x0740的值。 - 結果驗證:讀回來會變回原廠預設值 0x14。這證明晶片經歷了 Reset,所有設定都遺失了。
下一課預告
我們現在學會了怎麼讓晶片「秒睡秒醒」。 但在它醒來開始發射訊號的那一瞬間 (SetTx),如果功率直接從 0 跳到 22dBm,會在頻譜上產生一個巨大的「突波 (Glitch)」,干擾隔壁頻道的通訊,甚至損壞功率放大器。
下一篇 #9 射頻的細節,我們將探討 PA Ramping (功率爬升時間) 的設定,以及如何設定 Rx Timeout 來防止接收死鎖,這是讓你的裝置從「能用」變成「專業」的最後一哩路。















