LoRa⽹关项⽬——SX1278开发(⼀)
#前⾔
最近在做⼀个LoRa物联⽹⽹关的项⽬,⽹关的作⽤主要是管理连接的LoRa传感器终端,将传感数据通过协议转换向上转发到Internet,当然,也要处理下⾏的数据。 雨水口使⽤到的LoRa射频芯⽚是SX1278,MCU为STM32F103RCT6,连接Internet⽤的是ESP8266+AT,且移植了FreeRTOS(单纯是为了学习),开发环境是STM32CubeMX+Keil 5。由于之前没负责过整个系统的开发,所以开此贴记录⼀下开发过程,由于本⼈上学以来语⽂⼀直不好,所以⽂笔正在努⼒进步中,如果此⽂章有您觉得我说的不明⽩的地⽅,可以发送邮件到wanglu082@yeah,或者在⽂章下⽅评论,我看到会尽快回复您,多谢谅解!
您也可以⽆聊当个故事看,我主要是记录⼀下也防⽌以后看不懂⾃⼰写的代码,哈哈哈~
所以我将从⼤概三个⽅⾯⼤概记录:
1. SX1278的开发
2. FreeRTOS的使⽤
3. 整个项⽬总结
立方体拼图话不多说,直接开搂~
LoRa⽹关项⽬——SX1278开发(⼀)
⼀. SX1278介绍
SX1278是⼀款经典且性价⽐⾼的LoRa射频芯⽚,⾮常适合初学者学习使⽤,由于我不是特别会画PCB,所以还是选择别家的模块来的⽅便还不容易出错。 正点原⼦的LoRa模块是和⼀个MCU封装到⼀起的,所以可以⽤串⼝通信,很⽆脑,很多参数没法修改已被正点原⼦给写死,只能通过它家的上位机来配置模块,遂PASS。最后选择了安信可的LoRa Ra-02模块,02是邮票孔接⼝的还⽐较容易焊接。这个就不像正点原⼦家的那样⽆脑,它就是将SX1278和其外围电路集成到了⼀起⽽已,使⽤SPI接⼝通信,有⽤的引脚也都引出了,⽬前来看⽐较不错。唯⼀的问题是他的天线接⼝是ipex接⼝的,不如SMA的好看(其实是我有很多SMA接⼝的天线⽤不上了)。
配置SX1278是通过SPI接⼝对寄存器操作实现的,某些寄存器在LoRa模式和FSK模式有不同的作⽤,我这个项⽬只⽤LoRa模式,所以FSK有关的我也懒得看(话说很多寄存器我真的不看懂是啥意思,不 是通信专业的对射频不是很了解,只能百度百度再百度)。
⼆. 开发之前的准备⼯作蜂蜜包装盒
铝方通吊顶工艺
安信可的LoRa模块共引出了16个管脚(如下图),这么多的引脚加之这么多看不懂的寄存器,在这⾥不得不吐槽⼀下SX1278的官⽅⼿册真的是很不全,很多操作的逻辑都没有解释明⽩,要让我⾃⼰写驱动的话我估计会直接放弃,不过还好安信可提供了⼏个Demo可供咱们参考。 选了⼀个点对点控制LED的Demo,果断将驱动复制出来,驱动的结构有必要说⼀下。我个⼈习惯把嵌⼊式项⽬分为5层架构,由上到下分别是:应⽤层、中间件层、操作系统层、板级⽀持包、硬件层。这个是我看知乎上⼀篇⽂章总结的,觉得跟我⾃⼰的想法⾼度⼀致,也不知道说的对不对。
硬件层就是单⽚机内部外设的驱动,像GPIO,SPI等等,这⼀层⼀般是跟单⽚机⾛的,像这个项⽬的硬件层就是STM32提供的HAL 库。
板级⽀持包这个概念是从⼤学的书本上看到的,Linux开发⽤的⽐较多吧,单⽚机没怎么看到⼤家谈(⽕哥好像⽤这个概念)。这⼀层⼤概就是对外部硬件的初始化和⼀些基本操作的封装,通常调⽤的是硬件层的API来实现。就⽐如这个SX1278,它的初始化、⽚选、复位等操作就是属于板级⽀持包要
实现的。驱动⽂件中的sx1276-board.c和sx1276-board.h就是属于板级⽀持包的。
操作系统层是最容易理解的,于此项⽬⽽⾔就是FreeRTOS嘛。系统的初始化、任务、列表、队列等数据结构的创建都是在这层实现的。操作系统层不光使⽤板级⽀持包提供的接⼝,显然也调⽤硬件层的接⼝,所以这个层的位置其实⽐较尴尬,我的理解或许也有错误,欢迎讨论!
中间件层的作⽤是实现所需的功能函数。它与应⽤层的区别是:应⽤层负责解决整个系统何时该调⽤哪个功能函数;⽽中间件层就是实现这些功能函数的。这些功能函数可能调⽤了不同模块对应的板级⽀持包的接⼝,组合来实现⼀项功能。例如,⽹关在接收到感知层结点的数据时,在接收回调函数中可能调⽤MQTT_publish()将数据转发给上层应⽤,同时,也会调⽤OLED_display()显⽰消息到显式模块上。 驱动⽂件中的sx1276.c和sx1276.h就是属于中间件层的。
应⽤层的⼯作是从整个系统的调度层⾯来讲的,这个后⾯再说吧~
官⽅的驱动中还剩下⼏个⽂件,在这⾥介绍⼀下它们作⽤:nand闪存
⽂件名功能
radio.h声明了很重要的两个结构体
sx1276Regs-Fsk.h FSK模式下的寄存器宏定义
sx1276Regs-LoRa.h LoRa模式下的寄存器宏定义
将驱动⽂件复制到⼀个确定没其它问题的MDK⼯程中,我⽤的是正点原⼦开发板中的SPI章节Demo(HAL库),⼤差不差,选择⼀个⾃⼰觉得舒服的就⾏。然后可以建⼀个⽂件夹放SX1278的驱动⽂件,完成在Keil中建⽴Group、添加INCLUDE path等常规操作。
之后就可以开始改错了,这其中主要是改以下部分内容:
1. 引脚定义;根据你的原理图来改。
2. GPIO、SPI初始化函数。官⽅给的驱动是⽤标准库来写的,我⽤的STM32CubeMX只⽀持HAL库,所以暂时要先把它改成对应的HAL
库函数。钱箱
这⾥差不多就改完了,编译应该是0 error,这⼀章就介绍完了,明天开始记录SX1278的初始化函数部分的内容。