[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

这篇具有很好参考价值的文章主要介绍了[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MCU型号:STM32L071KBU
SDK:HAL库
工具:CubeMX + MDK

1 LoRa模块概述

1.1 模块描述

LoRa (Long Range, 远距离)模块收发器型号为SX1278,可以完成点对点的数据通信功能,属于半双工通信,其原理图与引脚描述如下图所示:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

▲ Lora模块原理图

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

▲ Lora模块引脚描述

Lora竞赛板中引出了以下引脚:
[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

  • PA5~7:一般配置为硬件SPI通信引脚
  • PA4:片选引脚,一般选择软件片选
  • PA9:复位引脚,无需复位时,初始化时拉高即可
  • PA10:DIO0外部中断引脚,当接收端接收到数据之后,DIO0 将触发上升沿信号,可编程在EXTI中断中处理接收数据

1.2 工作模式

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

SX1278寄存器在任何模式下都可以读,但仅在睡眠和待机模式下可写

1.3 数据FIFO

LoRa数据FIFO共256字节,用于发送和接收数据,除睡眠模式外,其他模式下均可读写,在切换到新的接收模式时,自动清除旧内容,如下图所示:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

▲ LoRa 数据FIFO

调制器用于发送数据,解调器用于接收数据

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

  • 发送时,首先进入待机模式,将FIFO SPI 地址FifoAddrPtr设置为FIFO调制器基地址FifoTxBaseAddr,将负载长度PayloadLength设置为发送字节数,将数据写入FIFO,然后切换到发送模式,等待发送完成,发送完成后芯片自动返回到待机模式,切换到连续接收模式等待接收,如下图所示:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

▲ LoRa发送流程
  • 连续接收时,首先切换到接收模式,等待接收完成,接收完成后将FIFO SPI 地址FifoAddrPtr设置为FIFO接收开始地址FifoRxCurrentAddr,然后从FIFO读取RxNbBytes个字节数据,如下图所示:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

▲ LoRa接收流程

芯片不同模式之间转换时FIFO 的状态:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

2 HAL库LoRa编程

2.1 CubeMX配置

PA5~7配置为硬件SPI通信引脚:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

根据官方手册给出的LoRa模块SPI通信要求配置的参数:

  • 全双工通信
  • SPI 主机采用模式0,CPOL=0 和CPHA=0
  • 数据长度8 位,MSB 通信
  • SPI 速度需要小于10M(主频32M / 4 = 8M)

此外,还需要初始化PA9复位引脚和PA4片选引脚,配置成通用推挽输出,将它们拉高

PA10配置为外部中断触发引脚,上升沿触发:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

使能EXTI4_15中断:

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

2.2 SPI_WriteRead函数封装

uint8_t SPI_WriteRead(uint8_t addr, uint8_t data)
{
    uint8_t tx_data[2], rx_data[2];

    tx_data[0] = addr;
    tx_data[1] = data;

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 2, 10);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

    return rx_data[1];
}

2.3 LoRa API使用

2.3.1 LoRa初始化

void LORA_Init(void)
{
    SPI_WriteRead(0x81, 0);             /* 设置睡眠模式 */
    SPI_WriteRead(0x81, 0x80);          /* 设置LoRa模式 */
    SPI_WriteRead(0x81, 1);             /* 设置待机模式 */
    LORA_SetRFFrequency(434);           /* 设置射频频率(137~525MHz) */
    LORA_SetRFPower(10);                /* 设置射频功率(2~20dBm) */
    SPI_WriteRead(0x9E, 7 << 4);        /* 设置扩频因子(7~12) */
    LORA_SetBW(7);                      /* 设置信号带宽(0~9) */
    LORA_SetCR(1);                      /* 设置纠错编码率(1~4) */
    SPI_WriteRead(0x81, 5);             /* 设置连续接收模式 */
}

一般只需要设置LoRa模式(必须在睡眠模式下设置)和射频功率/频率即可,其他使用默认值

射频功率在10mW可提供超过25KM视距传输。

注意注意:LoRa模块间频率、带宽、扩频因子和前导码长度等参数相同才能通信。

2.3.2 发送数据

void LORA_Tx(unsigned char *pucBuf, unsigned char ucSize)
{
    unsigned int i;
    unsigned char ret;

    SPI_WriteRead(0x81, 1);             /* 设置待机模式 */
    ret = SPI_WriteRead(0x0E, 0);       /* 读取FifoTxBaseAddr */
    SPI_WriteRead(0x8D, ret);           /* 设置FifoAddrPtr */
    SPI_WriteRead(0xA2, ucSize);        /* 设置PayloadLength */
    for(i = 0; i < ucSize; i++)         /* 写数据到FIFO */
        SPI_WriteRead(0x80, pucBuf[i]);
    SPI_WriteRead(0x81, 3);             /* 设置发送模式 */
    i = 65535;
    do
    {
        ret = SPI_WriteRead(0x12, 0);     /* 读标志 */
        i--;
    }while(((ret & 8) == 0) && (i != 0));  /* 等待发送完成 */
    SPI_WriteRead(0x92, 8);             	/* 清除发送完成 */
    SPI_WriteRead(0x81, 5);             	/* 设置连续接收模式 */
}
  • pucBuf:指向发送数据缓冲区的指针
  • ucSize:待发送数据的字节数(数据FIFO最大256字节,因此单次发送数据超过256字节后的数据会被截断)

每次发送完数据后,LoRa模块都会切换到连续接收模式,等待数据的接收。

2.3.3 接收数据

unsigned char LORA_Rx(unsigned char *pucBuf)
{
    unsigned char i, ret;

    ret = SPI_WriteRead(0x12, 0);       /* 读标志 */
    if(ret & 0x40)                      /* 接收完成 */
    {
        SPI_WriteRead(0x81, 1);           /* 设置待机模式 */
        SPI_WriteRead(0x92, 0x40);        /* 清除接收完成 */
        ret = SPI_WriteRead(0x10, 0);     /* 读取FifoRxCurrentAddr */
        SPI_WriteRead(0x8D, ret);         /* 设置FifoAddrPtr */
        ret = SPI_WriteRead(0x13, 0);     /* 读取RxNbBytes */
        for(i = 0; i < ret; i++)
            pucBuf[i] = SPI_WriteRead(0, 0);/* 从FIFO读数据 */
        SPI_WriteRead(0x81, 5);           /* 设置连续接收模式 */
    }
    else
        ret = 0;
    return ret;
}
  • pucBuf:指向接收缓冲区的指针
  • 返回值:接收到的数据长度(unit:字节)

每次接收完数据后,LoRa模块都会切换到连续接收模式,继续等待数据的接收。

2.4 使用示例

按下USER按键发送数据:

uint8_t tx_data[2] = {0x12, 0x34};
uint8_t rx_data[2];
void lora_send(void)
{
    LORA_Tx(tx_data, sizeof(tx_data));
}

在外部中断EXTI4_15_IRQHandler回调函数中打印接收到的数据:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_10)
    {
        uint8_t data_length = LORA_Rx(rx_data);
        printf("size: %d, rx1:%x, rx2:%x\r\n", data_length, rx_data[0], rx_data[1]);
    }
}

