Lora SX1276整理文檔

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章