LoRa开发|LoRa(SX1276/8)串口透传代码-将LoRa封装成单独的驱动(STM32)

2 篇文章 4 订阅
1 篇文章 0 订阅

一、前言

        嵌入式开发中我们要时刻保持代码的高效与整洁。2020年,开年注定不平凡,新型冠状肺炎的出现哪里也去不了,在家无聊写点东西吧。最近和一友人聊天,友人一直在抱怨学习lora没有前途,一直在纠结要不要学习,我只是默默的听着,然后笑一下当做什么都没听见。LoRa是一种通信技术不是一种职业,学不学他都在那里,而且LoRa本身也不难,spi接口,手册还是中文的。目前国内无线通信产品中,NBIOT和LoRa基本各占一半。鉴于这些问题,现在开放一个LoRa转UART的代码,这也是大家在调试LoRa点对点通信中最喜欢用的代码。目前网络上的代码很多也很多,根本不适合学习或者是项目使用,很有有代码对程序框架有所追求。

二、程序编写思路

三、SX1278分析

         通过引脚定义可以看出,重点的引脚就是SPI通信接口,RESET复位引脚,RXTX收发切换引脚,DIO0-DIO5。目前市面上的模组基本上在硬件上实现收发自动切换,不需要额外关心,有些没有实现自己增加引脚控制切换即可。以安信可的Ra-01为例,该模组已经实现了收发硬件自动切换,所以不需要额外的关心。

DIO0-DIO5引脚映射关系:

通过手册引脚映射可见:如果只是实现LoRa的收发数据只需要用到DIO0应交即可,不需要其他引脚。

综上所述:LoRa驱动移植所需要的IO口

1.SPI通信接口4线;

2.芯片复位引脚;

3.DIO0中断检测引脚:

4.软定时器:发送超时,接收超时,CAD检测超时:

四、LoRa代码移植

LoRa驱动接口,并将LoRa封装成驱动


static struct cola_device_ops radio_ops =
{
    .config  = radio_config,
    .control = radio_ctrl,
    .write   = radio_write,
    .read    = radio_read,
};

void radio_bsp_init(void)      
{                 
    spi_dev = cola_device_find("spi1");
    assert(spi_dev);
    dio0_dev = cola_device_find("sx1276_dio0");
    assert(dio0_dev);
    cola_device_cfg(dio0_dev,sx1276_dio0_exit,0);
    reset_dev = cola_device_find("sx1276_reset");
    assert(reset_dev);
    cola_fifo_init(&radio_fifo_rx,radio_buf_rx,sizeof(radio_buf_rx));
    cola_fifo_init(&radio_fifo_tx,radio_buf_tx,sizeof(radio_buf_tx));
    cola_fifo_init(&radio_fifo_tx_cnt,radio_buf_tx_cnt,sizeof(radio_buf_tx_cnt));
    tmer_init();
}
void board_setup_radio(void)
{
    radio_bsp_init();
    radio_init();
    radio_dev.name = "lora";
    radio_dev.dops = &radio_ops;
    cola_device_register(&radio_dev);
}
late_initcall(board_setup_radio);

应用层调用:

/**
  ********************************  cola os  *********************************
  * @file   : app.c
  * @author : sunny.Bit(QQ 1506564994)
  * @brief  : uart2lora
  ******************************************************************************/
#include "config.h"
#include <string.h>
#include "app.h"
#include "cola_device.h"
#include "cola_os.h"

static task_t uart_task;
static cola_device_t *uart_dev;
static cola_device_t *radio_dev;

static uint8_t tmp[128] = {0};
static void uart_task_cb(uint32_t event)
{
   int err = 0;
   if(event&SIG_DATA)
   {
        err = cola_device_read(uart_dev,0,tmp,sizeof(tmp));
        if(err)
        {
            err = cola_device_write(radio_dev,0,tmp,err);
        }
   }
   if(event&SIG_RADIO_DATA)
   {
        err = cola_device_read(radio_dev,0,tmp,sizeof(tmp));
        if(err)
        {
            cola_device_write(uart_dev,0,tmp,err);
        }
   }
}
void uart_to_radio_task_init(void)
{
    extern void uart_dev_init(void);
    extern void radio_dev_init(void);
    uart_dev_init();
    radio_dev_init();
    cola_task_create(&uart_task,uart_task_cb);
}

五、下载链接

假期在家用不了git,直接上传到csdn了,正在审核。

下载链接:https://download.csdn.net/download/ziqi5543/12128753

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值