LoRa协议在Arduino上的应用——原理及代码分析(一)
目錄
- LoRa簡介
- 硬件設備
- 源碼分析
- `Sender`
- 兩種調制方式
LoRa簡介
詳細的LoRaWAN協議解析在這里
本文主要介紹LoRa在Arduino上的實現過程,從而學習LoRa協議的實現。
硬件設備
包括傳統的GFSK調制技術以及LoRa(遠程)擴頻技術
這里說一下啥叫LoRa擴頻技術
擴頻通信的基本思想:根據香農公式**C = W * log2(1 + S / N)**,為了提高信號的傳輸速率C,可以增加帶寬W或者提高信噪比S/N,即當傳輸速率一定時,帶寬與信噪比可以互換。擴頻通信就是用帶寬換信噪比。
LoRa目前主要在ISM頻段運行,包括433、868、915MHz等。LoRa的優勢在于長距離能力,單個網關或基站可以覆蓋數百平方公里范圍
管腳定義
| GND | 信號地 |
| DIO(1/2/3/4/5/6) | 數字IO,可自定義 |
| VCC | 電源(1.8V~3.6V) |
| MISO | SPI數據輸出 |
| MOSI | SPI數據輸入 |
| SCK | SPI時鐘輸入 |
| NSS | SPI片選 |
| ANT | 天線接口 |
源碼分析
Sender
void setup() {Serial.begin(9600);while (!Serial);Serial.println("LoRa Sender");if (!LoRa.begin(915E6)) {Serial.println("Starting LoRa failed!");while (1);} }核心初始化設置為:LoRa.begin
函數聲明:
接收的參數為頻率,也就是說上述發送的頻率為915E6,595430(十進制)
具體操作在這里:
下面逐步分析這個初始化函數都干了些神馬
檢測是否定義了ARDUINO_SAMD_MKRWAN1300:
這是一個內置了LoRa功能的Arduino開發板
管腳設置
第一步:將_ss設置為輸出,找到這個變量定義的是
_ss(LORA_DEFAULT_SS_PIN) ... #define LORA_DEFAULT_SS_PIN LORA_IRQ_DUMB也就是用作LoRa的中斷引腳
下一步將這個_ss管腳置高,也就是輸出高電平
第二步:如果復位引腳不等于-1,就將復位引腳置為輸出,并且輸出一個10us的脈沖
#define LORA_DEFAULT_RESET_PIN -1 ...... _reset(LORA_DEFAULT_RESET_PIN)第三步:開啟SPI
#define LORA_DEFAULT_SPI SPI ....... _spi(&LORA_DEFAULT_SPI)第四步:讀取版本信息
uint8_t LoRaClass::readRegister(uint8_t address){return singleTransfer(address & 0x7f, 0x00); }這個函數只是簡單的調用了一下singleTransfer()這個函數,該函數的定義就在下面
uint8_t LoRaClass::singleTransfer(uint8_t address, uint8_t value) {uint8_t response;digitalWrite(_ss, LOW); // 使能從機_spi->beginTransaction(_spiSettings);_spi->transfer(address);response = _spi->transfer(value);_spi->endTransaction();digitalWrite(_ss, HIGH); // 復位從機return response; }首先_spiSettings是配置
_spiSettings(LORA_DEFAULT_SPI_FREQUENCY, MSBFIRST, SPI_MODE0),默認的SPI頻率為:
#define LORA_DEFAULT_SPI_FREQUENCY 8E6 // 2278第二個參數MSBFIRST表示dataOrder,只有兩種選項,另一種是LSBFIRST,分別是Most Significant Bit(ADDR[31:0]),和Lest Significant Bit(ADDR[0:31])
第三個參數SPI_MODE0表示dataMode,可選SPI_MODE0, SPI_MODE1, SPI_MODE2, or SPI_MODE3
除了頻率,SPI傳輸需要設置Clock polarity and phase(CPOL & CPHA)
CPOL=0:時鐘空閑時候電平為低電平(SCLK有效為高)
CPOL=1:時鐘空閑時候電平為高電平(SCLK有效為低)
CPHA=0:第一個邊沿采樣
CPHA=1:第二個邊沿采樣
SPI傳輸基于同時發送與接收,主機傳送字節,并返回從從機接收的字節
而version的信息位于:
也就是判斷所用的LoRa模塊必須是SX12系列的
第五步:設置睡眠模式
void LoRaClass::sleep() {writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP); }用到的參數:
#define REG_OP_MODE 0x01 #define MODE_LONG_RANGE_MODE 0x80 #define MODE_SLEEP 0x00
注意讀取寄存器,用的是address & 0x7f,而寫寄存器用的是address | 0x80。
第六步:設置頻率
void LoRaClass::setFrequency(long frequency) {_frequency = frequency;uint64_t frf = ((uint64_t)frequency << 19) / 32000000;writeRegister(REG_FRF_MSB, (uint8_t)(frf >> 16));writeRegister(REG_FRF_MID, (uint8_t)(frf >> 8));writeRegister(REG_FRF_LSB, (uint8_t)(frf >> 0)); }首先為什么要左移19位
第七步:寫TX與RX FIFO
SX12系列配備了一個256字節的RAM作為數據緩存區,僅在LoRa模式下可用,對其的所用訪問都要都過SPI接口完成,可以在除睡眠模式之外的所有模式下訪問FIFO,會自動清除舊的內容。
第八步:設置前端的低噪放
這里是讀取原來LNA寄存器中的值,將此值與'b00000011做或運算,然后再寫回去??梢钥吹揭欢ㄈ〉米詈髢晌槐硎綥naBoostHf
SX1276/77/78 feature three distinct RF power amplifiers. Two of those, connected to RFO_LF and RFO_HF, can deliver up to +14 dBm, are unregulated for high power efficiency and can be connected directly to their respective RF receiver inputs via a pair of passive components to form a single antenna port high efficiency transceiver. The third PA, connected to the PA_BOOST pin and can deliver up to +20 dBm via a dedicated matching network. Unlike the high efficiency PAs, this high-stability PA covers all frequency bands that the frequency synthesizer addresses.
SX12系列包括三個不同的RF功率放大器,其中兩個連接到RFO_LF and RFO_HF,可以提供高達+14dBm的功率,并且無需調節,第三個連接到PA_BOOST 引腳,可以通過專用匹配網絡,獲得高達+20dBm的功率
第九步:設置自動增益放大器
#define REG_MODEM_CONFIG_3 0x26第十步:設置發射功率
void LoRaClass::setTxPower(int level, int outputPin) {if (PA_OUTPUT_RFO_PIN == outputPin) {// RFOif (level < 0) {level = 0;} else if (level > 14) {level = 14;}writeRegister(REG_PA_CONFIG, 0x70 | level);} else {// PA BOOSTif (level > 17) {if (level > 20) {level = 20;}// subtract 3 from level, so 18 - 20 maps to 15 - 17level -= 3;// High Power +20 dBm Operation (Semtech SX1276/77/78/79 5.4.3.)writeRegister(REG_PA_DAC, 0x87);setOCP(140);} else {if (level < 2) {level = 2;}//Default value PA_HF/LF or +17dBmwriteRegister(REG_PA_DAC, 0x84);setOCP(100);}writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2));} }最后一步:設置為空閑模式,等待發送操作
#define PA_OUTPUT_RFO_PIN 0 #define PA_OUTPUT_PA_BOOST_PIN 1 void LoRaClass::idle() {writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY); }兩種調制方式
呼~寫累啦,下一篇再具體介紹LoRa調制的具體方式
加油!ヾ(?°?°?)ノ゙
總結
以上是生活随笔為你收集整理的LoRa协议在Arduino上的应用——原理及代码分析(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P1417 烹调方案 (01背包拓
- 下一篇: Taro+react开发(83):tar