日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解

發布時間:2024/10/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??在之前的項目中,一直使用 LoRa 通信。很早之前就想寫寫文章記錄一下學習過程。怎奈一直是一知半解的狀態,想寫不敢寫!LoRa 這個東西在國內用的貌似不是太多。
??對于無線通信,各個國家或者地區都有嚴格的限制。例如,我們國家就有<<中華人民共和國無線電頻率劃分規定>>。前兩年,工信部出了個指導意見還是啥東西來著,差點把 LoRa 搞黃了!LoRa 是工作在免費頻段的。關于免費頻段各個國家或者地區是有區別的!我們國家的各種規定在工信部官網可以找到!廢話不多說,想要了解 LoRa 是啥的自己去搜索,我們重點說用法!

LoRa 和 LoRaWAN

??在介紹使用之前,我們必須要先區分好這兩個概念!LoRa 是低功耗廣域網通信技術中的一種,而按照 LoRa 聯盟官方白皮書《what is LoRaWAN》的介紹,LoRaWAN 是為 LoRa 遠距離通信網絡設計的一套通訊協議和系統架構。類比于我們的網絡通信,LoRa 定了物理層,而 LoRaWAN 定義了 MAC 層、數據鏈路層。LoRaWAN 定義了一套通信系統的架構,底層使用的是 LoRa 通信。這個應該就和我們的網絡協議棧差不多吧。
??在我們的實際使用中,我們可以僅僅使用 LoRa 進行最基本的通信,通信的應用層協議則有我們自己定義。當然,我們的通信只能和我們自己定義的應用層協議的設備通信。Semtech 出了好幾款 LoRa 收發器芯片供我們選擇。當然也可以按照 LoRaWAN 的要求來實現系統中的通信,這個就要復雜好多了,完整的 LoRaWAN 網絡架構中包含了終端、網關、NS(網絡服務器)、應用服務器這四個部分。

??當前有好多公司都出了各種各樣的 LoRa 模塊以及 LoRa 網關模塊。我的環境是自己畫的 LoRa 模塊,使用了的芯片時 SX1276。我這里也不需要 LoRaWAN。

驅動

??首先,我們需要知道 Semtech 的 LORA 芯片支持 LORA 模式和 FSK 模式,所以驅動中是包含對這兩種模式的處理的。目前,Semtech 官網有兩款驅動,一款是舊的驅動,驅動內部只實現了對于 LoRa 芯片的基本操作,另一個款是最新的包含對 LoRa 芯片的基本操作和 LoRaWAN 定義的實現。老版驅動 Semtech 已經停止更新了,也不建議用在新的生成環境中。兩種驅動對比如下圖:

這里我們重點來介紹一下舊版的驅動。下面來具體說說移植!

驅動架構

驅動的架構并不復雜,如下圖所示:

在初始化階段,驅動內部首先將全部寄存器的值讀取到 uint8_t SX1276Regs[0x70]; 中,而后所有接口的操作都是按照上面的圖,先修改 uint8_t SX1276Regs[0x70]; 中的寄存器,然后在通過 SPI 將 uint8_t SX1276Regs[0x70]; 中的數據寫入到芯片中。我們以 sx1276 為例來說明一下:

  • sx1276.h/c:該文件主要是以上兩種模式(LORA、FSK)的統一的對外接口。通過 radio.h 中宏 LORA 是否為 1 區分以上兩種模式。此外該文件中還定義了一個與芯片中寄存器一一對應的全局變量 uint8_t SX1276Regs[0x70];。
  • sx1276-LoRaMisc.c/h:該文件主要是提供一些 LORA 參數的設置接口
  • sx1276-LoRa.c/h:該文件定義了 LORA 寄存器以及各種寄存器的具體數值、LORA 的初始化及配置,LORA 處理狀態機。

下面是對各文件(夾)的一個簡單的介紹:

* src* │ main.c 這其中有個給出了使用方法(初始化、收發數據等),作為參考在自己的項目中使用。!!!知道如何測試后刪除即可!!!* ├─platform* │ │ platform.h 在此文件中對驅動進行配置。!!!這個必須要保留!!!* │ ├─bleeper 以下這些平臺自己在移植時其實我們就需要其中的某個文件即可。所以所謂的平臺對我自己的項目來說根本無用。* │ ├─stm32libs 其他代碼文件都是一些針對測試開發版的文件,我們不需要。* │ ├─sx1200dvk 因為,我們自己的項目中必然有自己的實現。* │ ├─sx1243ska 其實,最終我們就需要其中一個文件:xxx-Hal.c(根據自己的芯片類型)* │ └─sx12xxEiger <- 這里以它為例,我們只需要以下文件,其他平臺(以上倆目錄)的文件和該目錄下類似。!!!都不需要使用,直接刪除即可!!!* │ │ sx1232-Hal.c* │ │ sx1272-Hal.c* │ │ sx1276-Hal.c 我們僅需要自己選擇的芯片對應的硬件抽象層文件,根據自己的MCU修改里面的代碼(各GPIO、函數中的SPI接口)即可。!! 函數名不能更改!!* └─radio 這個是 LORA的驅動源碼,針對每個不同信號芯片的不同調制模式都有獨立文件。!!!必須根據自己的LoRa芯片選擇對應文件。!!!* radio.c 對于不同LORA芯片的部分操作接口的封裝。這兩文件非常簡單。* radio.h* !!-----這里省略其他文件,其他文件與以下文件類似。以sx1276來進行說明------!!* sx1276-Fsk.c Fsk模式的源碼文件,主要就是對Fsk模式下各寄存器的讀寫函數* sx1276-Fsk.h* sx1276-FskMisc.c Fsk模式的參數配置函數* sx1276-FskMisc.h* sx1276-Hal.h 硬件抽象層對應的頭文件,對應的.c文件在platform目錄下,這倆文件主要就是初始化LORA使用的GPIO及SPI通信。函數在.h文件中以給出。只需要根據自己的平臺實現.c文件即可。* sx1276-LoRa.c LoRa 模式的源碼文件,主要就是LORA模式下各寄存器的讀寫函數。注意:LoRa模式下可以讀取Fsk模式的寄存器。* sx1276-LoRa.h* sx1276-LoRaMisc.c LoRa 模式的參數配置函數,用戶可以直接使用該文件的中的函數對LoRa進行配置(例如頻率、帶款等等)。* sx1276-LoRaMisc.h* sx1276.c 主要是以上兩種模式(LORA、FSK)的統一的對外接口。通過 radio.h 中宏 LORA 是否為 1 區分以上兩種模式* sx1276.h

