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?- staticvoid RFInit()
- {
- Radio->LoRaSetOpMode( RFLR_OPMODE_STANDBY );
- // set the RF settings
- Radio->LoRaSetPa20dBm( false );
- Radio->LoRaSetRFPower( 5 );
- Radio->LoRaSetSpreadingFactor( 7 ); // SF6 only operates in implicit header mode.
- Radio->LoRaSetErrorCoding( 1 );
- Radio->LoRaSetPacketCrcOn( 0 );
- Radio->LoRaSetSignalBandwidth( 7 );
- Radio->LoRaSetImplicitHeaderOn( 0 );
- Radio->LoRaSetSymbTimeout( 0x3FF );
- Radio->LoRaSetPayloadLength( 128 );
- Radio->LoRaSetLowDatarateOptimize( true );
- Radio->LoRaSetFreqHopOn(false);
- Radio->LoRaSetRxSingleOn(true);
- Radio->LoRaSetPreambleLength( 6 );
- Radio->LoRaSetOpMode( RFLR_OPMODE_STANDBY );
- }
- INT8U RFWrite(INT8U* buff, INT8U size, INT32U freq )
- {
- Radio->LoRaSetRFFrequency( freq );// 478750000 DownChannel[10]
- Radio->SetTxPacket( buff, size);
- while( Radio->Process( ) != RF_TX_DONE );
- return size;
- }
- INT8U RFRead(INT8U* buff, INT32U freq, INT8U timeout )
- {
- uint32_t result;
- INT16U RxLen;
- Radio->LoRaSetRFFrequency( freq );
- Radio->LoRaSetRxPacketTimeout( timeout*1500 ); // 1s = 1500
- Radio->StartRx( );
- while( 1 )
- {
- result = Radio->Process( );///SX1276LoRaProcess
- if( (result == RF_RX_DONE) || (result == RF_RX_TIMEOUT) )
- {
- break;
- }
- }
- if( result == RF_RX_DONE )//RFBuffer
- {
- Radio->GetRxPacket( buff, &RxLen );
- return RxLen;
- }
- else
- {
- return 0;
- }
- }