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

      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

        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、中断映射的关系

答:

答:

Lora SX1276整理文档_第1张图片

SX1276/7/8的6个DIO通用IO引脚在LoRa模式下均可用。它们的映射关系取决于RegDioMapping1和RegDioMapping2这两个寄存器的配置,如下表:

Lora SX1276整理文档_第2张图片

DI0:发送完成中断、接受完成中断、CAD完成中断

DI1:接受超时中断、 Fhss通道改变中断、Fhss通道改变中断

 

从表中可以看出,DIO0最常用,主要是发送/接受/CAD完成的中断产生

调制解调器状态指示符

RegModemStat中的ModemStatus位显示了LoRa调制解调器的状态,这些位多用于Rx模式下的调试,包括:

 

位0:Signal Detected 表示检测到了一个有效的LoRa前导码

位1:Signal Synchronized 表示检测到了前导码的结尾

位2:Header Info Valid 当检测到有效报头(既正确CRC的Header),变为高电平

终端寄存器汇总:

Lora SX1276整理文档_第3张图片

10、lora低功耗的实现

答:

另外8、10、 问题搞得还不是很清楚,以后会进行补充。

 

文档链接:https://download.csdn.net/download/mfx473185547/10755316

你可能感兴趣的:(Lora,Lora,Sx1278,Stm32)