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