日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LoRa协议在Arduino上的应用——原理及代码分析(一)

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的優勢在于長距離能力,單個網關或基站可以覆蓋數百平方公里范圍

管腳定義

PIN描述
GND信號地
DIO(1/2/3/4/5/6)數字IO,可自定義
VCC電源(1.8V~3.6V)
MISOSPI數據輸出
MOSISPI數據輸入
SCKSPI時鐘輸入
NSSSPI片選
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
函數聲明:

int begin(long frequency);

接收的參數為頻率,也就是說上述發送的頻率為915E6,595430(十進制)
具體操作在這里:

int LoRaClass::begin(long frequency) { #if defined(ARDUINO_SAMD_MKRWAN1300) || defined(ARDUINO_SAMD_MKRWAN1310)pinMode(LORA_IRQ_DUMB, OUTPUT);digitalWrite(LORA_IRQ_DUMB, LOW);// Hardware resetpinMode(LORA_BOOT0, OUTPUT);digitalWrite(LORA_BOOT0, LOW);pinMode(LORA_RESET, OUTPUT);digitalWrite(LORA_RESET, HIGH);delay(200);digitalWrite(LORA_RESET, LOW);delay(200);digitalWrite(LORA_RESET, HIGH);delay(50); #endif// setup pinspinMode(_ss, OUTPUT);// set SS highdigitalWrite(_ss, HIGH);if (_reset != -1) {pinMode(_reset, OUTPUT);// perform resetdigitalWrite(_reset, LOW);delay(10);digitalWrite(_reset, HIGH);delay(10);}// start SPI_spi->begin();// check versionuint8_t version = readRegister(REG_VERSION);if (version != 0x12) {return 0;}// put in sleep modesleep();// set frequencysetFrequency(frequency);// set base addresseswriteRegister(REG_FIFO_TX_BASE_ADDR, 0);writeRegister(REG_FIFO_RX_BASE_ADDR, 0);// set LNA boostwriteRegister(REG_LNA, readRegister(REG_LNA) | 0x03);// set auto AGCwriteRegister(REG_MODEM_CONFIG_3, 0x04);// set output power to 17 dBmsetTxPower(17);// put in standby modeidle();return 1; }

下面逐步分析這個初始化函數都干了些神馬

  • 檢測是否定義了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->transfer(address);

    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




    void LoRaClass::writeRegister(uint8_t address, uint8_t value) {singleTransfer(address | 0x80, value); }

    注意讀取寄存器,用的是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位

    #define REG_FRF_MSB 0x06 #define REG_FRF_MID 0x07 #define REG_FRF_LSB 0x08


    第七步:寫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調制的具體方式
    加油!ヾ(?°?°?)ノ゙
  • 總結

    以上是生活随笔為你收集整理的LoRa协议在Arduino上的应用——原理及代码分析(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。