1. 程式人生 > >Lora sx127x晶片開發筆記

Lora sx127x晶片開發筆記

1、資源蒐集Datasheet 和驅動原始碼

從Semtech官網下載最新驅動程式碼

Datasheet我上傳了資源,中文版和英文版都有,還帶了筆記的

2、過一遍Datasheet,過之前必須對一些英文縮寫有些瞭解,不然會要到處翻

專業術語及其縮寫:

FHSS 跳頻擴頻技術             FIFO 先進先出佇列,這裡代表隊列暫存器  

PA 功率放大器                       LNA 低噪聲放大器

SNR 信噪比                           SF 擴頻因子                                                     

PLL 鎖相環                            CAD 通道活動檢測

CR 編位元速率                              BW 頻寬                                                             

RS符號速率                           Preamble 序頭

。。。

重要引數:

擴頻因子 RegModulationCfg

因為不同擴頻因子(SpreadingFactor)之間為正交關係,因此必須提前獲知鏈路發

送端和接收端的擴頻因子。另外,還必須獲知接收機輸入端的信噪比。在負信噪比條件下信

號也能正常接收,這改善了LoRa接收機的靈敏度、鏈路預算及覆蓋範圍。

注:SF=6 時必須用ImplicitHeader 模式

迴圈糾錯編碼cyclic error coding

訊號頻寬Bandwidth

較低頻段(169 MHz)不支援250kHz和500kHz的頻寬

資料包結構

     序頭preamble                                     報頭 header (可配)                  資料段 payload              校驗碼CRC

對於希望前導碼是固定開銷的情況,可以將前導碼暫存器長度設定在6到65536之間來改變傳送前導碼長度,實際傳送前導碼的長度範圍為6+4至65535+4個符號。這樣幾乎就可以傳送任意長的前導碼序列。接收機會定期執行前導碼檢測。因此,接收機的前導碼長度應與發射機一致。如果前導碼長度為未知或可能會發生變化,應將接收機的前導碼長度設定為最大值。

報頭分顯示報頭模式和隱式報頭模式

低資料速率優化LowDataRateOptimize

當單個符號傳輸時間超過16毫秒時,必須使用LowDataRateOptimize位。注意:發射機和接收機的LowDataRateOptimize位設定必須一致。

有效負載 payload

其實就是資料段,即你要發或者要收的資料

數字暫存器和 數字I/O

暫存器113個,數字I/O也有6個,太多了,具體見Datasheet

操作模式 OpMode

3、分析驅動原始碼

解壓後開啟doc下的README.txt

找到關於sx1276的相關說明如下:

2.1.3 SX1276 driver version V2.1.0

-------------------------------------------------------------------------------

The SX1276 driver is split in 4 parts  (驅動原始碼包含如下四個部分)

1. Generic SX1276 driver.    驅動呼叫介面

  ( src\radio\SX1276.c )

2. SX1272 FSK modem driver.    FSK調製模式用

  ( src\radio\SX1276-Fsk.c andsrc\radio\SX1276-FskMisc.c )

3. SX1272 LoRa modem driver.   LoRa調製模式用

  ( src\radio\SX1276-LoRa.cand src\radio\SX1276-LoRaMisc.c )

4. SX1276 HAL ( Hardware Abstraction Layer ).    硬體抽象層

  (src\platform\sx12xxEiger\SX1276-Hal.c )

1. The generic SX1276 driver implements atleast the functions required by

  the RadioDriver structure defined in src\radio\radio.h file. It offersalso

  the same interface for the FSK or the LoRa modem.

   Inorder to choose which modem to use one must modify the src\radio\radio.h

   file as follows:

   -For FSK modem

       #define LORA                                        0

   -For LoRa modem

       #define LORA                                        1

2. FSK調製的可以跳過不看

