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

article/2025/3/16 12:54:05

目录

  • 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;
}

下面逐步分析这个初始化函数都干了些神马

  1. 检测是否定义了ARDUINO_SAMD_MKRWAN1300
    在这里插入图片描述
    这是一个内置了LoRa功能的Arduino开发板

  2. 管脚设置

第一步:将_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做或运算,然后再写回去。可以看到一定取得最后两位表示LnaBoostHf

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);
}

两种调制方式

  1. LoRa
    在这里插入图片描述
    呼~写累啦,下一篇再具体介绍LoRa调制的具体方式
    加油!ヾ(◍°∇°◍)ノ゙

http://chatgpt.dhexx.cn/article/PsVYJ7es.shtml

相关文章

物联网LoRa系列-25:LoRa终端--LoRaWAN协议简介与LoRa WAN终端软件选择

前言&#xff1a; 从本篇文章开始&#xff1a; 从通信节点的角度度看&#xff0c;将从Lra终端对点对通信转到LoRa终端与LoRa网关的通信、LoRa终端与LoRa云服务器的通信&#xff1b; 从协议栈的角度看&#xff0c;将从物理层上升到LoRa的MAC层&#xff0c; 即LoRaWAN&#xf…

lora三层服务器协议,LoRa以及LoRa包含的几种协议

为何LoRa成为“一夜爆红”的新技术呢?一定是因为它具有非常显著的特点: 长距离:1~20km 节点数:万级,甚至百万级 电池寿命:3~10年 数据速率3~50kbps LoRa作为一种无线技术,基于Sub-GHz的频段使其更易以较低功耗远距离通信,可以使用电池供电或者其他能量收集的方式供电。…

Lora如何组网?有哪些简单的Lora组网协议?

我从事物联网设计10余年&#xff0c;对无线通讯技术的ASK、FSK、Zigbee、Z-Wave、NB-Iot、Lora及LoraWan等都有一些或多或少的接触。 其中Lora无线通讯技术对我影响比较深刻&#xff0c;了解也相对比较透彻。 我在2016年接触的Lora无线通讯技术&#xff0c;但是&#xff0c;在…

什么是LoRa协议?

1 开场白 这篇文章给读者分享LoRa和LoRaWAN相关的技术简介, Low-Power, Wide-Area Networks(LPWAN)为实现数十亿的万物互联设备而生, LoRaWAN专为LPWAN网络优化更长的电池寿命,更长的距离和更低的代价。 [欢迎大家关注公众号:LoRa万物互联,获取更多LoRa资讯] 2 LoRa是什…

物联网LoRa系列-2:LoRa系统架构与协议栈详解

主要内容 1. 什么是Lora&#xff1f; 2. LoRa的主要特点&#xff1f; 3. LoRa的系统架构&#xff1f; 4. LoRa终端节点的网络连接方式&#xff1f; 5. LoRa终端节点的三种工作模式&#xff1f; 6. LoRa的协议栈&#xff1f; 1. 什么是LoRa LoRa是semtech公司创建的低功耗…

LoRa协议

注意&#xff1a;本页提供的信息来自LoRa™Alliance于2015年1月发布的LoRaWAN Specification V1.0。LoRa联盟负责随时更改规格&#xff0c;恕不另行通知。RF Wireless World不对任何与此相关的问题负责。请参阅LoRa Alliance&#xff08;https://www.lora-alliance.org&#xf…

用命令:tar -zxvf,解压tar.gz包失败的问题解决。

问题描述&#xff1a; 主机上&#xff0c;使用tar -zxvf 解压tar.gz包的时候&#xff0c;出现以下错误&#xff1a; gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now 问题办法&#xff1a; 开门见山&#xff0c;…

Liunx tar -zxvf 命令解压失败

使用tar -zxvf 命令解压mysql.tar报错 [rootiZ2ze8f0mv6pvfs1n3rpgaZ mysql]# tar -zxvf mysql.tar gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now 解决方案 去掉z参数&#xff0c;使用 tar -xvf 解压正常 […

tar -zxvf是什么意思

