一、前言
嵌入式开发中我们要时刻保持代码的高效与整洁。2023年,开年注定不平凡,新型冠状肺炎的出现哪里也去不了,在家无聊写点东西吧。最近和一友人聊天,友人一直在抱怨学习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 #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);}五、下载