3. The LoRa modem driver handles the SX1276as a LoRa modem

   Inorder to change generic LoRa modem settings one must modify the following

  parameters in file src\radio\SX1276-LoRa.c (LoRa模式初始化引數配置的結構體)

  tLoRaSettings LoRaSettings =

   {

     870000000,  // RFFrequency   收發頻率

     20,         // Power  發射功率

     8,          // SignalBw [0: 7.8kHz, 1: 10.4 kHz, 2: 15.6 kHz, 3: 20.8 kHz, 4: 31.2 kHz,    頻寬

                 // 5: 41.6 kHz, 6: 62.5 kHz, 7: 125 kHz, 8:250 kHz, 9: 500 kHz, other: Reserved]

     7,          // SpreadingFactor [6:64, 7: 128, 8: 256, 9: 512,     擴頻因子

                  // 10: 1024, 11: 2048, 12:4096  chips]

     2,          // ErrorCoding [1:4/5, 2: 4/6, 3: 4/7, 4: 4/8]      迴圈糾錯編碼

     true,        // CrcOn   CRC校驗

     false,       // ImplicitHeaderOn   序頭模式

     1,          // RxSingleOn    接收模式中的single模式開關  0代表continue模式

     0,          // FreqHopOn    跳頻開關

     4,          // HopPeriod     跳頻週期

     100,        // TxPacketTimeout   傳送超時時間

     100,        // RxPacketTimeout   接收超時時間

     4           // PayloadLength    負載資料長度

   };

4. The HAL makes the SX1276 driver platformindependent.One must modify each function inside this file

    (src\platform\sx12xxEiger\SX1272-Hal.c ) according to the platform used. 

(根據硬體平臺修改硬體抽象層)

3. How to use the driver:

-------------------------------------------------------------------------------

This driver has been tested for high speedtransmission (up to 100kbps in FSK)

and long payloads (up to 255 bytes in FSK or LoRa). To set a transmission /

reception, it is necessary to:

   -Change the payload length

The payload length for the system isdefined with the parameter BUFFER_SIZE

located in main.c

#define BUFFER_SIZE                                 128 // Definethe payload // size here

The payload length can be configured from 1up to 255

4、用例

自己定義一個函式用來動態的初始化晶片

[cpp] view plain copy  print?
  1. staticvoid RFInit()  
  2. {  
  3.     Radio->LoRaSetOpMode( RFLR_OPMODE_STANDBY );  
  4.     // set the RF settings
  5.     Radio->LoRaSetPa20dBm( false );  
  6.     Radio->LoRaSetRFPower( 5 );  
  7.     Radio->LoRaSetSpreadingFactor( 7 ); // SF6 only operates in implicit header mode.
  8.     Radio->LoRaSetErrorCoding( 1 );  
  9.     Radio->LoRaSetPacketCrcOn( 0 );  
  10.     Radio->LoRaSetSignalBandwidth( 7 );  
  11.     Radio->LoRaSetImplicitHeaderOn( 0 );    
  12.     Radio->LoRaSetSymbTimeout( 0x3FF );  
  13.     Radio->LoRaSetPayloadLength( 128 );  
  14.     Radio->LoRaSetLowDatarateOptimize( true );  
  15.     Radio->LoRaSetFreqHopOn(false);      
  16.     Radio->LoRaSetRxSingleOn(true);  
  17.     Radio->LoRaSetPreambleLength( 6 );   
  18.     Radio->LoRaSetOpMode( RFLR_OPMODE_STANDBY );  
  19. }  
通過RF傳送資料的傳送函式,主要用於收發異頻,收發異頻能減少干擾 [cpp] view plain copy  print?
  1.  INT8U RFWrite(INT8U* buff, INT8U size, INT32U freq )  
  2. {  
  3.     Radio->LoRaSetRFFrequency( freq );// 478750000   DownChannel[10]
  4.     Radio->SetTxPacket( buff, size);  
  5.     while( Radio->Process( ) != RF_TX_DONE );  
  6.     return size;  
  7. }  
通過RF接收資料的接收函式 [cpp] view plain copy  print?
  1. INT8U RFRead(INT8U* buff, INT32U freq, INT8U timeout )  
  2. {  
  3.     uint32_t result;  
  4.     INT16U RxLen;  
  5.     Radio->LoRaSetRFFrequency( freq );   
  6.     Radio->LoRaSetRxPacketTimeout( timeout*1500 );   // 1s = 1500
  7.     Radio->StartRx( );  
  8.     while( 1 )  
  9.     {  
  10.         result = Radio->Process( );///SX1276LoRaProcess
  11.         if( (result == RF_RX_DONE) || (result == RF_RX_TIMEOUT) )  
  12.         {  
  13.             break;  
  14.         }  
  15.     }  
  16.     if( result == RF_RX_DONE )//RFBuffer
  17.     {  
  18.         Radio->GetRxPacket( buff, &RxLen );  
  19.         return RxLen;  
  20.     }  
  21.     else
  22.     {  
  23.         return 0;  
  24.     }  
  25. }