先上DJ&#xff0c;先上DJ 含义&#xff1a;使用gzip工具&#xff08;-z&#xff09;解压&#xff08;-x&#xff09;由参数-f指定的文件&#xff0c;并显示压缩过程中详细信息&#xff08;-v&#xff09; 参数含义tarLinux压缩/解压缩命令-z代表gzip&#xff0c;使用gzip工具…

word标题设置级别

想要这样子: 点击标题1,标题1前面就带有级别. 新建word是这样的,没有带级别: 转自:https://blog.csdn.net/xtggbmdk/article/details/82591717 选择多级列表菜单 “2”级的右侧选“标题2” .在标题3的右侧选择标题3

NPOI Word 多级标题结构设置

通过NPOI实现以下功能 首先通过Word新建个样式模板&#xff0c;该样式模板包括你想要的几个标题样式&#xff0c;比如我这里就需要三个样式&#xff0c;标题、标题1、标题2 打开Word,新建文档&#xff0c;然后输入内容&#xff0c;更改样式&#xff0c;另存为word模板&#xf…

word:如何一键修改同一级别标题

word&#xff1a;如何一键修改同一级别标题 1.选中任意一个三级标题——开始——编辑——选择——选中格式相似的文本 2.修改字体样式&#xff1a;开始——样式——标题 3 ——右击——修改 样式名称不要修改——举例字体更改为&#xff1a;微软雅黑、五号、加粗、深红色——…

Word标题中按级别自动添加编号

一 大标题 1 标题1 1.1 标题1.1 1.1.1 标题添加 1.1.2 zaitian 1.2 新添加 1.2.1 在添加 1.3 标题1.2 2 标题2 2.1 标题2.1 2.2 添加新标题 3 标题2.2 3.1 标题天机 3.1.1 标题3 教程&#xff1a;为了实现上述的样式&#xff0c;即标题编号按照&#xff1a; 标题大级别.中级级…

Word文档标题自动增加序号

在编写Word文档时&#xff0c;经常需要使用到多级标题&#xff0c;为了可读性&#xff0c;一般需要给标题增加序号&#xff0c;该文档就是作者实际操作过程中遇到的问题和解决方法。 第一步&#xff1a; 选择“开始”-----》“段落”---》“多级列表”---》“定义新的多级列表…

word设置标题多个级别

https://jingyan.baidu.com/article/1876c852468dd8890b1376a9.html 1.在开始菜单里面看看标题 2.选择多级列表菜单 3.点击下面更多按钮&#xff0c;在”1“的右侧选”标题1“ 4.在“2”级的右侧选“标题2” 5.在标题3的右侧选择标题3

java生成word带多级标题,word自动生成多级标题的方法

毕业论文格式是一件很麻烦的事&#xff0c;通过修改各级标题来实现。如何快速地修改格式呢?接下来学习啦小编为你分享word自动生成多级标题的方法。希望对你有帮助! word自动生成多级标题的方法 使WORD里面的文章自动生成目录: 假如文章中标题格式为 第一节……大标题(一级) 1…

word@导航窗格@标题的大纲级别@章节导航

文章目录 项目符号编号多级列表项目符号编号多级列表&#x1f388;多级列表的定义多级列表(multilevel list)绑定标题样式(heading style)&#x1f388;重新自定义多级列表 补充:论文的章节结构论文写作中编号和多级列表的常见用途章节标题和子标题列表和条目参考文献图表和表格…

word设置生成目录显示的级别

作者&#xff1a;非妃是公主 专栏&#xff1a;《笔记》《C》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 点击自定义目录&#xff0c;如下&#xff1a; 然后点击选项&#xff0c;如下&#xff1a; 在弹出的目录选…

Word设置标题以及自动编号——保姆级教程

前言 上学期间可能经常会用到Word来写一些报告、论文之类的文章&#xff0c;这个时候就需要用到分级标题&#xff0c;然而Word自带的标题往往不能符合我们要求的格式&#xff0c;这个时候就需要我们自己来设置了&#xff0c;以下方法都是我自己摸索出来的&#xff0c;不一定是…