一、对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应用。我们将从零开始ÿ…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
