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