一、对lora_sx1278v1.2模块通信记录梳理
一、通信测试:
注意:
1、检查供电是否满足。
2、检测引脚是否松动或虚焊。
3、检测触发是否能触发。
引脚作用:
SPI:通信(仅作一次初始化,初始化后会进行模块通信返回测试,返回值和预定值相否即报错,并不会进入接收于发送中)
NSS:片选(输出)
RST:复位(输出)
D0:信号通知(输入)
D1:信号通信(输入)
main
tLoRaSettings stting={435000000,20,7,12,1,0x0005}; //频率435M,功率20dbm,带宽125kHz,SF=12,误码编码率4/5,前导码长度0x0005g_Radio.Init(&stting);while(1) exampleRx(); // exampleRx();发送调用中需要指定发送数据的缓存区__IO uint32_t g_u32SystickCount=0;
uint32_t GetTick(void)
{return g_u32SystickCount;
}
void SysTick_Handler(void)
{HAL_IncTick();g_u32SystickCount++;
}
dirver
说明:比较原本的驱动文件删减了cad相关文件以及阻塞相关的发送,接收相关的内容。
对spi的发送接收函数做了更改。
驱动代码:
.h
typedef struct _sLoRaSettings
{uint32_t RFFrequency; //频率,单位Hzint8_t Power; //发射功率2~20uint8_t SignalBw; // 带宽 [0: 7.8 kHz, 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] 带宽uint8_t SpreadingFactor;// 扩频因子 [6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048, 12: 4096 chips] 扩频因子uint8_t ErrorCoding; // 误码编码率 [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] 编码率uint16_t PreambleLength; //前导码长度
}tLoRaSettings;//定义模块状态机(这个是返回给用户看的,实际模块执行的状态机比这个多)
typedef enum
{RF_IDLE, //空闲状态RF_BUSY, //模块执行任务中RF_RX_DONE, //接收完成RF_RX_TIMEOUT, //接收超时RF_TX_DONE, //发送完成RF_TX_TIMEOUT, //发送超时RF_CAD_DETECTED, //CAD检测到前导码RF_CAD_EMPTY, //CAD检测完成,没有检测到前导码RF_CAD_TIMEOUT, //CAD超时RF_UNKNOW_STATUS //异常状态机
}tRFProcessReturnCodes;//硬件工作模式
typedef enum{LORA_OPMODE_SLEEP=0,LORA_OPMODE_STANDBY,LORA_OPMODE_SYNTHESIZER_TX,LORA_OPMODE_TRANSMITTER,LORA_OPMODE_SYNTHESIZER_RX,LORA_OPMODE_RECEIVER,LORA_OPMODE_RECIVER_SINGLE,LORA_OPMODE_CAD,
}LoRaOpModeType;//驱动结构体,用来保存相关操作的函数
typedef struct sRadioDriver
{void ( *Init )( tLoRaSettings *stting );void ( *Reset )( void );void ( *StartRx )( uint32_t timeoutSystick );void ( *GetRxPacket )( void *buffer, uint16_t *size );void ( *SetTxPacket )( const void *buffer, uint16_t size,uint32_t timeoutSystick);void ( *StartCAD )( void );tRFProcessReturnCodes ( *Process )( void );
}tRadioDriver;extern tRadioDriver g_Radio;void sx127xInit(tLoRaSettings *stting);
void Sx127xRestart(void);
void SX127xSetLoRaMode(void);
void Write127xReg(uint8_t addr,uint8_t data);
uint8_t Read127xReg(uint8_t addr);
void SX127xWriteFifo( uint8_t *buffer, uint8_t size );
void SX127xReadFifo( uint8_t *buffer, uint8_t size );
void SX127xSetOpMode(LoRaOpModeType opMode);
LoRaOpModeType SX127xGetOpMode(void);
void SX127xSetFrf(uint32_t fr);
tRFProcessReturnCodes SX127xProcess( void );
.c
#define DEFAUTL_TIMEOUT 1000
static void Sx127xStartRx(uint32_t timeoutSystick);
static void SX127xSetTxPacket( const void *buffer, uint16_t size,uint32_t timeoutSystick);
static void Sx127xReadRxPackage( void *buffer, uint16_t *size );
static void Sx127xStartCADCheck(void);tRadioDriver g_Radio ={sx127xInit,Sx127xRestart,Sx127xStartRx,Sx127xReadRxPackage,SX127xSetTxPacket,Sx127xStartCADCheck,SX127xProcess};static void SX1278ReadBuffer(uint8_t addr,uint8_t *buffer,uint8_t size);
static void SX1278WriteBuffer(uint8_t addr,uint8_t *buffer,uint8_t size);
static uint8_t u8_SFList[]={RFLR_MODEMCONFIG2_SF_6,RFLR_MODEMCONFIG2_SF_7,RFLR_MODEMCONFIG2_SF_8,RFLR_MODEMCONFIG2_SF_9,RFLR_MODEMCONFIG2_SF_10,RFLR_MODEMCONFIG2_SF_11,RFLR_MODEMCONFIG2_SF_12};
static uint8_t u8_CRList[]={RFLR_MODEMCONFIG1_CODINGRATE_4_5,RFLR_MODEMCONFIG1_CODINGRATE_4_6,RFLR_MODEMCONFIG1_CODINGRATE_4_7,RFLR_MODEMCONFIG1_CODINGRATE_4_8};
static uint8_t u8_BWList[]={RFLR_MODEMCONFIG1_BW_7_81_KHZ,RFLR_MODEMCONFIG1_BW_10_41_KHZ,RFLR_MODEMCONFIG1_BW_15_62_KHZ,RFLR_MODEMCONFIG1_BW_20_83_KHZ,RFLR_MODEMCONFIG1_BW_31_25_KHZ,RFLR_MODEMCONFIG1_BW_41_66_KHZ,RFLR_MODEMCONFIG1_BW_62_50_KHZ,RFLR_MODEMCONFIG1_BW_125_KHZ,RFLR_MODEMCONFIG1_BW_250_KHZ,RFLR_MODEMCONFIG1_BW_500_KHZ};
static uint32_t softTimeout=DEFAUTL_TIMEOUT; //软件超时时间(这个使用systick计时的,单位是1systick)
static tLoRaSettings localSettingSave={435000000,20,7,7,1,0x000f}; //本地保存的配置信息,用于在复位后重新初始化
volatile static tRFLRStates loraStatus=RFLR_STATE_IDLE; //当前射频状态机(不是返回给用户的tRFProcessReturnCodes,这个比用户给用户的状态多)/*** 初始化LoRa配置函数* 参数* stting:配置结构体,传入需要设置的参数,eg{435000000,20,8,7,1},具体内容查看 tLoRaSettings 定义,如果传入NULL,表示加载上次的设置(上次没有就加载默认设置)*/
void sx127xInit(tLoRaSettings *stting){Sx127xRestart();while(0x6c!=Read127xReg(0x06)){DEBUG("[ERROR %s()-%d]spi error\r\n",__func__,__LINE__);Soft_delay_ms(100);}DEBUG("spi init ok\r\n");SX127xSetLoRaMode();if(NULL!=stting){memcpy(&localSettingSave,stting,sizeof(tLoRaSettings)); //复制配置信息}stting=&localSettingSave; //setting指向备份数据,避免修改导致setting原值改变if(stting->SignalBw>9){DEBUG("[WARRING %s()-%d]setting error,auto fix\r\n",__func__,__LINE__);stting->SignalBw=9;}if(stting->ErrorCoding>4){DEBUG("[WARRING %s()-%d]setting error,auto fix\r\n",__func__,__LINE__);stting->ErrorCoding=4;}if(stting->ErrorCoding<1){DEBUG("[WARRING %s()-%d]setting error,auto fix\r\n",__func__,__LINE__);stting->ErrorCoding=1;}if(stting->SpreadingFactor>12){DEBUG("[WARRING %s()-%d]setting error,auto fix\r\n",__func__,__LINE__);stting->SpreadingFactor=12;}if(stting->SpreadingFactor<6){DEBUG("[WARRING %s()-%d]setting error,auto fix\r\n",__func__,__LINE__);stting->SpreadingFactor=6;}if(stting->Power>20){DEBUG("[WARRING %s()-%d]setting error,auto fix\r\n",__func__,__LINE__);stting->Power=20;}SX127xSetFrf(stting->RFFrequency);//设置频率Write127xReg(REG_LR_MODEMCONFIG1,u8_BWList[stting->SignalBw]|u8_CRList[stting->ErrorCoding -1]|RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF);//设置带宽、纠错编码率Write127xReg(REG_LR_MODEMCONFIG2,u8_SFList[stting->SpreadingFactor-6] | RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF|RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON|0x03);//设置SD,CRC,超时时间Write127xReg(REG_LR_SYMBTIMEOUTLSB,0xFF);//设置超时时间Write127xReg(REG_LR_MODEMCONFIG3,0x0C);//设置低速率(包长超过16ms必须打开)if(stting->Power>17){Write127xReg(REG_LR_PACONFIG,0x80+stting->Power-5);//设置功率Write127xReg(0x4d,0x87);//设置更大功率}else{Write127xReg(REG_LR_PACONFIG,0x80+stting->Power-2);//设置功率Write127xReg(0x4d,0x84);//关闭更大功率}Write127xReg(REG_LR_OCP,0x3B);//过流保护//设置前导码长度 REG_LR_PREAMBLEMSBWrite127xReg(REG_LR_PREAMBLEMSB,stting->PreambleLength>>8); //前导码高有效位Write127xReg(REG_LR_PREAMBLELSB,stting->PreambleLength&0x00ff); //前导码低有效位
}void Sx127xRestart(void){SX127X_ResetPinControl(0);Soft_delay_ms(10);SX127X_ResetPinControl(1);Soft_delay_ms(10);loraStatus=RFLR_STATE_IDLE;
}//设置为LoRa模式
void SX127xSetLoRaMode(void)
{if(0!=(Read127xReg(REG_LR_OPMODE)&RFLR_OPMODE_LONGRANGEMODE_ON)){return;//当前处于LoRa模式}SX127xSetOpMode(LORA_OPMODE_SLEEP);Write127xReg(REG_LR_OPMODE,Read127xReg(REG_LR_OPMODE)|RFLR_OPMODE_LONGRANGEMODE_ON);//设置为LoRa模式(只有在 LORA_OPMODE_SLEEP 模式下才能操作)
}//写sx1278寄存器
void Write127xReg(uint8_t addr,uint8_t data){SX1278WriteBuffer( addr,&data, 1 );
}//读sx1278寄存器
uint8_t Read127xReg(uint8_t addr){uint8_t u8_recive;SX1278ReadBuffer( addr, &u8_recive, 1 );return u8_recive;
}//写sx1278 fifo
void SX127xWriteFifo( uint8_t *buffer, uint8_t size )
{SX1278WriteBuffer( 0, buffer, size );
}//读sx1278 fifo
void SX127xReadFifo( uint8_t *buffer, uint8_t size )
{SX1278ReadBuffer( 0, buffer, size );
}//设置OpMode
void SX127xSetOpMode(LoRaOpModeType opMode)
{if(opMode==SX127xGetOpMode()){return;//当前模式正确,不用切换}Write127xReg(REG_LR_OPMODE,(Read127xReg(REG_LR_OPMODE)&RFLR_OPMODE_MASK)|opMode|RFLR_OPMODE_FREQMODE_ACCESS_LF );Soft_delay_ms(1);
}//获取OpMode
LoRaOpModeType SX127xGetOpMode(void)
{return (LoRaOpModeType)(Read127xReg(REG_LR_OPMODE)&RFLR_OPMODE_MASK);
}static void SX1278ReadBuffer(uint8_t addr,uint8_t *buffer,uint8_t size)
{uint8_t i;uint8_t rx_d;//NSS = 0;SpiNSSEnable(0); //片选spi1SpiInOut(addr & 0x7F,&rx_d);for( i = 0; i < size; i++ ){SpiInOut(0x00,&buffer[i]);//读取数据}//NSS = 1;SpiNSSEnable(1);
}static void SX1278WriteBuffer(uint8_t addr,uint8_t *buffer,uint8_t size)
{uint8_t i;uint8_t rx_d=0;//NSS = 0;SpiNSSEnable(0);SpiInOut(addr | 0x80,&rx_d );for( i = 0; i < size; i++ ){SpiInOut(buffer[i],&rx_d);//写入数据}//NSS = 1;SpiNSSEnable(1);
}//设置载波频率
void SX127xSetFrf(uint32_t fr)
{uint8_t frfBuf[4];fr=fr*0.016384;//根据数据手册计算寄存器要设置的值memcpy(frfBuf,&fr,4);SX127xSetOpMode(LORA_OPMODE_SLEEP);Write127xReg(REG_LR_FRFMSB,frfBuf[2]);Write127xReg(REG_LR_FRFMID,frfBuf[1]);Write127xReg(REG_LR_FRFLSB,frfBuf[0]);
}//非阻塞状态轮询函数
tRFProcessReturnCodes SX127xProcess( void )
{uint32_t currTick=0;static uint32_t systickBak=0;switch(loraStatus){case RFLR_STATE_IDLE:return RF_IDLE;case RFLR_STATE_RX_INIT:SX127xSetOpMode(LORA_OPMODE_STANDBY);Write127xReg( REG_LR_FIFORXBASEADDR, 0 );//将接收buf的基地址指向0x00,此时整个fifo都可以用来接收数据Write127xReg( REG_LR_FIFOADDRPTR, 0 );//将fifi读写指针执行0x00,此时向寄存器0x00读写数据指针会自增的从fifo中读取数据Write127xReg( REG_LR_SYMBTIMEOUTLSB, 0xFF );//配置 0x1f rx超时//配置中断Write127xReg( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |//RFLR_IRQFLAGS_RXDONE |RFLR_IRQFLAGS_PAYLOADCRCERROR |RFLR_IRQFLAGS_VALIDHEADER |RFLR_IRQFLAGS_TXDONE |RFLR_IRQFLAGS_CADDONE |RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |RFLR_IRQFLAGS_CADDETECTED );// DIO0=RxDone 0x00, DIO2=RxTimeout 0x00Write127xReg( REG_LR_DIOMAPPING1, ( Read127xReg( REG_LR_DIOMAPPING1) & RFLR_DIOMAPPING1_DIO0_MASK) | RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00);SX127xSetOpMode(LORA_OPMODE_RECEIVER);//连续接收//SX127xSetOpMode( LORA_OPMODE_RECIVER_SINGLE );//单次接收Read127xReg(REG_LR_IRQFLAGS);//设置接收后读写任意寄存器可以开始接收systickBak=GET_TICK_COUNT();loraStatus=RFLR_STATE_RX_RUNNING;return RF_BUSY;case RFLR_STATE_RX_RUNNING:if(1==SX1276ReadDio0()){Write127xReg(REG_LR_IRQFLAGS,RFLR_IRQFLAGS_RXDONE);//清除中断标志位loraStatus=RFLR_STATE_RX_DONE;return RF_BUSY;}if(1==SX1276ReadDio1()){Write127xReg(REG_LR_IRQFLAGS,RFLR_IRQFLAGS_RXTIMEOUT);//清除中断标志位loraStatus=RFLR_STATE_RX_TIMEOUT;return RF_BUSY;}currTick=GET_TICK_COUNT();if(currTick>=systickBak){if(currTick-systickBak>softTimeout){loraStatus=RFLR_STATE_RX_TIMEOUT;return RF_BUSY;}}else{//currTick溢出了if(currTick+(~systickBak)>softTimeout){loraStatus=RFLR_STATE_RX_TIMEOUT;return RF_BUSY;}}return RF_BUSY;case RFLR_STATE_RX_DONE:return RF_RX_DONE;case RFLR_STATE_RX_TIMEOUT:return RF_RX_TIMEOUT;case RFLR_STATE_TX_INIT:systickBak=GET_TICK_COUNT();return RF_BUSY;case RFLR_STATE_TX_RUNNING:if(1==SX1276ReadDio0()){Write127xReg(REG_LR_IRQFLAGS,RFLR_IRQFLAGS_TXDONE);//清除中断标志位loraStatus=RFLR_STATE_TX_DONE;return RF_BUSY;}if(1==SX1276ReadDio0()){//接收完成Write127xReg(REG_LR_IRQFLAGS,RFLR_IRQFLAGS_TXDONE);//清除中断标志位loraStatus=RFLR_STATE_TX_DONE;return RF_BUSY;}currTick=GET_TICK_COUNT();if(currTick>=systickBak){if(currTick-systickBak>softTimeout){loraStatus=RFLR_STATE_TX_TIMEOUT;}}else{//currTick溢出了if(currTick+(~systickBak)>softTimeout){loraStatus=RFLR_STATE_TX_TIMEOUT;}}return RF_BUSY;case RFLR_STATE_TX_DONE:return RF_TX_DONE;case RFLR_STATE_TX_TIMEOUT:return RF_TX_TIMEOUT;case RFLR_STATE_CAD_INIT:return RF_BUSY;case RFLR_STATE_CAD_RUNNING:return RF_BUSY; //RF_CAD_DETECTEDcase RFLR_STATE_CAD_DETECTED:return RF_CAD_DETECTED;case RFLR_STATE_CAD_EMPTY:return RF_CAD_EMPTY;case RFLR_STATE_CAD_TIMEOUT:return RF_CAD_TIMEOUT;default:return RF_UNKNOW_STATUS;}//return RF_UNKNOW_STATUS;
}//非阻塞发送数据(需要配合 轮询 SX127xProcess() 使用)
//buffer:要发送的数据
//size:发送长度
//timeoutSystick:软件超时时间(用systick计时,单位是1systick),0表示使用默认值
static void SX127xSetTxPacket( const void *buffer, uint16_t size ,uint32_t timeoutSystick){loraStatus=RFLR_STATE_TX_INIT;if(size>255){size=255;}if(timeoutSystick>0){softTimeout=timeoutSystick;}else{softTimeout=DEFAUTL_TIMEOUT;}Write127xReg( REG_LR_PAYLOADLENGTH, size ); //设置负载长度Write127xReg( REG_LR_FIFOTXBASEADDR, 0 );//将发送buf的基地址指向0x00,此时整个fifo都可以用来发送数据Write127xReg( REG_LR_FIFOADDRPTR, 0 );//将fifi读写指针执行0x00,此时向寄存器0x00读写数据指针会自增的将数据写入fifoSX127xSetOpMode(LORA_OPMODE_STANDBY);//LORA_OPMODE_SLEEP 模式不能读写fifoSX127xWriteFifo((uint8_t *)buffer,size); //将要发送的数据写入fifo//开启中断屏蔽位(只留下了 RFLR_IRQFLAGS_TXDONE 中断没有屏蔽掉)Write127xReg( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |RFLR_IRQFLAGS_RXDONE |RFLR_IRQFLAGS_PAYLOADCRCERROR |RFLR_IRQFLAGS_VALIDHEADER |//RFLR_IRQFLAGS_TXDONE |RFLR_IRQFLAGS_CADDONE |RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |RFLR_IRQFLAGS_CADDETECTED );Write127xReg( REG_LR_DIOMAPPING1, ( Read127xReg( REG_LR_DIOMAPPING1 ) & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_01 );//DIO0设置为TXdone中断//DEBUG("DIO0=%d\r\n0x06:%02x\r\n",SX1276ReadDio0(),Read127xReg(0x06));SX127xProcess(); //调用这个是为了更新systickSX127xSetOpMode(LORA_OPMODE_TRANSMITTER); //设置为发送模式Read127xReg(REG_LR_IRQFLAGS);//设置发送后读写任意寄存器可以开始发送loraStatus=RFLR_STATE_TX_RUNNING;
}//非阻塞接收函数(需要配合 轮询 SX127xProcess() 使用)
//timeoutSystick:软件超时时间(用systick计时,单位是1systick),0表示使用默认值
static void Sx127xStartRx(uint32_t timeoutSystick)
{if(timeoutSystick>0){softTimeout=timeoutSystick;}else{softTimeout=DEFAUTL_TIMEOUT;}loraStatus=RFLR_STATE_RX_INIT;
}//读取fifo中接收到的数据
static void Sx127xReadRxPackage( void *buffer, uint16_t *size )
{//读取数据uint16_t tmpReciveLength;tmpReciveLength=Read127xReg(REG_LR_NBRXBYTES);if(tmpReciveLength > *size){tmpReciveLength=*size;}else{*size=tmpReciveLength;}SX127xReadFifo(buffer,tmpReciveLength);
}
//非阻塞 开启一次CAD检测(需要配合 轮询 SX127xProcess() 使用)
static void Sx127xStartCADCheck(void){loraStatus=RFLR_STATE_CAD_INIT;
}
hal
hal调用文件
#define DEBUG( format , ... ) printf( format , ##__VA_ARGS__ ) //打印log信息的函数,可以不设置
#define GET_TICK_COUNT() GetTick() //获取systick的函数void Soft_delay_ms(uint16_t time)
{ HAL_Delay(time);
}
//spi发送和接收函数
uint8_t SpiInOut( uint8_t outData,uint8_t *inDate )
{/* Send SPIy data */ if(HAL_SPI_TransmitReceive(&hspi1,&outData, inDate,1,0xFFFF )==HAL_OK){return 1;}else{ return 0;}
}
//spi片选,status=0使能(NSS拉低)status=1失能(NSS拉高)
void SpiNSSEnable( uint8_t status )
{HAL_GPIO_WritePin(GPIOD, nss_Pin, status);
}//复位引脚控制status=0拉低,其他拉高
void SX127X_ResetPinControl( uint8_t status )
{HAL_GPIO_WritePin(GPIOD, rst_Pin, status);
}//读取DIO0电平,返回值0低电平,1高电平
uint8_t SX1276ReadDio0(void)
{return HAL_GPIO_ReadPin(GPIOD,d0_Pin);
}//读取DIO1电平,返回值0低电平,1高电平
uint8_t SX1276ReadDio1(void)
{return HAL_GPIO_ReadPin(GPIOD,d1_Pin);
}void exampleTx(void)
{tRFProcessReturnCodes processRet=RF_IDLE;static uint32_t systickBak=200000;uint8_t *txBuf=(uint8_t *)rx1_buf;//替换为接收缓存器地址processRet=g_Radio.Process();switch(processRet){case RF_IDLE: //空闲状态if(GET_TICK_COUNT()-systickBak >1000){//开始一次发送DEBUG("[DEBUG %s()-%d]start send\r\n",__func__,__LINE__);g_Radio.SetTxPacket(txBuf,strlen((char *)txBuf),15000);}break;case RF_TX_DONE: //发送完成DEBUG("[DEBUG %s()-%d]send OK\r\n",__func__,__LINE__);g_Radio.Reset(); //复位g_Radio.Init(NULL); //加载上次的配置systickBak=GET_TICK_COUNT();break;case RF_TX_TIMEOUT: //发送超时DEBUG("[DEBUG %s()-%d]send Timeout\r\n",__func__,__LINE__);g_Radio.Reset(); //复位g_Radio.Init(NULL); //加载上次的配置systickBak=GET_TICK_COUNT();break;case RF_BUSY: //模块执行任务中break;case RF_UNKNOW_STATUS: //异常状态机default:DEBUG("[ERROR %s()-%d]unknow status:%d\r\n",__func__,__LINE__,processRet);break;}
}
void exampleRx(void){tRFProcessReturnCodes processRet=RF_IDLE;uint8_t rxBuf[128]={0};uint16_t rxCount=128;processRet=g_Radio.Process();switch(processRet){case RF_IDLE: //空闲状态g_Radio.StartRx(3000);break;case RF_RX_DONE: //接收完成memset(rxBuf,0,128);g_Radio.GetRxPacket(rxBuf,&rxCount);DEBUG("[DEBUG %s()-%d]RF_RX_DONE (%d):%s\r\n",__func__,__LINE__,rxCount,rxBuf);g_Radio.StartRx(3000);break;case RF_RX_TIMEOUT: //接收超时DEBUG("[DEBUG %s()-%d]RF_RX_TIMEOUT\r\n",__func__,__LINE__);g_Radio.StartRx(3000);break;case RF_BUSY: //模块执行任务中break;case RF_UNKNOW_STATUS: //异常状态机default:DEBUG("[ERROR %s()-%d]unknow status:%d\r\n",__func__,__LINE__,processRet);break;}
}
.h
lora模块寄存器状态相关头文件内容
/*!* RF state machine*/
//LoRa
typedef enum
{RFLR_STATE_IDLE,RFLR_STATE_RX_INIT,RFLR_STATE_RX_RUNNING,RFLR_STATE_RX_DONE,RFLR_STATE_RX_TIMEOUT,RFLR_STATE_TX_INIT,RFLR_STATE_TX_RUNNING,RFLR_STATE_TX_DONE,RFLR_STATE_TX_TIMEOUT,RFLR_STATE_CAD_INIT,RFLR_STATE_CAD_RUNNING,RFLR_STATE_CAD_DETECTED, //CAD检测到前导码RFLR_STATE_CAD_EMPTY, //CAD检测完成,没有发现前导码RFLR_STATE_CAD_TIMEOUT //CAD超时
}tRFLRStates;/*!* SX1276 definitions*/
#define XTAL_FREQ 32000000
#define FREQ_STEP 61.03515625/*!* SX1276 Internal registers Address*/
#define REG_LR_FIFO 0x00
// Common settings
#define REG_LR_OPMODE 0x01
#define REG_LR_BANDSETTING 0x04
#define REG_LR_FRFMSB 0x06
#define REG_LR_FRFMID 0x07
#define REG_LR_FRFLSB 0x08
// Tx settings
#define REG_LR_PACONFIG 0x09
#define REG_LR_PARAMP 0x0A
#define REG_LR_OCP 0x0B
// Rx settings
#define REG_LR_LNA 0x0C
// LoRa registers
#define REG_LR_FIFOADDRPTR 0x0D
#define REG_LR_FIFOTXBASEADDR 0x0E
#define REG_LR_FIFORXBASEADDR 0x0F
#define REG_LR_FIFORXCURRENTADDR 0x10
#define REG_LR_IRQFLAGSMASK 0x11
#define REG_LR_IRQFLAGS 0x12
#define REG_LR_NBRXBYTES 0x13
#define REG_LR_RXHEADERCNTVALUEMSB 0x14
#define REG_LR_RXHEADERCNTVALUELSB 0x15
#define REG_LR_RXPACKETCNTVALUEMSB 0x16
#define REG_LR_RXPACKETCNTVALUELSB 0x17
#define REG_LR_MODEMSTAT 0x18
#define REG_LR_PKTSNRVALUE 0x19
#define REG_LR_PKTRSSIVALUE 0x1A
#define REG_LR_RSSIVALUE 0x1B
#define REG_LR_HOPCHANNEL 0x1C
#define REG_LR_MODEMCONFIG1 0x1D
#define REG_LR_MODEMCONFIG2 0x1E
#define REG_LR_SYMBTIMEOUTLSB 0x1F
#define REG_LR_PREAMBLEMSB 0x20
#define REG_LR_PREAMBLELSB 0x21
#define REG_LR_PAYLOADLENGTH 0x22
#define REG_LR_PAYLOADMAXLENGTH 0x23
#define REG_LR_HOPPERIOD 0x24
#define REG_LR_FIFORXBYTEADDR 0x25
#define REG_LR_MODEMCONFIG3 0x26
// end of documented register in datasheet
// I/O settings
#define REG_LR_DIOMAPPING1 0x40
#define REG_LR_DIOMAPPING2 0x41
// Version
#define REG_LR_VERSION 0x42
// Additional settings
#define REG_LR_PLLHOP 0x44
#define REG_LR_TCXO 0x4B
#define REG_LR_PADAC 0x4D
#define REG_LR_FORMERTEMP 0x5B
#define REG_LR_BITRATEFRAC 0x5D
#define REG_LR_AGCREF 0x61
#define REG_LR_AGCTHRESH1 0x62
#define REG_LR_AGCTHRESH2 0x63
#define REG_LR_AGCTHRESH3 0x64/*!* SX1276 LoRa bit control definition*//*!* RegFifo*//*!* RegOpMode*/
#define RFLR_OPMODE_LONGRANGEMODE_MASK 0x7F
#define RFLR_OPMODE_LONGRANGEMODE_OFF 0x00 // Default
#define RFLR_OPMODE_LONGRANGEMODE_ON 0x80 #define RFLR_OPMODE_ACCESSSHAREDREG_MASK 0xBF
#define RFLR_OPMODE_ACCESSSHAREDREG_ENABLE 0x40
#define RFLR_OPMODE_ACCESSSHAREDREG_DISABLE 0x00 // Default#define RFLR_OPMODE_FREQMODE_ACCESS_MASK 0xF7
#define RFLR_OPMODE_FREQMODE_ACCESS_LF 0x08 // Default
#define RFLR_OPMODE_FREQMODE_ACCESS_HF 0x00 #define RFLR_OPMODE_MASK 0xF8
#define RFLR_OPMODE_SLEEP 0x00
#define RFLR_OPMODE_STANDBY 0x01 // Default
#define RFLR_OPMODE_SYNTHESIZER_TX 0x02
#define RFLR_OPMODE_TRANSMITTER 0x03
#define RFLR_OPMODE_SYNTHESIZER_RX 0x04
#define RFLR_OPMODE_RECEIVER 0x05
// LoRa specific modes
#define RFLR_OPMODE_RECEIVER_SINGLE 0x06
#define RFLR_OPMODE_CAD 0x07 /*!* RegBandSetting */
#define RFLR_BANDSETTING_MASK 0x3F
#define RFLR_BANDSETTING_AUTO 0x00 // Default
#define RFLR_BANDSETTING_DIV_BY_1 0x40
#define RFLR_BANDSETTING_DIV_BY_2 0x80
#define RFLR_BANDSETTING_DIV_BY_6 0xC0/*!* RegFrf (MHz)*/#define RFLR_FRFMSB_434_MHZ 0x6C // Default
#define RFLR_FRFMID_434_MHZ 0x80 // Default
#define RFLR_FRFLSB_434_MHZ 0x00 // Default#define RFLR_FRFMSB_863_MHZ 0xD7
#define RFLR_FRFMID_863_MHZ 0xC0
#define RFLR_FRFLSB_863_MHZ 0x00
#define RFLR_FRFMSB_864_MHZ 0xD8
#define RFLR_FRFMID_864_MHZ 0x00
#define RFLR_FRFLSB_864_MHZ 0x00
#define RFLR_FRFMSB_865_MHZ 0xD8
#define RFLR_FRFMID_865_MHZ 0x40
#define RFLR_FRFLSB_865_MHZ 0x00
#define RFLR_FRFMSB_866_MHZ 0xD8
#define RFLR_FRFMID_866_MHZ 0x80
#define RFLR_FRFLSB_866_MHZ 0x00
#define RFLR_FRFMSB_867_MHZ 0xD8
#define RFLR_FRFMID_867_MHZ 0xC0
#define RFLR_FRFLSB_867_MHZ 0x00
#define RFLR_FRFMSB_868_MHZ 0xD9
#define RFLR_FRFMID_868_MHZ 0x00
#define RFLR_FRFLSB_868_MHZ 0x00
#define RFLR_FRFMSB_869_MHZ 0xD9
#define RFLR_FRFMID_869_MHZ 0x40
#define RFLR_FRFLSB_869_MHZ 0x00
#define RFLR_FRFMSB_870_MHZ 0xD9
#define RFLR_FRFMID_870_MHZ 0x80
#define RFLR_FRFLSB_870_MHZ 0x00#define RFLR_FRFMSB_902_MHZ 0xE1
#define RFLR_FRFMID_902_MHZ 0x80
#define RFLR_FRFLSB_902_MHZ 0x00
#define RFLR_FRFMSB_903_MHZ 0xE1
#define RFLR_FRFMID_903_MHZ 0xC0
#define RFLR_FRFLSB_903_MHZ 0x00
#define RFLR_FRFMSB_904_MHZ 0xE2
#define RFLR_FRFMID_904_MHZ 0x00
#define RFLR_FRFLSB_904_MHZ 0x00
#define RFLR_FRFMSB_905_MHZ 0xE2
#define RFLR_FRFMID_905_MHZ 0x40
#define RFLR_FRFLSB_905_MHZ 0x00
#define RFLR_FRFMSB_906_MHZ 0xE2
#define RFLR_FRFMID_906_MHZ 0x80
#define RFLR_FRFLSB_906_MHZ 0x00
#define RFLR_FRFMSB_907_MHZ 0xE2
#define RFLR_FRFMID_907_MHZ 0xC0
#define RFLR_FRFLSB_907_MHZ 0x00
#define RFLR_FRFMSB_908_MHZ 0xE3
#define RFLR_FRFMID_908_MHZ 0x00
#define RFLR_FRFLSB_908_MHZ 0x00
#define RFLR_FRFMSB_909_MHZ 0xE3
#define RFLR_FRFMID_909_MHZ 0x40
#define RFLR_FRFLSB_909_MHZ 0x00
#define RFLR_FRFMSB_910_MHZ 0xE3
#define RFLR_FRFMID_910_MHZ 0x80
#define RFLR_FRFLSB_910_MHZ 0x00
#define RFLR_FRFMSB_911_MHZ 0xE3
#define RFLR_FRFMID_911_MHZ 0xC0
#define RFLR_FRFLSB_911_MHZ 0x00
#define RFLR_FRFMSB_912_MHZ 0xE4
#define RFLR_FRFMID_912_MHZ 0x00
#define RFLR_FRFLSB_912_MHZ 0x00
#define RFLR_FRFMSB_913_MHZ 0xE4
#define RFLR_FRFMID_913_MHZ 0x40
#define RFLR_FRFLSB_913_MHZ 0x00
#define RFLR_FRFMSB_914_MHZ 0xE4
#define RFLR_FRFMID_914_MHZ 0x80
#define RFLR_FRFLSB_914_MHZ 0x00
#define RFLR_FRFMSB_915_MHZ 0xE4 // Default
#define RFLR_FRFMID_915_MHZ 0xC0 // Default
#define RFLR_FRFLSB_915_MHZ 0x00 // Default
#define RFLR_FRFMSB_916_MHZ 0xE5
#define RFLR_FRFMID_916_MHZ 0x00
#define RFLR_FRFLSB_916_MHZ 0x00
#define RFLR_FRFMSB_917_MHZ 0xE5
#define RFLR_FRFMID_917_MHZ 0x40
#define RFLR_FRFLSB_917_MHZ 0x00
#define RFLR_FRFMSB_918_MHZ 0xE5
#define RFLR_FRFMID_918_MHZ 0x80
#define RFLR_FRFLSB_918_MHZ 0x00
#define RFLR_FRFMSB_919_MHZ 0xE5
#define RFLR_FRFMID_919_MHZ 0xC0
#define RFLR_FRFLSB_919_MHZ 0x00
#define RFLR_FRFMSB_920_MHZ 0xE6
#define RFLR_FRFMID_920_MHZ 0x00
#define RFLR_FRFLSB_920_MHZ 0x00
#define RFLR_FRFMSB_921_MHZ 0xE6
#define RFLR_FRFMID_921_MHZ 0x40
#define RFLR_FRFLSB_921_MHZ 0x00
#define RFLR_FRFMSB_922_MHZ 0xE6
#define RFLR_FRFMID_922_MHZ 0x80
#define RFLR_FRFLSB_922_MHZ 0x00
#define RFLR_FRFMSB_923_MHZ 0xE6
#define RFLR_FRFMID_923_MHZ 0xC0
#define RFLR_FRFLSB_923_MHZ 0x00
#define RFLR_FRFMSB_924_MHZ 0xE7
#define RFLR_FRFMID_924_MHZ 0x00
#define RFLR_FRFLSB_924_MHZ 0x00
#define RFLR_FRFMSB_925_MHZ 0xE7
#define RFLR_FRFMID_925_MHZ 0x40
#define RFLR_FRFLSB_925_MHZ 0x00
#define RFLR_FRFMSB_926_MHZ 0xE7
#define RFLR_FRFMID_926_MHZ 0x80
#define RFLR_FRFLSB_926_MHZ 0x00
#define RFLR_FRFMSB_927_MHZ 0xE7
#define RFLR_FRFMID_927_MHZ 0xC0
#define RFLR_FRFLSB_927_MHZ 0x00
#define RFLR_FRFMSB_928_MHZ 0xE8
#define RFLR_FRFMID_928_MHZ 0x00
#define RFLR_FRFLSB_928_MHZ 0x00/*!* RegPaConfig*/
#define RFLR_PACONFIG_PASELECT_MASK 0x7F
#define RFLR_PACONFIG_PASELECT_PABOOST 0x80
#define RFLR_PACONFIG_PASELECT_RFO 0x00 // Default#define RFLR_PACONFIG_MAX_POWER_MASK 0x8F#define RFLR_PACONFIG_OUTPUTPOWER_MASK 0xF0 /*!* RegPaRamp*/
#define RFLR_PARAMP_TXBANDFORCE_MASK 0xEF
#define RFLR_PARAMP_TXBANDFORCE_BAND_SEL 0x10
#define RFLR_PARAMP_TXBANDFORCE_AUTO 0x00 // Default#define RFLR_PARAMP_MASK 0xF0
#define RFLR_PARAMP_3400_US 0x00
#define RFLR_PARAMP_2000_US 0x01
#define RFLR_PARAMP_1000_US 0x02
#define RFLR_PARAMP_0500_US 0x03
#define RFLR_PARAMP_0250_US 0x04
#define RFLR_PARAMP_0125_US 0x05
#define RFLR_PARAMP_0100_US 0x06
#define RFLR_PARAMP_0062_US 0x07
#define RFLR_PARAMP_0050_US 0x08
#define RFLR_PARAMP_0040_US 0x09 // Default
#define RFLR_PARAMP_0031_US 0x0A
#define RFLR_PARAMP_0025_US 0x0B
#define RFLR_PARAMP_0020_US 0x0C
#define RFLR_PARAMP_0015_US 0x0D
#define RFLR_PARAMP_0012_US 0x0E
#define RFLR_PARAMP_0010_US 0x0F /*!* RegOcp*/
#define RFLR_OCP_MASK 0xDF
#define RFLR_OCP_ON 0x20 // Default
#define RFLR_OCP_OFF 0x00 #define RFLR_OCP_TRIM_MASK 0xE0
#define RFLR_OCP_TRIM_045_MA 0x00
#define RFLR_OCP_TRIM_050_MA 0x01
#define RFLR_OCP_TRIM_055_MA 0x02
#define RFLR_OCP_TRIM_060_MA 0x03
#define RFLR_OCP_TRIM_065_MA 0x04
#define RFLR_OCP_TRIM_070_MA 0x05
#define RFLR_OCP_TRIM_075_MA 0x06
#define RFLR_OCP_TRIM_080_MA 0x07
#define RFLR_OCP_TRIM_085_MA 0x08
#define RFLR_OCP_TRIM_090_MA 0x09
#define RFLR_OCP_TRIM_095_MA 0x0A
#define RFLR_OCP_TRIM_100_MA 0x0B // Default
#define RFLR_OCP_TRIM_105_MA 0x0C
#define RFLR_OCP_TRIM_110_MA 0x0D
#define RFLR_OCP_TRIM_115_MA 0x0E
#define RFLR_OCP_TRIM_120_MA 0x0F
#define RFLR_OCP_TRIM_130_MA 0x10
#define RFLR_OCP_TRIM_140_MA 0x11
#define RFLR_OCP_TRIM_150_MA 0x12
#define RFLR_OCP_TRIM_160_MA 0x13
#define RFLR_OCP_TRIM_170_MA 0x14
#define RFLR_OCP_TRIM_180_MA 0x15
#define RFLR_OCP_TRIM_190_MA 0x16
#define RFLR_OCP_TRIM_200_MA 0x17
#define RFLR_OCP_TRIM_210_MA 0x18
#define RFLR_OCP_TRIM_220_MA 0x19
#define RFLR_OCP_TRIM_230_MA 0x1A
#define RFLR_OCP_TRIM_240_MA 0x1B/*!* RegLna*/
#define RFLR_LNA_GAIN_MASK 0x1F
#define RFLR_LNA_GAIN_G1 0x20 // Default
#define RFLR_LNA_GAIN_G2 0x40
#define RFLR_LNA_GAIN_G3 0x60
#define RFLR_LNA_GAIN_G4 0x80
#define RFLR_LNA_GAIN_G5 0xA0
#define RFLR_LNA_GAIN_G6 0xC0 #define RFLR_LNA_BOOST_LF_MASK 0xE7
#define RFLR_LNA_BOOST_LF_DEFAULT 0x00 // Default
#define RFLR_LNA_BOOST_LF_GAIN 0x08
#define RFLR_LNA_BOOST_LF_IP3 0x10
#define RFLR_LNA_BOOST_LF_BOOST 0x18 #define RFLR_LNA_RXBANDFORCE_MASK 0xFB
#define RFLR_LNA_RXBANDFORCE_BAND_SEL 0x04
#define RFLR_LNA_RXBANDFORCE_AUTO 0x00 // Default#define RFLR_LNA_BOOST_HF_MASK 0xFC
#define RFLR_LNA_BOOST_HF_OFF 0x00 // Default
#define RFLR_LNA_BOOST_HF_ON 0x03 /*!* RegFifoAddrPtr*/
#define RFLR_FIFOADDRPTR 0x00 // Default/*!* RegFifoTxBaseAddr*/
#define RFLR_FIFOTXBASEADDR 0x80 // Default/*!* RegFifoTxBaseAddr*/
#define RFLR_FIFORXBASEADDR 0x00 // Default/*!* RegFifoRxCurrentAddr (Read Only)*//*!* RegIrqFlagsMask*/
#define RFLR_IRQFLAGS_RXTIMEOUT_MASK 0x80
#define RFLR_IRQFLAGS_RXDONE_MASK 0x40
#define RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK 0x20
#define RFLR_IRQFLAGS_VALIDHEADER_MASK 0x10
#define RFLR_IRQFLAGS_TXDONE_MASK 0x08
#define RFLR_IRQFLAGS_CADDONE_MASK 0x04
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL_MASK 0x02
#define RFLR_IRQFLAGS_CADDETECTED_MASK 0x01 /*!* RegIrqFlags*/
#define RFLR_IRQFLAGS_RXTIMEOUT 0x80
#define RFLR_IRQFLAGS_RXDONE 0x40
#define RFLR_IRQFLAGS_PAYLOADCRCERROR 0x20
#define RFLR_IRQFLAGS_VALIDHEADER 0x10
#define RFLR_IRQFLAGS_TXDONE 0x08
#define RFLR_IRQFLAGS_CADDONE 0x04
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL 0x02
#define RFLR_IRQFLAGS_CADDETECTED 0x01 /*!* RegFifoRxNbBytes (Read Only) //*//*!* RegRxHeaderCntValueMsb (Read Only) //*//*!* RegRxHeaderCntValueLsb (Read Only) //*//*!* RegRxPacketCntValueMsb (Read Only) //*//*!* RegRxPacketCntValueLsb (Read Only) //*//*!* RegModemStat (Read Only) //*/
#define RFLR_MODEMSTAT_RX_CR_MASK 0x1F
#define RFLR_MODEMSTAT_MODEM_STATUS_MASK 0xE0 /*!* RegPktSnrValue (Read Only) //*//*!* RegPktRssiValue (Read Only) //*//*!* RegRssiValue (Read Only) //*//*!* RegModemConfig1*/
#define RFLR_MODEMCONFIG1_BW_MASK 0x0F #define RFLR_MODEMCONFIG1_BW_7_81_KHZ 0x00
#define RFLR_MODEMCONFIG1_BW_10_41_KHZ 0x10
#define RFLR_MODEMCONFIG1_BW_15_62_KHZ 0x20
#define RFLR_MODEMCONFIG1_BW_20_83_KHZ 0x30
#define RFLR_MODEMCONFIG1_BW_31_25_KHZ 0x40
#define RFLR_MODEMCONFIG1_BW_41_66_KHZ 0x50
#define RFLR_MODEMCONFIG1_BW_62_50_KHZ 0x60
#define RFLR_MODEMCONFIG1_BW_125_KHZ 0x70 // Default
#define RFLR_MODEMCONFIG1_BW_250_KHZ 0x80
#define RFLR_MODEMCONFIG1_BW_500_KHZ 0x90 #define RFLR_MODEMCONFIG1_CODINGRATE_MASK 0xF1
#define RFLR_MODEMCONFIG1_CODINGRATE_4_5 0x02
#define RFLR_MODEMCONFIG1_CODINGRATE_4_6 0x04 // Default
#define RFLR_MODEMCONFIG1_CODINGRATE_4_7 0x06
#define RFLR_MODEMCONFIG1_CODINGRATE_4_8 0x08 #define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK 0xFE
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_ON 0x01
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF 0x00 // Default/*!* RegModemConfig2*/
#define RFLR_MODEMCONFIG2_SF_MASK 0x0F
#define RFLR_MODEMCONFIG2_SF_6 0x60
#define RFLR_MODEMCONFIG2_SF_7 0x70 // Default
#define RFLR_MODEMCONFIG2_SF_8 0x80
#define RFLR_MODEMCONFIG2_SF_9 0x90
#define RFLR_MODEMCONFIG2_SF_10 0xA0
#define RFLR_MODEMCONFIG2_SF_11 0xB0
#define RFLR_MODEMCONFIG2_SF_12 0xC0 #define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_MASK 0xF7
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_ON 0x08
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF 0x00 #define RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK 0xFB
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON 0x04
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_OFF 0x00 // Default#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK 0xFC
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB 0x00 // Default/*! * RegHopChannel (Read Only) */
#define RFLR_HOPCHANNEL_PLL_LOCK_TIMEOUT_MASK 0x7F
#define RFLR_HOPCHANNEL_PLL_LOCK_FAIL 0x80
#define RFLR_HOPCHANNEL_PLL_LOCK_SUCCEED 0x00 // Default#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_MASK 0xBF
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_ON 0x40
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_OFF 0x00 // Default#define RFLR_HOPCHANNEL_CHANNEL_MASK 0x3F /*!* RegSymbTimeoutLsb*/
#define RFLR_SYMBTIMEOUTLSB_SYMBTIMEOUT 0x64 // Default/*!* RegPreambleLengthMsb*/
#define RFLR_PREAMBLELENGTHMSB 0x00 // Default/*!* RegPreambleLengthLsb*/
#define RFLR_PREAMBLELENGTHLSB 0x08 // Default/*!* RegPayloadLength*/
#define RFLR_PAYLOADLENGTH 0x0E // Default/*!* RegPayloadMaxLength*/
#define RFLR_PAYLOADMAXLENGTH 0xFF // Default/*!* RegHopPeriod*/
#define RFLR_HOPPERIOD_FREQFOPPINGPERIOD 0x00 // Default/*!* RegDioMapping1*/
#define RFLR_DIOMAPPING1_DIO0_MASK 0x3F
#define RFLR_DIOMAPPING1_DIO0_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO0_01 0x40
#define RFLR_DIOMAPPING1_DIO0_10 0x80
#define RFLR_DIOMAPPING1_DIO0_11 0xC0#define RFLR_DIOMAPPING1_DIO1_MASK 0xCF
#define RFLR_DIOMAPPING1_DIO1_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO1_01 0x10
#define RFLR_DIOMAPPING1_DIO1_10 0x20
#define RFLR_DIOMAPPING1_DIO1_11 0x30#define RFLR_DIOMAPPING1_DIO2_MASK 0xF3
#define RFLR_DIOMAPPING1_DIO2_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO2_01 0x04
#define RFLR_DIOMAPPING1_DIO2_10 0x08
#define RFLR_DIOMAPPING1_DIO2_11 0x0C#define RFLR_DIOMAPPING1_DIO3_MASK 0xFC
#define RFLR_DIOMAPPING1_DIO3_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO3_01 0x01
#define RFLR_DIOMAPPING1_DIO3_10 0x02
#define RFLR_DIOMAPPING1_DIO3_11 0x03/*!* RegDioMapping2*/
#define RFLR_DIOMAPPING2_DIO4_MASK 0x3F
#define RFLR_DIOMAPPING2_DIO4_00 0x00 // Default
#define RFLR_DIOMAPPING2_DIO4_01 0x40
#define RFLR_DIOMAPPING2_DIO4_10 0x80
#define RFLR_DIOMAPPING2_DIO4_11 0xC0#define RFLR_DIOMAPPING2_DIO5_MASK 0xCF
#define RFLR_DIOMAPPING2_DIO5_00 0x00 // Default
#define RFLR_DIOMAPPING2_DIO5_01 0x10
#define RFLR_DIOMAPPING2_DIO5_10 0x20
#define RFLR_DIOMAPPING2_DIO5_11 0x30#define RFLR_DIOMAPPING2_MAP_MASK 0xFE
#define RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01
#define RFLR_DIOMAPPING2_MAP_RSSI 0x00 // Default/*!* RegVersion (Read Only)*//*!* RegAgcRef*//*!* RegAgcThresh1*//*!* RegAgcThresh2*//*!* RegAgcThresh3*//*!* RegFifoRxByteAddr (Read Only)*//*!* RegPllHop*/
#define RFLR_PLLHOP_FASTHOP_MASK 0x7F
#define RFLR_PLLHOP_FASTHOP_ON 0x80
#define RFLR_PLLHOP_FASTHOP_OFF 0x00 // Default/*!* RegTcxo*/
#define RFLR_TCXO_TCXOINPUT_MASK 0xEF
#define RFLR_TCXO_TCXOINPUT_ON 0x10
#define RFLR_TCXO_TCXOINPUT_OFF 0x00 // Default/*!* RegPaDac*/
#define RFLR_PADAC_20DBM_MASK 0xF8
#define RFLR_PADAC_20DBM_ON 0x07
#define RFLR_PADAC_20DBM_OFF 0x04 // Default/*!* RegPll*/
#define RFLR_PLL_BANDWIDTH_MASK 0x3F
#define RFLR_PLL_BANDWIDTH_75 0x00
#define RFLR_PLL_BANDWIDTH_150 0x40
#define RFLR_PLL_BANDWIDTH_225 0x80
#define RFLR_PLL_BANDWIDTH_300 0xC0 // Default/*!* RegPllLowPn*/
#define RFLR_PLLLOWPN_BANDWIDTH_MASK 0x3F
#define RFLR_PLLLOWPN_BANDWIDTH_75 0x00
#define RFLR_PLLLOWPN_BANDWIDTH_150 0x40
#define RFLR_PLLLOWPN_BANDWIDTH_225 0x80
#define RFLR_PLLLOWPN_BANDWIDTH_300 0xC0 // Default/*!* RegModemConfig3*/
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK 0xF7
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON 0x08
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF 0x00 // Default#define RFLR_MODEMCONFIG3_AGCAUTO_MASK 0xFB
#define RFLR_MODEMCONFIG3_AGCAUTO_ON 0x04 // Default
#define RFLR_MODEMCONFIG3_AGCAUTO_OFF 0x00
相关文章:

一、对lora_sx1278v1.2模块通信记录梳理
一、通信测试: 注意: 1、检查供电是否满足。 2、检测引脚是否松动或虚焊。 3、检测触发是否能触发。 引脚作用: SPI:通信(仅作一次初始化,初始化后会进行模块通信返回测试,返回值和预定值相否即…...

Java在word中动态增加表格行并写入数据
SpringBoot项目中在word中动态增加表格行并写入数据,不废话,直接上配置和代码: 模板内容如下图所示: 模板是一个空word表格即可,模板放在resources下的自定义目录下,如下图示例。 实体类定义如下: @Data @AllArgsConstructor @NoArgsConstructor public class Person …...

[通讯协议]232通信
RS-232 简介 RS-232是一种广泛应用的串行通信接口标准,使用的协议就是串口协议。 通信能力 单端信号传输:信号以地线为参考,逻辑“1”为-3V至-15V,逻辑“0”为3V至15V。点对点通信:仅支持两个设备之间的通信&#x…...

Refreshtoken 前端 安全 前端安全方面
网络安全 前端不需要过硬的网络安全方面的知识,但是能够了解大多数的网络安全,并且可以进行简单的防御前两三个是需要的 介绍一下常见的安全问题,解决方式,和小的Demo,希望大家喜欢 网络安全汇总 XSSCSRF点击劫持SQL注入OS注入请求劫持DDOS 在我看来,前端可以了解并且防御前…...

EasyRTC嵌入式音视频通话SDK:基于ICE与STUN/TURN的实时音视频通信解决方案
在当今数字化时代,实时音视频通信技术已成为人们生活和工作中不可或缺的一部分。无论是家庭中的远程看护、办公场景中的远程协作,还是工业领域的远程巡检和智能设备的互联互通,高效、稳定的通信技术都是实现这些功能的核心。 EasyRTC嵌入式音…...

AI终章.展望未来2026-2030年预测与DeepSeek的角色
人工智能(AI)近年来发展迅速,正在改变行业、商业模式以及我们与技术互动的方式。展望2026-2030年,预计在多模态AI、自主代理和自动化驱动的新职业创造方面将出现革命性发展。本章将探讨这些趋势,以及DeepSeek将如何在这…...

PyTorch系列教程:编写高效模型训练流程
当使用PyTorch开发机器学习模型时,建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件,并演示如何构建一个精细的训练循环流程,有效地处理数据处理,向前和向后…...

【面试】Zookeeper
Zookeeper 1、ZooKeeper 介绍2、znode 节点里面的存储3、znode 节点上监听机制4、ZooKeeper 集群部署5、ZooKeeper 选举机制6、何为集群脑裂7、如何保证数据一致性8、讲一下 zk 分布式锁实现原理吧9、Eureka 与 Zk 有什么区别 1、ZooKeeper 介绍 ZooKeeper 的核心特性 高可用…...

电力系统中各参数的详细解释【智能电表】
一、核心电力参数 电压 (Voltage) 单位:伏特(V) 含义:电势差,推动电流流动的动力 类型:线电压(三相系统)、相电压,如220V(家用)或380Vÿ…...

前端系统测试(单元、集成、数据|性能|回归)
有关前端测试的面试题 系统测试 首先,功能测试部分。根据资料,单元测试是验证最小可测试单元的正确性,比如函数或组件。都提到了单元测试的重要性,强调其在开发早期发现问题,并通过自动化提高效率。需要整合我搜索到的资料中的观点,比如单元测试的方法(接口测试、路径覆…...

软件开发过程总揽
开发模型 传统开发模型 瀑布模型 #mermaid-svg-yDNBSwh3gDYETWou {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-yDNBSwh3gDYETWou .error-icon{fill:#552222;}#mermaid-svg-yDNBSwh3gDYETWou .error-text{fill:#…...

VBA第二十期 VBA最简单复制整张表格Cells的用法
前面讲过复制整张表格的方法,使用语句Workbooks("实例.xlsm").Sheets("表格1").Copy Workbooks(wjm).Sheets(1)实现,这里用我们熟悉的Cells属性也可以实现整表复制。实例如下: Sheets("全部").Activate Cells…...

Redis为什么要自定义序列化?如何实现自定义序列化器?
在 Redis中,通常会使用自定义序列化器,那么,Redis为什么需要自定义序列化器,该如何实现它? 1、为什么需要自定义序列化器? 整体来说,Redis需要自定义序列化器,主要有以下几个原因&…...

Matlab:矩阵运算篇——矩阵数学运算
目录 1.矩阵的加法运算 实例——验证加法法则 实例——矩阵求和 实例——矩阵求差 2.矩阵的乘法运算 1.数乘运算 2.乘运算 3.点乘运算 实例——矩阵乘法运算 3.矩阵的除法运算 1.左除运算 实例——验证矩阵的除法 2.右除运算 实例——矩阵的除法 ヾ( ̄…...

手写一个Tomcat
Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂,但通过手写一个简易版的 Tomcat,我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat,并深…...

开发ai模型最佳的系统是Ubuntu还是linux?
在 AI/ML 开发中,Ubuntu 是更优选的 Linux 发行版,原因如下: 1. 开箱即用的 AI 工具链支持 Ubuntu 预装了主流的 AI 框架(如 TensorFlow、PyTorch)和依赖库,且通过 apt 包管理器可快速部署开发环境。 提…...

Scala 中生成一个RDD的方法
在 Scala 中,生成 RDD(弹性分布式数据集)的主要方法是通过 SparkContext(或 SparkSession)提供的 API。以下是生成 RDD 的常见方法: 1. 从本地集合创建 RDD 使用 parallelize 方法将本地集合(如…...

【redis】慢查询分析与优化
慢查询指在Redis中执行时间超过预设阈值的命令,其日志记录是排查性能瓶颈的核心工具。Redis采用单线程模型,任何耗时操作都可能阻塞后续请求,导致整体性能下降。 命令的执行流程 根据Redis的核心机制,命令执行流程可分为以下步骤…...

P8925 「GMOI R1-T2」Light 题解
P8925 「GMOI R1-T2」Light 让我们好好观察样例解释的这一张图: 左边第 1 1 1 个像到 O O O 点的距离 : L 2 2 L L\times22L L22L 右边第 1 1 1 个像到 O O O 点的距离 : R 2 2 R R\times22R R22R 左边第 2 2 2 个像到 O O O 点…...

Spring Boot + MyBatis + MySQL:快速搭建CRUD应用
一、引言 1. 项目背景与目标 在现代Web开发中,CRUD(创建、读取、更新、删除)操作是几乎所有应用程序的核心功能。本项目旨在通过Spring Boot、MyBatis和MySQL技术栈,快速搭建一个高效、简洁的CRUD应用。我们将从零开始ÿ…...

python中os库的常用举例
os 库是Python中用于与操作系统进行交互的标准库,以下是一些 os 库的常用示例: 获取当前工作目录 python import os current_dir os.getcwd() print(current_dir) os.getcwd() 函数用于获取当前工作目录的路径。 列出目录内容 python import os …...

Unity 通用UI界面逻辑总结
概述 在游戏开发中,常常会遇到一些通用的界面逻辑,它不论在什么类型的游戏中都会出现。为了避免重复造轮子,本文总结并提供了一些常用UI界面的实现逻辑。希望可以帮助大家快速开发通用界面模块,也可以在次基础上进行扩展修改&…...

Python3 与 VSCode:深度对比分析
Python3 与 VSCode:深度对比分析 引言 Python3 和 Visual Studio Code(VSCode)在软件开发领域扮演着举足轻重的角色。Python3 作为一门强大的编程语言,拥有丰富的库和框架,广泛应用于数据科学、人工智能、网络开发等多个领域。而 VSCode 作为一款轻量级且功能强大的代码…...

第五课:Express框架与RESTful API设计:技术实践与探索
在使用Node.js进行企业应用开发,常用的开发框架Express,其中的中间件、路由配置与参数解析、RESTful API核心技术尤为重要,本文将深入探讨它们在应用开发中的具体使用方法,最后通过Postman来对开发的接口进行测试。 一、Express中…...

Linux 内核自定义协议族开发:从 “No buffer space available“ 错误到解决方案
引言 在 Linux 内核网络协议栈开发中,自定义协议族(Address Family, AF)是实现新型通信协议或扩展内核功能的关键步骤。然而,开发者常因对内核地址族管理机制理解不足,遇到如 insmod: No buffer space available 的错误。本文将以实际案例为基础,深入分析错误根源,并提…...

html-列表标签和表单标签
一、列表标签 表格是用来显示数据的,那么列表就是用来布局的 列表最大的特点就是整齐、整洁、有序,它作为布局会更加自由和方便。 根据使用情景不同,列表可以分为三大类:无序列表、有序列表和自定义列表。 1.无序列表(重…...

HTML-网页介绍
一、网页 1.什么是网页: 网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”,通常是 HTML 格式的文件,它要通过浏览器来阅读。 网页是构成网站的基本元素…...

动态ip和静态ip适用于哪个场景?有何区别
在数字化浪潮席卷全球的今天,IP地址作为网络世界的“门牌号”,其重要性不言而喻。然而,面对动态IP与静态IP这两种截然不同的IP分配方式,许多用户往往感到困惑:它们究竟有何区别?又分别适用于哪些场景呢&…...

android13打基础: 保存用户免得下次重新登录逻辑
使用SP来做 创建LoginUser.kt // 登录用户需要Email data class LoginUser(val email: String,val password: String, )创建假数据FakeLoginUser.kt object FakeLoginUser {val fake_login_user_items arrayListOf(LoginUser(email "1690544550qq.com",password …...

Linux 4.4 内核源码的目录结构及其主要内容的介绍
以下是 Linux 4.4 内核源码的目录结构及其主要内容的介绍,适用于理解内核模块和驱动开发的基本框架: Linux 4.4 内核源码目录结构 目录作用与内容arch/平台架构相关代码每个子目录对应一种 CPU 架构(如 x86/、arm/、arm64/),包含硬件相关的启动逻辑、中断处理、内存管理等…...