驅動文件整理

??移植的第一步就是整理源碼文件。舊源代碼在使用 Ride 7 作為 IDE(Ride 7 使用 gcc-arm 作為編譯器)寫出來的,所以在源碼中有些 Ride 7 的文件。下面我們整理一下需要的驅動文件:

配置

移植的第二步就是修改驅動的配置項!

platform.h

??由于源碼實際是一個 Ride 7 項目示例,同時針對多個測試平臺(開發板)的,因此配置文件中有一些和測試平臺相關的代碼。我習慣于不再代碼中殘留一些無用的代碼,所以該清理的清理。清理后如下:

/*!* 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 給出的驅動源碼中,SX1278 可以直接使用 SX1276 的驅動源碼。* 后面也會看到,所有驅動文件的名字均為 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官方給出的不同的外圍電路設計用例。因為其給出的三種電路設計中,使用的芯片引腳等時有區別的。* 因此,這里需要根據硬件設計。來選擇合適的模塊。以下三種硬件電路設計用例,可直接在Semtech官網找到!* 以下幾個宏值,僅在調用初始化時才會用到,具體可查看函數void SX1276LoRaInit( void );這里也需要注意:頻率的問題,源碼對于不同頻率,* 其會選擇不同的配置。*/ #ifdef USE_SX1276_RADIO #define MODULE_SX1276RF1IAS 0 #define MODULE_SX1276RF1JAS 0 #define MODULE_SX1276RF1KAS 1 #endif

整理之后,就上面兩個宏值是必須的!對于每個宏上面的注釋已經很詳細了,不再多說!

sx1276-Hal.c

??這個文件看名字就知道,負責實現驅動庫與實際芯片的通信的封裝。如果看源碼中的示例文件,會發現其中也是很多和測試平臺相關的配置。同樣該清理的清理,最終該文件大體可以分為兩大部分:

  • 包含自己需要的頭文件
  • 實現必須的函數接口。函數接口總的可以分為四大類:
  • LORA 芯片使用 MCU 的 IO 的配置及復位。函數 void SX1276InitIo(void) 用來初始化使用的各 IO。函數 void SX1276SetReset( uint8_t state ) 用來復位模塊。

  • 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 )

    我們只需要根據自己的 SPI 的配置,修改 void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size ) 和 void SX1276WriteBuffer(uint8_t addr, uint8_t *buffer, uint8_t size) 即可,其他幾個接口都是直接調用上面這倆接口的!不知道為啥驅動庫要放出這么多函數。

  • LORA 芯片 獨立 IO 的配置。LORA 芯片有幾個 IO 是需要直接和 MCU 相連的,這些 IO 的高低狀態指示了 LORA 芯片的一些工作狀態。

    • 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 )

    需要注意的是,根據我們的需求,以上 5 個 IO 并不一定全部使用。例如我的就只使用 DIO0、DIO1、DIO3。至于如果選擇,在手冊中有說明這 5 個 IO 的說明。

  • 天線切換接口。inline void SX1276WriteRxTx( uint8_t txEnable )。在 Semtech 給出的設計原理圖中,是需要進行天線狀態的切換的!如果是買的其他廠家的現成的模塊,可能不需要該函數,留空即可!

  • sx1276-Hal.h

    ??還是由于驅動測試遺留的問題,我們必須要修改該文件中的部分代碼。清理一些測試過程中引入的文件,同時定義一個函數函數。具體如下:

    這個文件如果設計的足夠好的話,是不需要用戶來更改的!

    至此,LORA 的驅動移植完成了,接下來就是在自己的開發環境中添加使用的文件、頭文件路徑,然后編譯即可!

    使用

    ??驅動庫通過 radio.h/c 對驅動庫的接口進行了封裝。正常的初始化、收發數據等都是使用 tRadioDriver 中的函數指針。當然,該結構體僅僅是封裝了部分接口。有些功能接口我們還是需要直接使用對應驅動庫頭文件中的函數。

  • 首先調用初始化驅動庫
  • 周期調用 Radio->Process() 以處理驅動庫的狀態機
  • 收發數據 Radio->GetRxPacket( const void *buffer, uint16_t size ); 和 Radio->SetTxPacket( const void *buffer, uint16_t size );
  • 注意

  • 只有 LORA 參數都一致的情況下,兩者才能通信!
  • 默然情況下,LORA 驅動內部是開啟了低速率優化的。
  • 參考

    總結

    以上是生活随笔為你收集整理的LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。