实验结果:LoRa模块都能正常发送数据,且均能收到对方发送的数据。

[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法

END文章来源地址https://www.toymoban.com/news/detail-415671.html

到了这里,关于[005] [蓝桥杯物联网] LoRa模块通信原理概述与API使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十三届省赛蓝桥杯物联网程序设计试题

    1、配置根据试题的要求配置STM32CubeMX (1)引脚配置 将PC14引脚配置为输入模式 PC14 用户按键引脚 将PA10引脚配置为中断模式 PA10 LoRa模块DIO0引脚 将以下引脚配置为输出模式 PC15 用户LED引脚 PB5 OLED 电源控制引脚 PA11和PA12 继电器控制引脚 PA4和PA9 LoRa模块片选和复位引脚,初始为高电

    2023年04月10日
    浏览(48)
  • 蓝桥杯物联网竞赛_STM32L071_2_继电器控制

    PA11 与 PA12 连接着 UNL2803 ULN2803是一种集成电路芯片,通常被用作高电压和高电流负载的驱动器。 ULN2803是一个达林顿阵列,当输入引脚(IN1至IN8)被连接到正电源时,相应的输出引脚(OUT1至OUT8)将会断开或保持在高阻抗状态。这意味着输出引脚不会提供任何电流或电压输出。

    2024年02月05日
    浏览(38)
  • STM32使用LORA模块通信

    目录 一、简单了解 1、模块简介 2、硬件及功能  3、传输方式 二、模块上手 1、连接  2、编写代码 usart3.h usart3.c lora.h lora.c main.c 本文以正点原子ATK-LORA-01模块为例进行介绍。         ATK-LORA-01-V3.0(V3.0是版本号,下面均以ATK-LORA-01表示该产品)是ALIENTEK推出的一款体积小、微

    2024年02月02日
    浏览(34)
  • 物联网Lora模块从入门到精通(七)串口通讯

            在Lora模块的程序设计中,串口通信一定是一个极其重要且常用的通信方式,借助串口通信,我们不但可以向外传输我们获取的数据,还可以根据外部指令做出相应。         同样的,在例程中,为我们提供了一个名为usart1-board.c的库,帮助我们更好更快的完成串口通

    2024年02月08日
    浏览(47)
  • ATK-LORA 无线通信模块

    ATK-LORA 是 正点原子 推出的一款小体积、微功率、低功耗、高性能的远距离 LoRa 无线串口模块,该模块采用高效的 ISM 频段射频 SX1278 扩频芯片,其工作频率为 410MHz~441MHz,信道以 1MHz 频率为步进,共有 32 个信道,可在线修改模块的串口速率、发射功率、空中速率、工作模式和

    2024年02月07日
    浏览(36)
  • 【物联网无线通信技术】LoRa从理论到实现(SX1268)

    文章先从LoRa的物联网通信技术前辈们讲起,慢慢引出了这种功耗又低,距离又远的无线通信技术,然后又似庖丁解牛一般,从物理层到链路层,详细的介绍了LoRa这种技术的组成,最后以一种实际的原理与嵌入式软件实现,让读者近距离接触到基于LoRa这种无线通信技术产品的

    2024年02月10日
    浏览(41)
  • 物联网Lora模块从入门到精通(六)OLED显示屏

            获取到数据后我们常需要在OLED显示屏上显示,本文中我们需要使用上一篇文章(光照与温湿度数据获取)的代码,在其基础上继续完成本文内容。         基础代码:         例程中,为我们提供了hal_oled.c文件,其中为我们常使用下列方法:         OLED的屏幕是1

    2024年02月08日
    浏览(42)
  • [4]PCB设计实验|LPWAN物联网系统解决方案 |LoRa模块/LoRa网关/云平台/LoRa应用案例|9:30~10:00

    目录 1.LPWAN物联网系统解决方案                             LoRa模块/LoRa网关/云平台/LoRa应用案例 2.LoRaWAN网络部署情况 LoRaWAN网络架构 3.基于LPWAN技术的无线通信端到端解决方案  LoRa低功耗广域网智能终端 CY-LRW-102开关控制器 CY-LRB-101开关检测器 4.LoRa无线模块 4.1规格 4.2Lo

    2024年02月08日
    浏览(39)
  • 基于STM32的正点原子LORA模块通信网络

    LoRa是semtech公司开发的一种低功耗局域网无线标准,其名称“LoRa”是远距离无线电(Long Range Radio),它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远,实现了低功耗和远距离的统一,它在同样的功耗下比传统的无线射频通信距离扩大3-5倍。 距离往往可达

    2023年04月08日
    浏览(41)
  • 物联网Lora模块从入门到精通(四)对某些端口的初始化

            由于程序设计开发具有的不确定性,我们常常需要初始化某些特定的引脚,并读取引脚电平状态或向引脚输出高低电平。         快速找到端口的初始化语句:         首先,找到board.c文件,在下图的位置,我们可以看到关于LED灯的端口的初始化语句。        

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包