LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解
??在之前的項目中,一直使用 LoRa 通信。很早之前就想寫寫文章記錄一下學(xué)習(xí)過程。怎奈一直是一知半解的狀態(tài),想寫不敢寫!LoRa 這個東西在國內(nèi)用的貌似不是太多。
??對于無線通信,各個國家或者地區(qū)都有嚴(yán)格的限制。例如,我們國家就有<<中華人民共和國無線電頻率劃分規(guī)定>>。前兩年,工信部出了個指導(dǎo)意見還是啥東西來著,差點把 LoRa 搞黃了!LoRa 是工作在免費頻段的。關(guān)于免費頻段各個國家或者地區(qū)是有區(qū)別的!我們國家的各種規(guī)定在工信部官網(wǎng)可以找到!廢話不多說,想要了解 LoRa 是啥的自己去搜索,我們重點說用法!
LoRa 和 LoRaWAN
??在介紹使用之前,我們必須要先區(qū)分好這兩個概念!LoRa 是低功耗廣域網(wǎng)通信技術(shù)中的一種,而按照 LoRa 聯(lián)盟官方白皮書《what is LoRaWAN》的介紹,LoRaWAN 是為 LoRa 遠距離通信網(wǎng)絡(luò)設(shè)計的一套通訊協(xié)議和系統(tǒng)架構(gòu)。類比于我們的網(wǎng)絡(luò)通信,LoRa 定了物理層,而 LoRaWAN 定義了 MAC 層、數(shù)據(jù)鏈路層。LoRaWAN 定義了一套通信系統(tǒng)的架構(gòu),底層使用的是 LoRa 通信。這個應(yīng)該就和我們的網(wǎng)絡(luò)協(xié)議棧差不多吧。
??在我們的實際使用中,我們可以僅僅使用 LoRa 進行最基本的通信,通信的應(yīng)用層協(xié)議則有我們自己定義。當(dāng)然,我們的通信只能和我們自己定義的應(yīng)用層協(xié)議的設(shè)備通信。Semtech 出了好幾款 LoRa 收發(fā)器芯片供我們選擇。當(dāng)然也可以按照 LoRaWAN 的要求來實現(xiàn)系統(tǒng)中的通信,這個就要復(fù)雜好多了,完整的 LoRaWAN 網(wǎng)絡(luò)架構(gòu)中包含了終端、網(wǎng)關(guān)、NS(網(wǎng)絡(luò)服務(wù)器)、應(yīng)用服務(wù)器這四個部分。
??當(dāng)前有好多公司都出了各種各樣的 LoRa 模塊以及 LoRa 網(wǎng)關(guān)模塊。我的環(huán)境是自己畫的 LoRa 模塊,使用了的芯片時 SX1276。我這里也不需要 LoRaWAN。
驅(qū)動
??首先,我們需要知道 Semtech 的 LORA 芯片支持 LORA 模式和 FSK 模式,所以驅(qū)動中是包含對這兩種模式的處理的。目前,Semtech 官網(wǎng)有兩款驅(qū)動,一款是舊的驅(qū)動,驅(qū)動內(nèi)部只實現(xiàn)了對于 LoRa 芯片的基本操作,另一個款是最新的包含對 LoRa 芯片的基本操作和 LoRaWAN 定義的實現(xiàn)。老版驅(qū)動 Semtech 已經(jīng)停止更新了,也不建議用在新的生成環(huán)境中。兩種驅(qū)動對比如下圖:
這里我們重點來介紹一下舊版的驅(qū)動。下面來具體說說移植!
驅(qū)動架構(gòu)
驅(qū)動的架構(gòu)并不復(fù)雜,如下圖所示:
在初始化階段,驅(qū)動內(nèi)部首先將全部寄存器的值讀取到 uint8_t SX1276Regs[0x70]; 中,而后所有接口的操作都是按照上面的圖,先修改 uint8_t SX1276Regs[0x70]; 中的寄存器,然后在通過 SPI 將 uint8_t SX1276Regs[0x70]; 中的數(shù)據(jù)寫入到芯片中。我們以 sx1276 為例來說明一下:
- sx1276.h/c:該文件主要是以上兩種模式(LORA、FSK)的統(tǒng)一的對外接口。通過 radio.h 中宏 LORA 是否為 1 區(qū)分以上兩種模式。此外該文件中還定義了一個與芯片中寄存器一一對應(yīng)的全局變量 uint8_t SX1276Regs[0x70];。
- sx1276-LoRaMisc.c/h:該文件主要是提供一些 LORA 參數(shù)的設(shè)置接口
- sx1276-LoRa.c/h:該文件定義了 LORA 寄存器以及各種寄存器的具體數(shù)值、LORA 的初始化及配置,LORA 處理狀態(tài)機。
下面是對各文件(夾)的一個簡單的介紹:
* src* │ main.c 這其中有個給出了使用方法(初始化、收發(fā)數(shù)據(jù)等),作為參考在自己的項目中使用。!!!知道如何測試后刪除即可!!!* ├─platform* │ │ platform.h 在此文件中對驅(qū)動進行配置。!!!這個必須要保留!!!* │ ├─bleeper 以下這些平臺自己在移植時其實我們就需要其中的某個文件即可。所以所謂的平臺對我自己的項目來說根本無用。* │ ├─stm32libs 其他代碼文件都是一些針對測試開發(fā)版的文件,我們不需要。* │ ├─sx1200dvk 因為,我們自己的項目中必然有自己的實現(xiàn)。* │ ├─sx1243ska 其實,最終我們就需要其中一個文件:xxx-Hal.c(根據(jù)自己的芯片類型)* │ └─sx12xxEiger <- 這里以它為例,我們只需要以下文件,其他平臺(以上倆目錄)的文件和該目錄下類似。!!!都不需要使用,直接刪除即可!!!* │ │ sx1232-Hal.c* │ │ sx1272-Hal.c* │ │ sx1276-Hal.c 我們僅需要自己選擇的芯片對應(yīng)的硬件抽象層文件,根據(jù)自己的MCU修改里面的代碼(各GPIO、函數(shù)中的SPI接口)即可。!! 函數(shù)名不能更改!!* └─radio 這個是 LORA的驅(qū)動源碼,針對每個不同信號芯片的不同調(diào)制模式都有獨立文件。!!!必須根據(jù)自己的LoRa芯片選擇對應(yīng)文件。!!!* radio.c 對于不同LORA芯片的部分操作接口的封裝。這兩文件非常簡單。* radio.h* !!-----這里省略其他文件,其他文件與以下文件類似。以sx1276來進行說明------!!* sx1276-Fsk.c Fsk模式的源碼文件,主要就是對Fsk模式下各寄存器的讀寫函數(shù)* sx1276-Fsk.h* sx1276-FskMisc.c Fsk模式的參數(shù)配置函數(shù)* sx1276-FskMisc.h* sx1276-Hal.h 硬件抽象層對應(yīng)的頭文件,對應(yīng)的.c文件在platform目錄下,這倆文件主要就是初始化LORA使用的GPIO及SPI通信。函數(shù)在.h文件中以給出。只需要根據(jù)自己的平臺實現(xiàn).c文件即可。* sx1276-LoRa.c LoRa 模式的源碼文件,主要就是LORA模式下各寄存器的讀寫函數(shù)。注意:LoRa模式下可以讀取Fsk模式的寄存器。* sx1276-LoRa.h* sx1276-LoRaMisc.c LoRa 模式的參數(shù)配置函數(shù),用戶可以直接使用該文件的中的函數(shù)對LoRa進行配置(例如頻率、帶款等等)。* sx1276-LoRaMisc.h* sx1276.c 主要是以上兩種模式(LORA、FSK)的統(tǒng)一的對外接口。通過 radio.h 中宏 LORA 是否為 1 區(qū)分以上兩種模式* sx1276.h驅(qū)動文件整理
??移植的第一步就是整理源碼文件。舊源代碼在使用 Ride 7 作為 IDE(Ride 7 使用 gcc-arm 作為編譯器)寫出來的,所以在源碼中有些 Ride 7 的文件。下面我們整理一下需要的驅(qū)動文件:
配置
移植的第二步就是修改驅(qū)動的配置項!
platform.h
??由于源碼實際是一個 Ride 7 項目示例,同時針對多個測試平臺(開發(fā)板)的,因此配置文件中有一些和測試平臺相關(guān)的代碼。我習(xí)慣于不再代碼中殘留一些無用的代碼,所以該清理的清理。清理后如下:
/*!* Radio choice. Please uncomment the wanted radio and comment the others* or add/change wanted radio definition on the compiler Defines option* 這里其實就是選擇使用的 LORA 芯片型號,我們使用的是 SX1278,其與SX1276基本一樣。Semtech 給出的驅(qū)動源碼中,SX1278 可以直接使用 SX1276 的驅(qū)動源碼。* 后面也會看到,所有驅(qū)動文件的名字均為 SX1276 開頭的文件名,卻沒有一個是 SX1278 開頭的文件。具體原因也是這里所說的原因。* 但是,需要對源碼進行一定的修改,具體修改見下面的說明!*/ //#define USE_SX1232_RADIO //#define USE_SX1272_RADIO #define USE_SX1276_RADIO //#define USE_SX1243_RADIO/*!* Module choice. There are three existing module with the SX1276.* Please set the connected module to the value 1 and set the others to 0* 這個模塊選擇:這里主要是指Semtech官方給出的不同的外圍電路設(shè)計用例。因為其給出的三種電路設(shè)計中,使用的芯片引腳等時有區(qū)別的。* 因此,這里需要根據(jù)硬件設(shè)計。來選擇合適的模塊。以下三種硬件電路設(shè)計用例,可直接在Semtech官網(wǎng)找到!* 以下幾個宏值,僅在調(diào)用初始化時才會用到,具體可查看函數(shù)void SX1276LoRaInit( void );這里也需要注意:頻率的問題,源碼對于不同頻率,* 其會選擇不同的配置。*/ #ifdef USE_SX1276_RADIO #define MODULE_SX1276RF1IAS 0 #define MODULE_SX1276RF1JAS 0 #define MODULE_SX1276RF1KAS 1 #endif整理之后,就上面兩個宏值是必須的!對于每個宏上面的注釋已經(jīng)很詳細了,不再多說!
sx1276-Hal.c
??這個文件看名字就知道,負責(zé)實現(xiàn)驅(qū)動庫與實際芯片的通信的封裝。如果看源碼中的示例文件,會發(fā)現(xiàn)其中也是很多和測試平臺相關(guān)的配置。同樣該清理的清理,最終該文件大體可以分為兩大部分:
LORA 芯片使用 MCU 的 IO 的配置及復(fù)位。函數(shù) void SX1276InitIo(void) 用來初始化使用的各 IO。函數(shù) void SX1276SetReset( uint8_t state ) 用來復(fù)位模塊。
SPI 通信使用的接口。LORA 芯片是使用 SPI 進行通信的。
- void SX1276Write( uint8_t addr, uint8_t data );
- void SX1276Read(uint8_t addr, uint8_t *data)
- void SX1276WriteBuffer(uint8_t addr, uint8_t *buffer, uint8_t size)
- void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
- void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
- void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
我們只需要根據(jù)自己的 SPI 的配置,修改 void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size ) 和 void SX1276WriteBuffer(uint8_t addr, uint8_t *buffer, uint8_t size) 即可,其他幾個接口都是直接調(diào)用上面這倆接口的!不知道為啥驅(qū)動庫要放出這么多函數(shù)。
LORA 芯片 獨立 IO 的配置。LORA 芯片有幾個 IO 是需要直接和 MCU 相連的,這些 IO 的高低狀態(tài)指示了 LORA 芯片的一些工作狀態(tài)。
- inline uint8_t SX1276ReadDio0( void )
- inline uint8_t SX1276ReadDio1( void )
- inline uint8_t SX1276ReadDio2( void )
- inline uint8_t SX1276ReadDio3( void )
- inline uint8_t SX1276ReadDio4( void )
- inline uint8_t SX1276ReadDio5( void )
需要注意的是,根據(jù)我們的需求,以上 5 個 IO 并不一定全部使用。例如我的就只使用 DIO0、DIO1、DIO3。至于如果選擇,在手冊中有說明這 5 個 IO 的說明。
天線切換接口。inline void SX1276WriteRxTx( uint8_t txEnable )。在 Semtech 給出的設(shè)計原理圖中,是需要進行天線狀態(tài)的切換的!如果是買的其他廠家的現(xiàn)成的模塊,可能不需要該函數(shù),留空即可!
sx1276-Hal.h
??還是由于驅(qū)動測試遺留的問題,我們必須要修改該文件中的部分代碼。清理一些測試過程中引入的文件,同時定義一個函數(shù)函數(shù)。具體如下:
這個文件如果設(shè)計的足夠好的話,是不需要用戶來更改的!
至此,LORA 的驅(qū)動移植完成了,接下來就是在自己的開發(fā)環(huán)境中添加使用的文件、頭文件路徑,然后編譯即可!
使用
??驅(qū)動庫通過 radio.h/c 對驅(qū)動庫的接口進行了封裝。正常的初始化、收發(fā)數(shù)據(jù)等都是使用 tRadioDriver 中的函數(shù)指針。當(dāng)然,該結(jié)構(gòu)體僅僅是封裝了部分接口。有些功能接口我們還是需要直接使用對應(yīng)驅(qū)動庫頭文件中的函數(shù)。
注意
參考
總結(jié)
以上是生活随笔為你收集整理的LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 之十五 奇怪问题处理及驱动库
- 下一篇: ARM 之十二 Cortex-M 内核异