lora Sx1278模塊
1、初始化
(1)首次先對SPI的IO口初始化可通過硬件SPI和軟件模擬SPI
(2)模塊在初始化之前應先復位模塊,reset針腳主要對模塊重啓有作用低電平有限高電平運行,這個針腳主要在是初始化的時候操作,初始化成功之後嚴禁使用此針腳了,要保持reset針腳爲高電平時刻保持運行狀態
(3)首次讀寫寄存器時會出現不準的現象。所以我們在初始化之前吧這個問題解決,我採用讀取0x42寄存器裏面的值 直到0x12爲止,(0x42寄存器:芯片版本ID:默認值爲0x12)
(4)設置爲睡眠模式
//設置收發器模式
void LoRaSetOpMode(LoRa_OpMode mode )
{
uint8_t opModePrev;
opModePrev=SX127x_ReadREG(REG_LR_OPMODE);
opModePrev &=0xf8;
opModePrev |= (uint8_t)mode;
SX127x_WriteREG( REG_LR_OPMODE, opModePrev);
}
設置收發器模式,要對0x01寄存器的前三位進行操作
000--->睡眠
001--->待機
010--->頻率合成去轉換值TX頻率
011--->發送模式
100--->頻率合成去轉換值RX頻率
101--->接收模式
110--->單次接收模式(可預留)
111--->CAD模式(可預留)
(5)設置爲LORA模式
//設置調製模式
void LoRaSetFskMode( LoRa_ModulationMode mode )
{
uint8_t opModePrev;
opModePrev=SX127x_ReadREG(REG_LR_OPMODE);
opModePrev &=0x7F;
opModePrev |= (uint8_t)mode;
SX127x_WriteREG( REG_LR_OPMODE, opModePrev);
}
讀取0x01寄存器裏面的值對第七位進行操作
0--->FSK/OOK模式
1---->Lora模式
該位只能在模塊睡眠模式下操作
(6)設置爲待機模式
與(4)步驟相同
(7)GPIO口的功能映設
0x40 寄存器寫0x00 對DI0---DI3開啓功能映射
0x41寄存器寫0x00 DI4 5 開啓功能映射
(8)設置頻率
//設置頻率(在設置頻率的時候避開32M的倍數頻率,如果設置爲32M的倍數頻率的接收靈敏度就會很低,會影響距離)
void LoRaSetRFFrequency(uint32_t f)
{
uint32_t value = (uint32_t)((double)f / 61.03515625);
uint8_t buffer[3];
buffer[0] = (uint8_t)(value >> 16 & 0xFF);
buffer[1] = (uint8_t)(value >> 8 & 0xFF);
buffer[2] = (uint8_t)(value >> 0 & 0xFF);
//--//
SX127x_WriteREG( REG_LR_FRFMSB, buffer[0]);
SX127x_WriteREG( REG_LR_FRFMID, buffer[1]);
SX127x_WriteREG( REG_LR_FRFLSB, buffer[2]);
//printf("F0=%X,%X,%X\r\n", buffer[0], buffer[1], buffer[2]);
}
分別對寄存器0x06 0x07 0x08 寫入頻率的最高有效位 中間 有效位 最低有效位
(9)設置功率
//設置功率
void LoRaSetRFPower(uint8_t power )
{
SX127x_WriteREG( REG_LR_PADAC, 0x87); //high power
SX127x_WriteREG( REG_LR_PACONFIG, m_power_data[power] );//PA選擇和輸出功率控制
}
0x4D PA更大功率設置 高功率值爲0x87
注:在使用PAL-LF或PA——HF時,高功率必須關閉
0x09PA選擇和輸出功率控制
(10)設置擴頻因子
//設置擴頻因子(碼片速度=符號速度*擴頻因子)
void LoRaSetSpreadingFactor(uint8_t factor )
{
uint8_t data;
LoRaSetNbTrigPeaks( 3 ); //0x03-->SF7 to SF12
data=SX127x_ReadREG( REG_LR_MODEMCONFIG2);
data = ( data & RFLR_MODEMCONFIG2_SF_MASK ) | ( factor << 4 );
SX127x_WriteREG( REG_LR_MODEMCONFIG2, data );
//printf("factor=%X\r\n", data);
}
//設置
void LoRaSetNbTrigPeaks(uint8_t value )
{
uint8_t data;
data = SX127x_ReadREG( 0x31);
data = ( data & 0xF8 ) | value;
SX127x_WriteREG( 0x31, data );
}
(11)設置編碼率
//設置編碼率
void LoRaSetErrorCoding(uint8_t value )
{
uint8_t data;
data=SX127x_ReadREG( REG_LR_MODEMCONFIG1);
data = ( data & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | ( value << 1 );
SX127x_WriteREG( REG_LR_MODEMCONFIG1, data);
//printf("Coding=%d\r\n", data);
}
(12)開啓CRC校驗
//開啓CRC校驗
void LoRaSetPacketCrcOn(BOOL enable )
{
uint8_t data;
data= SX127x_ReadREG( REG_LR_MODEMCONFIG2);
data = ( data & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | ( (enable?1:0) << 2 );
SX127x_WriteREG( REG_LR_MODEMCONFIG2, data );
}
(13)設置擴頻帶寬
//設置擴頻帶寬(建議最低不要小於125K)
void LoRaSetSignalBandwidth(uint8_t bw )
{
uint8_t data;
data=SX127x_ReadREG( REG_LR_MODEMCONFIG1);
data = ( data & RFLR_MODEMCONFIG1_BW_MASK ) | ( bw << 4 );
SX127x_WriteREG( REG_LR_MODEMCONFIG1, data );
//printf("bw=%d\r\n", data);
}
(14)同步頭是顯示
//開啓同步頭顯性模式
void LoRaSetImplicitHeaderOn(BOOL enable )
{
uint8_t data;
data=SX127x_ReadREG( REG_LR_MODEMCONFIG1); //讀0x1D寄存器
data = ( data & RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) | ( enable?1:0 );
SX127x_WriteREG( REG_LR_MODEMCONFIG1, data );
}
(15)設置符合長度
//設置負荷長度
void LoRaSetPayloadLength(uint8_t value )
{
SX127x_WriteREG( REG_LR_PAYLOADLENGTH, value ); //寫0x22寄存器
}
(16)設置超時時間
//設置超時時間
void LoRaSetSymbTimeout(unsigned int value )
{
uint8_t buffer[2];
buffer[0]=SX127x_ReadREG( REG_LR_MODEMCONFIG2); //讀0x1E寄存器
buffer[1]=SX127x_ReadREG( REG_LR_SYMBTIMEOUTLSB); //讀0x1F寄存器
buffer[0] = ( buffer[0] & RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) | ( ( value >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK );
buffer[1] = value & 0xFF;
SX127x_WriteREG( REG_LR_MODEMCONFIG2, buffer[0]);
SX127x_WriteREG( REG_LR_SYMBTIMEOUTLSB, buffer[1]);
}
(17)開啓低數據優化
//開啓低數據優化
void LoRaSetMobileNode(BOOL enable )
{
uint8_t data;
data=SX127x_ReadREG( REG_LR_MODEMCONFIG3); //讀0x26寄存器
data = ( data & RFLR_MODEMCONFIG3_MOBILE_NODE_MASK ) | ( (enable?1:0) << 3 );
SX127x_WriteREG( REG_LR_MODEMCONFIG3, data );
}
LORA參數的配置請查看SX1276中文說明書115頁
2、發送數據
//發送數據
int SX127x_SendData(uint8_t *buffer,uint8_t offset,uint8_t size)
{
uint8_t i;
LoRaSetOpMode( LoRa_OpMode_Stdby );
SX127x_WriteREG(REG_LR_HOPPERIOD, 0 ); //不做頻率跳變
SX127x_WriteREG(REG_LR_DIOMAPPING1, 0x40 ); //發射中斷映射到DIO0引腳
SX127x_WriteREG(REG_LR_DIOMAPPING2, 0x00 );
SX127x_WriteREG(REG_LR_IRQFLAGS, 0xff);
SX127x_WriteREG(REG_LR_IRQFLAGSMASK,IRQN_TXD_Value); //打開發送中斷
SX127x_WriteREG(REG_LR_PAYLOADLENGTH, size); //設置數據長度
SX127x_WriteREG( REG_LR_FIFOTXBASEADDR, 0); //寫Tx FIFO基址
SX127x_WriteREG( REG_LR_FIFOADDRPTR, 0 ); //SPI interface address pointer in FIFO data buffer
SX127x_Ctrl_CS(FALSE); //開片選
SPIx_Write( 0x80 );
for(i=0;i<size;i++) SPIx_Write(buffer[i+offset]);
SX127x_Ctrl_CS(TRUE); //關片選
LoRaSetOpMode( LoRa_OpMode_Tx ); //設置爲傳輸模式
g_LoRa_State = LoRa_State_TXING;
int timeover=1000;
while(timeover-->0)
{
if((SX127x_ReadREG(REG_LR_IRQFLAGS) & 0x08) == 0x08)
{
LoRaSetReceiveMode(); //每次發送完數據之後就會進入接收模式
return 0;
}
LOS_TaskDelay(3);
}
LoRaSetReceiveMode();
return -1;
}
3、接收數據
int SX127x_ReadData(uint8_t *buffer,uint8_t offset,uint8_t size)
{
uint8_t state = SX127x_ReadREG(REG_LR_IRQFLAGS);
if ((state & 0x40) == 0x40)
{
SX127x_WriteREG(REG_LR_FIFOADDRPTR, 0x00);//請fif0
uint8_t len = SX127x_ReadREG(REG_LR_NBRXBYTES); //獲取最後一幅數據包的負載字節數
memset(&buffer[offset],0,size);//數組置0
SX127x_Ctrl_CS(FALSE); //開片選
SPIx_Write( 0x00 );
for(int i=0;i<len;i++) buffer[i+offset] = SPIx_Read(1);
SX127x_Ctrl_CS(TRUE); //關片選
//清Fifo
//SX127x_WriteREG(REG_LR_FIFOADDRPTR, 0x00);// 原先被註釋了
if ((state & 0x20) == 0)
{
return len;
}
}
return -1;
}
5、設置接收模式
void LoRaSetReceiveMode (void)
{
LoRaSetOpMode(LoRa_OpMode_Stdby );
SX127x_WriteREG(REG_LR_HOPPERIOD, PACKET_MIAX_Value );
SX127x_WriteREG( REG_LR_DIOMAPPING1, 0x00 );
SX127x_WriteREG( REG_LR_DIOMAPPING2, 0x00 );
SX127x_WriteREG(REG_LR_IRQFLAGS, 0xff);
SX127x_WriteREG(REG_LR_IRQFLAGSMASK,IRQN_RXD_Value);
LoRaSetOpMode( LoRa_OpMode_Rx );
g_LoRa_State=LoRa_State_RXING;
}
7、設置睡眠模式
void LoRaSetSleepMode(void)
{
LoRaSetOpMode( LoRa_OpMode_Stdby );//0x01 設置待機模式
SX127x_WriteREG(REG_LR_IRQFLAGSMASK, IRQN_SEELP_Value); //????
SX127x_WriteREG( REG_LR_DIOMAPPING1, 0X00 );
SX127x_WriteREG( REG_LR_DIOMAPPING2, 0X00 );
LoRaSetOpMode( LoRa_OpMode_Sleep );
g_LoRa_State = LoRa_State_SLEEP;
}
8、設置CAD模式
答:
9、中斷映射的關係
答:
答:
SX1276/7/8的6個DIO通用IO引腳在LoRa模式下均可用。它們的映射關係取決於RegDioMapping1和RegDioMapping2這兩個寄存器的配置,如下表:
DI0:發送完成中斷、接受完成中斷、CAD完成中斷
DI1:接受超時中斷、 Fhss通道改變中斷、Fhss通道改變中斷
從表中可以看出,DIO0最常用,主要是發送/接受/CAD完成的中斷產生
調制解調器狀態指示符
RegModemStat中的ModemStatus位顯示了LoRa調制解調器的狀態,這些位多用於Rx模式下的調試,包括:
位0:Signal Detected 表示檢測到了一個有效的LoRa前導碼
位1:Signal Synchronized 表示檢測到了前導碼的結尾
位2:Header Info Valid 當檢測到有效報頭(既正確CRC的Header),變爲高電平
終端寄存器彙總:
10、lora低功耗的實現
答:
另外8、10、 問題搞得還不是很清楚,以後會進行補充。
文檔鏈接:https://download.csdn.net/download/mfx473185547/10755316