作者:ZeroGrid 實驗室
🎯 本篇目標
- 聽覺特訓:分清楚「現在有多吵」(
0x15) 與「剛才那句話有多清楚」(0x14) 的差別。 - 應用指南:給你一張「訊號指標選用表」,告訴你什麼時候看 RSSI,什麼時候看 SNR。
- 空中交通規則:深入理解 LBT (Listen Before Talk) 機制,為什麼它是防碰撞的唯一解?
- ZeroGrid 實戰:結合
/rssi與/jammer,親眼見證你的裝置如何優雅地避開惡意干擾。
1. 前言:雞尾酒派對效應
想像你在一個音樂震耳欲聾的雞尾酒派對。 每個人都在大吼大叫,如果你想跟朋友說話,你會怎麼做?
- 野蠻人做法:不管三七二十一,直接扯開喉嚨吼回去。結果你的聲音跟別人的聲音撞在一起,沒人聽得懂。
- 紳士做法:先側耳傾聽,等到音樂稍歇、或是沒人說話的空檔,再優雅地開口。
在 LoRa 的無線電世界裡,頻譜就是這個派對。 SX1262 必須學會這套「紳士禮儀」——也就是 LBT (發送前先聽)。但在學會禮貌之前,它得先有一雙好耳朵。
2. 聽力檢查:你聽到了什麼?
SX1262 有兩種聽力模式,分別對應兩個至關重要的 SPI 指令。新手往往搞不清楚何時該用哪個,請務必記住這個比喻:
A. 瞬間聽力:GetRssiInst (0x15) —— 「現在這一秒,環境有多吵?」
- 指令代碼:
0x15 - 物理意義:這是當下這一毫秒,天線收到的「總能量」。包含冷氣聲、隔壁的微波爐、還有遠處的車聲。
- 什麼時候用?
- 發射前 (LBT):你想確認現在能不能說話,就要看這個。
- 場地探勘:你想知道這個安裝地點乾不乾淨,就要看這個。
- ZeroGrid 實戰:我們的
/rssi指令就是在呼叫0x15。如果沒人發射它卻很高 (例如 -80dBm),代表這地方「風水不好」,干擾太強。
B. 封包報告:GetPacketStatus (0x14) —— 「剛才那句話,你聽得清楚嗎?」
- 指令代碼:
0x14 - 物理意義:這是在收到一包完整資料後,晶片給你的「聽後報告」。它包含三個關鍵指標:
- RssiPkt (總音量):
- 朋友對你吼的聲音 + 背景音樂聲。
- 注意:如果背景音樂比朋友大聲,這個數值其實是在量背景音樂。
- SnrPkt (清晰度):這是最重要的指標!
- SNR > 0:朋友在你耳邊說話,聲音比背景清楚。
- SNR < 0:LoRa 的黑科技領域。 朋友在派對對面說話,聲音已經被背景音樂蓋過去了 (-10dB 代表雜訊比訊號強 10 倍),但你依然能透過嘴型(編碼特徵)讀懂他在說什麼。
- SignalRssiPkt (還原音量):
當 SNR < 0 時,SX1262 會用數學演算法把雜訊濾掉,推算出朋友喉嚨發出的「真實音量」。
📋 技術長的小抄:什麼時候該看什麼?
你的問題該 看的指標 使用指令
「這裡環境乾淨嗎?」 RssiInst 0x15 (GetRssiInst)
「現在能不能發射?」 RssiInst (或 CAD) 0x15
「這訊號有多強?」(近距離) RssiPkt 0x14 (GetPacketStatus)
「這訊號有多強?」(遠距離) SignalRssiPkt 0x14
「連線品質穩嗎?」 SnrPkt (這是唯一真理) 0x14
3. 空中車禍現場:兩好三壞
如果兩台 ZeroGrid 裝置不守規矩,同時按下發射鍵,空氣中會發生什麼事?
結局 A:玉石俱焚 (Collision)
- 狀況:兩台砂石車迎面對撞,且重量(訊號強度)差不多。
- 結果:碎片滿地。接收端看到的是一堆亂碼,回報 CRC Error。這是最慘的結局。
結局 B:大吃小 (Capture Effect)
- 狀況:一台砂石車(強訊號)撞上一台腳踏車(弱訊號)。
- 結果:砂石車毫髮無傷。SX1262 會自動鎖定強訊號,完全忽略弱訊號。這在無線電學稱為 同頻抑制 (Co-Channel Rejection)。
結局 C:先來後到 (Precedence)
- 狀況:腳踏車先衝進了隧道。砂石車晚了一秒才到。
- 結果:除非砂石車強到能把隧道撞爛,否則接收端會忠誠地聽完腳踏車的話。因為 SX1262 一旦鎖定了前導碼 (Preamble),就會把耳朵關起來專心解碼,把後來的強訊號當作背景雜訊。
為了不當那個被撞爛的腳踏車,我們必須學會 LBT。
4. LBT 機制:紳士的發言守則
LBT (Listen Before Talk) 就是讓機器學會「發言前先舉手確認」。 但在 LoRa 的世界,光看音量 (0x15RssiInst) 是不夠的,因為有時候雜訊很大,但其實沒人在用 LoRa。
所以我們需要 CAD (通道活動檢測)。 它像是一個「關鍵字偵測雷達」。即便環境很吵,只要有人發出 LoRa 專屬的「哨音」(Preamble),CAD 就能精準抓出來。
ZeroGrid 的紳士發射流程 (Code Logic)
這段邏輯是 SX1262 驅動層的核心,它決定了你的網路會不會塞車:
C
// ZeroGrid 的紳士發射守則
int backoff_count = 0;
while (true) {
// 1. 先聽一下有沒有「哨音」
// 使用 CAD 指令,這比單純看 RSSI 更準確
bool activity = SX1262_RunCADBlocking(lora_config.sf);
// 2. 如果沒人吹哨,空氣是乾淨的
if (!activity) {
break; // 跳出迴圈,準備發射!
}
// 3. 如果有人在吹哨... (Channel Busy)
printf("哎呀,有人在講話,我等等。");
// 4. 隨機避讓 (Random Backoff)
// 這裡很重要!不要固定等 1秒,因為對方可能也想等 1秒。
// 大家隨機等個 10~30ms,錯開時間,下次就不會撞在一起了。
uint32_t delay = 10 + (rand() % 20);
sleep_ms(delay);
backoff_count++;
if (backoff_count > 5) break; // 嘗試太多次,還是發射吧(或是放棄)
}
// 5. 確認沒人插嘴,發射!
SX1262_Send_PHY(...);
5. 解密魔法參數:AN1200.48
要讓 CAD 雷達準確,你不能隨便設定靈敏度。 在 SX1262_ConfigCAD 中,我們依據 Semtech 的聖經文件 AN1200.48 設定了 cadDetPeak。
C
switch(sf) {
case LORA_SF7: cadDetPeak = 20; break;
case LORA_SF12: cadDetPeak = 25; break;
}
- SF7 (語速快):哨音很短,容易看走眼,所以門檻要嚴格一點 (20)。
- SF12 (語速慢):哨音拉得很長,特徵非常明顯,我們可以放寬門檻 (25),這樣就算訊號很微弱也能抓得到。
⚠️ 實驗室警告: 這就像調整助聽器。調得太靈敏,風吹草動你都以為有人叫你(不敢發射);調得太遲鈍,砂石車開過來你都沒聽見(被撞死)。請相信原廠建議值。
6. ZeroGrid 實驗室:惡霸與紳士
理論講完了,我們用 /rssi 和 /jammer 來親眼見證這一切。
實驗 A:看見底噪 (GetRssiInst 0x15)
- 輸入
/rssi。 - ZeroGrid 會呼叫
0x15指令。你會看到數值在-105 dBm左右跳動。這就是你房間現在的「安靜程度」。
實驗 B:製造惡霸
- 準備另一台 ZeroGrid (惡霸),輸入
/jammer preamble。 - 它會開始瘋狂發送前導碼,把頻道塞滿。
- 回到你的裝置,再次輸入
/rssi。 - 驚! 數值飆升到
-50 dBm。現在你知道什麼叫「吵雜」了。
實驗 C:禮貌測試 (LBT)
- 在惡霸還在吵的時候,嘗試用你的裝置發送訊息
Hello。 - 觀察 LED 燈:它不會亮!
- 觀察終端機:它會一直印出
[LBT] Busy...。你的裝置透過 CAD 聽到了哨音,正在禮貌地等待惡霸閉嘴。 - 結局:關掉惡霸 (
/jammer off),你的裝置會立刻抓準空檔,瞬間把Hello射出去。
這就是 LBT 的威力。它保護了你的訊號,也維持了頻道的秩序。
下一課預告
我們學會了禮貌避讓,資料終於安全地穿過充滿敵意的空氣,抵達了對方的晶片裡。 此刻,資料正躺在 SX1262 的 SRAM 倉庫 裡,等待被領取。 下一篇 #7 把資料挖出來,我們將拿著地圖進入 SX1262 的記憶體迷宮,並學會聽懂 DIO1 (中斷) 的門鈴聲,把這些珍貴的 Bytes 搬運出來。






















