一、前言
嵌入式开发中我们要时刻保持代码的高效与整洁。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了,正在审核。