//////////////////////////////////////////////////////////////////////////////// // 版权: Haybin.Wu@studio // 文件名: // 版本: V1.0 // 工作环境: IAR v6.20 // 作者: Haybin // 生成日期: 2016.05 // 功能: API // 修改日志: //////////////////////////////////////////////////////////////////////////////// // Modify by Qian Xianghong // 修改日志: // 2020.10 // 1. LSD_RF_SendPacket()函数: // 修改判断DIO0标志的条件,确保发送完成,调用函数无需延时。 // 前导码长度修改为8.(默认值,和中继器一致) // 2. LSD_RF_RXmode()函数: // 允许PayloadCrcError中断。 // 前导码长度修改为8.(默认值,和中继器一致) // 3. LSD_RF_RxVariPacket()函数: // 判断RxDone和PayloadCRCError标识。 // 先读取REG_LR_FIFORXCURRENTADDR寄存器的值,再从该地址开始读取数据。 // 4. LSD_RF_RxFixiPacket()函数: // 判断RxDone和PayloadCRCError标识。 // 5. 增加SX127x_initLora()函数,用于更灵活地初始化LoRa参数。 // //2021.05 // 1. SX127x_initLora()函数: // 打开PayloadCrc校验。 // 2. LSD_RF_RxVariPacket()函数: // 增加判断Crc是否启用。 // 3. LSD_RF_RxFixiPacket()函数: // 增加判断Crc是否启用。 // //////////////////////////////////////////////////////////////////////////////// #include #include #include "FR2433-RFSX.h" #ifndef RF_SX1276 #define RF_SX1276 uint8_t LSD_RF_FreqSet(uint8_t ch); uint8_t LSD_RF_PoutSet(uint8_t power); //===================================定义=================================================== #define RF_PAYLOAD_LEN (64) #pragma pack(push, 1) // LORA参数,和泽耀参数类似 typedef struct { uint8_t sof; // 前导码,固定为0xC2 uint16_t addr; // 通信地址 unsigned char sf : 3; // 扩频因子: 0-保留,1-7,...,6-12,7-保留 unsigned char baud : 3; // 串口波特率:3-9600,7-115200, 其余保留 unsigned char cr : 2; // 编码率: 0-4/5,1-4/6,2-4/7,3-4/8 uint8_t ch; // 通信信道: 0~40(470M~510M),其余保留 unsigned char power : 2; // Power: 0-20dBm,1-17dBm,2-14dBm,3-11dBm unsigned char freqcast: 1; // 是否指定信道发送 unsigned char bw : 4; // 0-7.8kHz,1-10.4kHz,...,9-500kHz, 其余保留 unsigned char unicast : 1; // 是否定点发送 } lora_param_t; #pragma pack(pop) //===================================定义=================================================== /*! * SX1276 LoRa General parameters definition */ typedef struct sLoRaSettings { uint32_t RFFrequency; int8_t Power; uint8_t SignalBw; // LORA [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; // LORA [6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048, 12: 4096 chips] uint8_t ErrorCoding; // LORA [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8] bool CrcOn; // [0: OFF, 1: ON] bool ImplicitHeaderOn; // [0: OFF, 1: ON] bool RxSingleOn; // [0: Continuous, 1 Single] bool FreqHopOn; // [0: OFF, 1: ON] uint8_t HopPeriod; // Hops every frequency hopping period symbols uint32_t TxPacketTimeout; uint32_t RxPacketTimeout; uint8_t PayloadLength; }tLoRaSettings; /*! * RF packet definition */ #define RF_BUFFER_SIZE_MAX 128 #define RF_BUFFER_SIZE 80 /*! * 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, }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 /*! * 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 /*! * RegFormerTemp */ typedef struct sSX1276LR { uint8_t RegFifo; // 0x00 // Common settings uint8_t RegOpMode; // 0x01 uint8_t RegTestReserved02[0x06 - 0x02]; // 0x02-0x05 // uint8_t RegRes02; // 0x02 // uint8_t RegRes03; // 0x03 // uint8_t RegBandSetting; // 0x04 // uint8_t RegRes05; // 0x05 uint8_t RegFrfMsb; // 0x06 uint8_t RegFrfMid; // 0x07 uint8_t RegFrfLsb; // 0x08 // Tx settings uint8_t RegPaConfig; // 0x09 uint8_t RegPaRamp; // 0x0A uint8_t RegOcp; // 0x0B // Rx settings uint8_t RegLna; // 0x0C // LoRa registers uint8_t RegFifoAddrPtr; // 0x0D uint8_t RegFifoTxBaseAddr; // 0x0E uint8_t RegFifoRxBaseAddr; // 0x0F uint8_t RegFifoRxCurrentAddr; // 0x10 uint8_t RegIrqFlagsMask; // 0x11 uint8_t RegIrqFlags; // 0x12 uint8_t RegNbRxBytes; // 0x13 uint8_t RegRxHeaderCntValueMsb; // 0x14 uint8_t RegRxHeaderCntValueLsb; // 0x15 uint8_t RegRxPacketCntValueMsb; // 0x16 uint8_t RegRxPacketCntValueLsb; // 0x17 uint8_t RegModemStat; // 0x18 uint8_t RegPktSnrValue; // 0x19 uint8_t RegPktRssiValue; // 0x1A uint8_t RegRssiValue; // 0x1B uint8_t RegHopChannel; // 0x1C uint8_t RegModemConfig1; // 0x1D uint8_t RegModemConfig2; // 0x1E uint8_t RegSymbTimeoutLsb; // 0x1F uint8_t RegPreambleMsb; // 0x20 uint8_t RegPreambleLsb; // 0x21 uint8_t RegPayloadLength; // 0x22 uint8_t RegMaxPayloadLength; // 0x23 uint8_t RegHopPeriod; // 0x24 uint8_t RegFifoRxByteAddr; // 0x25 uint8_t RegModemConfig3; // 0x26 uint8_t RegTestReserved27[0x31 - 0x27]; // 0x27-0x30 //void SX1276LoRaSetNbTrigPeaks( uint8_t value )用到 uint8_t RegTestReserved31; // 0x31 uint8_t RegTestReserved32[0x40 - 0x32]; // 0x32-0x3F // I/O settings uint8_t RegDioMapping1; // 0x40 uint8_t RegDioMapping2; // 0x41 // Version uint8_t RegVersion; // 0x42 uint8_t RegTestReserved43[0x4B - 0x43]; // 0x43-0x4A uint8_t RegTcxo; // 0x4B uint8_t RegTestReserved4C; // 0x4C uint8_t RegPaDac; // 0x4D uint8_t RegTestReserved4E[0x5B - 0x4E]; // 0x4E-0x5A uint8_t RegFormerTemp; // 0x5B uint8_t RegTestReserved5C[0x61 - 0x5C]; // 0x5C-0x60 // Additional settings uint8_t RegAgcRef; // 0x61 uint8_t RegAgcThresh1; // 0x62 uint8_t RegAgcThresh2; // 0x63 uint8_t RegAgcThresh3; // 0x64 uint8_t RegTestReserved65[0x70 - 0x65]; // 0x65-0x6F uint8_t RegPll; // 0x70 }tSX1276LR; ////////////////////////////////////////////////////////////////////////////// typedef enum { Init_LoRa_0_8K, Init_LoRa_4_8K, Init_LoRa_10k, }tSX127xInitPara; //定义速率枚举 typedef enum { NORMAL, //正常 PARAMETER_INVALID, //参数不可用 SPI_READCHECK_WRONG, //SPI出错 }tSX127xError; //定义出错枚举 typedef enum { SLEEP, STANDBY, TX_ONGOING, RX_ONGOING, }tSX127xState; //定义RF物理状态,用户可以不使用 typedef enum { HOLDON, TX, LISTENING, }tRadio_Machine; //定义逻辑状态,用户可以不使用 typedef enum { MASTER, SLAVE, }tMasterSlave; //定义主从枚举 ,测试时用 typedef struct { tMasterSlave MasterSlave; //主从 tSX127xState SX127xState; //物理状态 tRadio_Machine Machine; //逻辑状态 }stRadio_Situation; //定义状态结构体 const unsigned char Freq_Cal_Tab[]= { 0x75,0x80,0x00,//470MHz 0x75,0xC0,0x00,//471MHz 0x76,0x00,0x00,//472MHz 0x76,0x40,0x00,//473MHz 0x76,0x80,0x00,//474MHz 0x76,0xC0,0x00,//475MHz 0x77,0x00,0x00,//476MHz 0x77,0x40,0x00,//477MHz 0x77,0x80,0x00,//478MHz 0x77,0xC0,0x00,//479MHz 0x78,0x00,0x00,//480MHz 0x78,0x40,0x00,//481MHz 0x78,0x80,0x00,//482MHz 0x78,0xC0,0x00,//483MHz 0x79,0x00,0x00,//484MHz 0x79,0x40,0x00,//485MHz 0x79,0x80,0x00,//486MHz 0x79,0xC0,0x00,//487MHz 0x7A,0x00,0x00,//488MHz 0x7A,0x40,0x00,//489MHz 0x7A,0x80,0x00,//490MHz 0x7A,0xC0,0x00,//491MHz 0x7B,0x00,0x00,//492MHz 0x7B,0x40,0x00,//493MHz 0x7B,0x80,0x00,//494MHz 0x7B,0xC0,0x00,//495MHz 0x7C,0x00,0x00,//496MHz 0x7C,0x40,0x00,//497MHz 0x7C,0x80,0x00,//498MHz 0x7C,0xC0,0x00,//499MHz 0x7D,0x00,0x00,//500MHz 0x7D,0x40,0x00,//501MHz 0x7D,0x80,0x00,//502MHz 0x7D,0xC0,0x00,//503MHz 0x7E,0x00,0x00,//504MHz 0x7E,0x40,0x00,//505MHz 0x7E,0x80,0x00,//506MHz 0x7E,0xC0,0x00,//507MHz 0x7F,0x00,0x00,//508MHz 0x7F,0x40,0x00,//509MHz 0x7F,0x80,0x00,//510MHz }; //extern stRadio_Situation SX127xSituation; //===================================函数声明=================================================== //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF初始化 // 输入参数 : tSX127xInitPara initPara 输入速率Init_LoRa_0_8K, Init_LoRa_4_8K , Init_LoRa_10k, // 返回参数 : tSX127xError 错误枚举内容 // 说明 : 初始化时,信道初始化默认为0信道 //////////////////////////////////////////////////////////////////////////////// tSX127xError SX127x_init(tSX127xInitPara initPara) { uint8_t test = 0; if(initPara>Init_LoRa_10k) //如果输入参数错误 { return PARAMETER_INVALID; //报错输入 } SX1276Init_IO(); // PAIO口初始化 SX1276Reset(); //复位RF //init Regs SX1276Write( REG_LR_OPMODE, RFLR_OPMODE_SLEEP ); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_SLEEP ); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_PACONFIG, 0xff ); SX1276Write( REG_LR_PADAC, RFLR_PADAC_20DBM_ON ); SX1276Write( REG_LR_PARAMP,RFLR_PARAMP_1000_US); SX1276Write( REG_LR_OCP,0x20|RFLR_OCP_TRIM_240_MA); SX1276Write( REG_LR_PAYLOADLENGTH,2); SX1276Write( REG_LR_MODEMCONFIG3,\ RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON| RFLR_MODEMCONFIG3_AGCAUTO_ON); //BW,SF,CR,Header,CRC // SX1276Write( REG_LR_MODEMCONFIG2,0xFF); // SX1276Write( REG_LR_SYMBTIMEOUTLSB,0xFF); switch(initPara){ case Init_LoRa_0_8K: // SX1276Write( REG_LR_MODEMCONFIG3,\ // RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON| // RFLR_MODEMCONFIG3_AGCAUTO_ON); SX1276Write( REG_LR_MODEMCONFIG1,\ RFLR_MODEMCONFIG1_BW_125_KHZ+RFLR_MODEMCONFIG1_CODINGRATE_4_8+\ RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF); SX1276Write( REG_LR_MODEMCONFIG2,\ RFLR_MODEMCONFIG2_SF_9|RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON); SX1276Write( REG_LR_PREAMBLELSB,10); SX1276Write(0x31,0x55); SX1276Read( 0x31,&test); break; case Init_LoRa_4_8K: // SX1276Write( REG_LR_MODEMCONFIG3,\ // RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF| // RFLR_MODEMCONFIG3_AGCAUTO_OFF); SX1276Write( REG_LR_MODEMCONFIG1,\ RFLR_MODEMCONFIG1_BW_500_KHZ+RFLR_MODEMCONFIG1_CODINGRATE_4_8+\ RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF); SX1276Write( REG_LR_MODEMCONFIG2,\ RFLR_MODEMCONFIG2_SF_8|RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON); // SX1276Write( REG_LR_PREAMBLEMSB,1); SX1276Write( REG_LR_PREAMBLELSB,10); break; case Init_LoRa_10k: SX1276Read( 0x31,&test); SX1276Write( 0x31,(test& 0xF8)|0x05); SX1276Write( 0x37,0x0C); // SX1276Write( REG_LR_MODEMCONFIG3,\ // RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF| // RFLR_MODEMCONFIG3_AGCAUTO_ON); SX1276Write( REG_LR_MODEMCONFIG1,\ RFLR_MODEMCONFIG1_BW_500_KHZ+RFLR_MODEMCONFIG1_CODINGRATE_4_8+\ RFLR_MODEMCONFIG1_IMPLICITHEADER_ON); SX1276Write( REG_LR_MODEMCONFIG2,\ RFLR_MODEMCONFIG2_SF_6|RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON); // SX1276Write( REG_LR_PREAMBLEMSB,4); SX1276Write( REG_LR_PREAMBLELSB,10); break; default: break; } if(!LSD_RF_FreqSet(1)) //设置为0信道 return SPI_READCHECK_WRONG; return NORMAL; } //===================================函数声明=================================================== //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF初始化 // 输入参数 : lora_param_t lora 输入参数 // 返回参数 : tSX127xError 错误枚举内容 //////////////////////////////////////////////////////////////////////////////// tSX127xError SX127x_initLora(lora_param_t *lora) { static uint8_t first = 1; // 检查参数 if(lora->sof != 0xC2 || lora->sf > 6 || (lora->baud != 3 && lora->baud != 5 && lora->baud != 7) || lora->ch > 40 || lora->bw > 9) return PARAMETER_INVALID; if(first) { first = 0; SX1276Init_IO(); // PAIO口初始化 } SX1276Reset(); //复位RF //切换到LoRamode,standby状态 SX1276Write( REG_LR_OPMODE, RFLR_OPMODE_SLEEP ); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_SLEEP ); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); /*------------------------------------------------ SPI 验证 */ uint8_t test = 0; SX1276Write( REG_LR_HOPPERIOD,0x91 );//选一个用不到的寄存器来做验证 SX1276Read( REG_LR_HOPPERIOD,&test); if(test!=0x91) return SPI_READCHECK_WRONG; SX1276Write( REG_LR_PACONFIG, 0xff ); //Frequency Configuration LSD_RF_FreqSet(lora->ch); //设置频率 //PA Configuration switch(lora->power) { case 0: // 20dBm LSD_RF_PoutSet(15); break; case 1: // 17dBm LSD_RF_PoutSet(15); break; case 2: // 14dBm LSD_RF_PoutSet(12); break; case 3: // 11dBm LSD_RF_PoutSet(9); break; } SX1276Write( REG_LR_PARAMP,RFLR_PARAMP_1000_US); // ↑PA Ramp的时间,如果用户LDO不能快速输出大电流(泵能力),适当增加PA Ramp时间 // ↑如果Ramp时间过短超过了LDO的能力时,会出现进入TX后,系统电流为发射电流,但是RF信号不出现的现象 SX1276Write( REG_LR_OCP,0x20|RFLR_OCP_TRIM_240_MA);//电流过载保护 Over Current Protection //PayloadLength 初始化 SX1276Write( REG_LR_PAYLOADLENGTH, RF_PAYLOAD_LEN); //注意,无头模式(Implicit Header)时,必须提前规定好收发双方的PL //BW、CR、ImplictHeader_On (SF6) / Off (SF7~12) SX1276Write( REG_LR_MODEMCONFIG1,\ (((uint8_t)(lora->bw << 4)) | ((uint8_t) ((lora->cr + 1) << 1))) | (lora->sf == 0 ? 0x01 : 0x00)); //SF、PayloadCrc_On SX1276Write( REG_LR_MODEMCONFIG2,\ ((uint8_t)((lora->sf + 6) << 4)) | 0x04); uint8_t temp = 0; SX1276Read( 0x31,&temp); if(0 == lora->sf) //慎用SF = 6,需要的配置很特殊 { SX1276Write( 0x31,(temp& 0xF8)|0x05); SX1276Write( 0x37,0x0C); } else { SX1276Write( 0x31,(temp& 0xF8)|0x03); SX1276Write( 0x37,0x0A); } //低速率优化功能是否开启、AutoAGC默认开启 // 在SF12和500kHz下,必须开启,否则误码率很高 SX1276Write( REG_LR_MODEMCONFIG3,(\ RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON\ )|RFLR_MODEMCONFIG3_AGCAUTO_ON); // 高频开关选项 SX1276Write( REG_LR_DIOMAPPING2, RFLR_DIOMAPPING2_DIO4_01); return NORMAL; } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF发送数据包 // 输入参数 : uint8_t*data:发送数据指针,uint8_t size发送数据长度 // 返回参数 : 无 // 说明 : 设置为发送是, preamble改回默认值 //////////////////////////////////////////////////////////////////////////////// void SX1276_TxPacket(uint8_t*data,uint8_t size) { SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_PREAMBLEMSB,0); SX1276Write( REG_LR_PREAMBLELSB,8); SX1276Write( REG_LR_PAYLOADLENGTH,size); SX1276WriteRxTx(true); SX1276Write( REG_LR_FIFOADDRPTR,0x80); SX1276WriteBuffer(REG_LR_FIFO,data,size); SX1276Write(REG_LR_IRQFLAGS,0xff); SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE_MASK)); SX1276Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 ); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_TRANSMITTER ); } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF进入接收状态 // 输入参数 : uint8_t clen 可变数据包下此值无效,固定数据包为长度值 // 返回参数 : 无 // 说明 : 进入接收后preamble设置回默认值为 //////////////////////////////////////////////////////////////////////////////// void Rx_mode(uint8_t clen) { SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_PREAMBLEMSB,0); SX1276Write( REG_LR_PREAMBLELSB,8); SX1276Write( REG_LR_PAYLOADLENGTH,clen); SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE_MASK | RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK)); SX1276Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_00 ); SX1276WriteRxTx(false); SX1276Write( REG_LR_FIFOADDRPTR,0x00); SX1276Write(REG_LR_IRQFLAGS,0xff); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_RECEIVER ); } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF接收可变数据包 // 输入参数 : uint8_t*cbuf接收数组指针,uint8_t *csize返回长度指针 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// void LSD_RF_RxVariPacket(uint8_t*cbuf,uint8_t *csize) { uint8_t flag, hop, ptr; SX1276Read(REG_LR_IRQFLAGS, &flag); SX1276Read(REG_LR_HOPCHANNEL, &hop); SX1276Read(REG_LR_FIFORXCURRENTADDR, &ptr); SX1276Read(REG_LR_NBRXBYTES,csize); SX1276Write( REG_LR_FIFOADDRPTR,ptr); SX1276ReadFifo(cbuf,*csize); SX1276Write(REG_LR_IRQFLAGS,0xff); if(!(flag & RFLR_IRQFLAGS_RXDONE) || ((hop & RFLR_HOPCHANNEL_PAYLOAD_CRC16_ON) && (flag & RFLR_IRQFLAGS_PAYLOADCRCERROR))) *csize = 0; } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF接收固定数据包 // 输入参数 : uint8_t*cbuf接收数组指针,uint8_t csize接收固定长度 // 返回参数 : 无 // 说明 : 在速率10k时只能采用固定数据包长度 //////////////////////////////////////////////////////////////////////////////// void LSD_RF_RxFixiPacket(uint8_t*cbuf,uint8_t *csize) { uint8_t flag, hop; SX1276Read(REG_LR_IRQFLAGS, &flag); SX1276Read(REG_LR_HOPCHANNEL, &hop); SX1276Write( REG_LR_FIFOADDRPTR,0x00); SX1276ReadFifo(cbuf,*csize); SX1276Write(REG_LR_IRQFLAGS,0xff); if(!(flag & RFLR_IRQFLAGS_RXDONE) || ((hop & RFLR_HOPCHANNEL_PAYLOAD_CRC16_ON) && (flag & RFLR_IRQFLAGS_PAYLOADCRCERROR))) *csize = 0; } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF进入standby状态 // 输入参数 : 无 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// void LSD_RF_StandbyMode(void) { SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF进入不同信道 // 输入参数 : uint8_t ch 范围0-40 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// uint8_t LSD_RF_FreqSet(uint8_t ch) { uint8_t test_FRFMSB = 0,test_FRFMID=0,test_FRFLSB=0; #if 0 SX1276Write( REG_LR_FRFMSB,Freq_Cal_Tab[3*ch]); SX1276Write( REG_LR_FRFMID,Freq_Cal_Tab[3*ch+1]); SX1276Write( REG_LR_FRFLSB,Freq_Cal_Tab[3*ch+2]); SX1276Read(REG_LR_FRFMSB,&test_FRFMSB); SX1276Read(REG_LR_FRFMID,&test_FRFMID); SX1276Read(REG_LR_FRFLSB,&test_FRFLSB); if(test_FRFMSB !=Freq_Cal_Tab[3*ch]) return 0; if(test_FRFMID !=Freq_Cal_Tab[3*ch+1]) return 0; if(test_FRFLSB !=Freq_Cal_Tab[3*ch+2]) return 0; #else const uint32_t FXOSC = 32000000ul; float fstep = FXOSC / 524288.0; uint32_t freq = 470000000ul + ch * 1000000ul; uint32_t frf = (uint32_t) (freq / fstep + 0.5); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_FRFMSB, (frf >> 16) & 0xFF); SX1276Write( REG_LR_FRFMID, (frf >> 8) & 0xFF); SX1276Write( REG_LR_FRFLSB, (frf & 0xff)); SX1276Read(REG_LR_FRFMSB,&test_FRFMSB); SX1276Read(REG_LR_FRFMID,&test_FRFMID); SX1276Read(REG_LR_FRFLSB,&test_FRFLSB); if(test_FRFMSB != ((frf >> 16) & 0xFF)) return 0; if(test_FRFMID != ((frf >> 8) & 0xFF)) return 0; if(test_FRFLSB != (frf & 0xff)) return 0; #endif return 1; } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF配置功率 // 输入参数 : 无 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// uint8_t LSD_RF_PoutSet(uint8_t power) { LSD_RF_StandbyMode(); SX1276Write( REG_LR_PACONFIG, 0xf0|power); uint8_t test = 0; SX1276Read(REG_LR_PACONFIG,&test); if((0xf0|power)!=test) return 0; SX1276Write( REG_LR_PADAC, 0x80|RFLR_PADAC_20DBM_ON ); return 1; } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF发送数据包 // 输入参数 : uint8_t*data:发送数据指针,uint8_t size发送数据长度 // 返回参数 : 无 // 说明 : 数据发送完成后DIO0从低电平变成高电平,每次调用此函数,会自动先将DIO0变为低,等待高电平 //////////////////////////////////////////////////////////////////////////////// void LSD_RF_SendPacket(uint8_t*cbuf,uint8_t csize) { unsigned long int j=0xFFFFFF; //超时用,用户需要根据实际情况来调整 DIO0_IFG_L; //清除DIO0标志位 DIO0_IES_L; //设置DIO0上升沿触发方式 DIO0_IE_L; //禁止DIO0中断 SX1276_TxPacket(cbuf,csize); //发送数据 while((!(DIO0_IFG&DIO0_BIT))&&j)j--; //等待GDIO0电平为高 DIO0_IFG_L; //清除中断标志位 } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF进入接收状态 // 输入参数 : uint8_t cclen 可变数据包无效,固定数据包时为长度值 // 返回参数 : 无 // 说明 : 接收数据完成后DIO0从低电平变成高电平, //////////////////////////////////////////////////////////////////////////////// void LSD_RF_RXmode(uint8_t cclen) { Rx_mode(cclen); //RF接收机切换到RX模式 //SX_DIO0_DIR = 0; //做输入 DIO0_IFG_L; //清除DIO0标志位 DIO0_IES_L; //设置DIO0上升沿触发方式 DIO0_IE_H; //使能DIO0中断 } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF进入Sleep状态 // 输入参数 : 无 // 返回参数 : 无 // 说明 : 无 //////////////////////////////////////////////////////////////////////////////// void LSD_RF_SleepMode(void) { SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write(REG_LR_IRQFLAGS,0xff); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_SLEEP ); //P1OUT &= ~BIT4; //PA_TX 初始化输出为0 //P1OUT &= ~BIT5; //PA_TX 初始化输出为0 目的是降低待机功耗 } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF CAD初始化 // 输入参数 : 无 // 返回参数 : 无 // 说明 : DIO1--CADDetected DIO3---CADDone //////////////////////////////////////////////////////////////////////////////// void LSD_RF_CADinit(void) { SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_PREAMBLEMSB,0xf0); SX1276Write( REG_LR_PREAMBLELSB,0xff); SX1276Write( REG_LR_IRQFLAGSMASK,\ ~(RFLR_IRQFLAGS_CADDONE|RFLR_IRQFLAGS_CADDETECTED)); // SX1276Write( REG_LR_DIOMAPPING1,\ RFLR_DIOMAPPING1_DIO3_00 | RFLR_DIOMAPPING1_DIO1_10); SX1276WriteRxTx(false); //set RF switch to RX path SX1276Write(REG_LR_IRQFLAGS,0xff); } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF启动CAD,采样信道情况一次 // 输入参数 : 无 // 返回参数 : 无 // 说明 : 采样时间约为(2^SF+32)/BW //////////////////////////////////////////////////////////////////////////////// void LSD_RF_CAD_Sample(void) { SX1276WriteRxTx(false); //set RF switch to RX path SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_CAD ); } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : WOR初始化 // 输入参数 : 无 // 返回参数 : 无 // 说明 : DIO1 :唤醒中断 DIO3:CAD超时中断(也可以认为是接收检测中断) //////////////////////////////////////////////////////////////////////////////// void LSD_RF_WORInit(void) { LSD_RF_CADinit(); //CAD功能初始化 //CADDone使能 //SX_DIO3_DIR=0; //做输入 DIO3_IFG_L; //清除DIO3标志位 DIO3_IES_L; //设置DIO3上升沿触发方式 DIO3_IE_H; //DIO3中断 //CADDetected使能 //SX_DIO1_DIR=0; //做输入 DIO1_IFG_L; //清除DIO1标志位 DIO1_IES_L; //设置DIO1上升沿触发方式 DIO1_IE_H; //使能DIO1中断 //关闭DIO0数据中断使能 DIO0_IE_L; //使能DIO0中断 } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : 执行WOR操作 // 输入参数 : uint8_t cclen 0:进入睡眠。1:进入CAD检测模式 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// void LSD_RF_WOR_Execute(uint8_t cclen) { switch(cclen) { case 0: //启动睡眠 LSD_RF_SleepMode(); //进入睡眠模式 ON_Sleep_Timerout(); //启动睡眠超时定时器 break; case 1: //进入CAD检测模式 OFF_Sleep_Timerout(); //关闭睡眠超时定时器 LSD_RF_CAD_Sample(); //启动CAD一次 break; default: break; } } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : WOR到RX // 输入参数 : 无 // 返回参数 : 无 // 说明 : 退出WOR,进入RX模式,前导preamble仍然采用最大设置值。 //////////////////////////////////////////////////////////////////////////////// void LSD_RF_WOR_Exit(uint8_t cclen) { OFF_Sleep_Timerout(); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_PAYLOADLENGTH,cclen); SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE)); SX1276Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_00 ); SX1276WriteRxTx(false); //set RF switch to RX path SX1276Write( REG_LR_FIFOADDRPTR,0x00); SX1276Write(REG_LR_IRQFLAGS,0xff); SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_RECEIVER ); //SX_DIO0_DIR = 0; //做输入 DIO0_IFG_L; //清除DIO0标志位 DIO0_IES_L; //设置DIO0上升沿触发方式 DIO0_IE_H; //使能DIO0中断 DIO1_IE_L; //禁止DIO1 DIO3_IE_L; //禁止DIO3 } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : RF发送唤醒包 // 输入参数 : uint8_t*data:发送数据指针,uint8_t size发送数据长度 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// void LSD_RF_Awake(uint8_t*cbuf,uint8_t csize) { //SX_DIO0_DIR = 0; DIO0_IFG_L; //清除DIO0标志位 DIO0_IES_L; //设置DIO0上升沿触发方式 DIO0_IE_L; //禁止DIO0中断 SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_PAYLOADLENGTH,csize); SX1276WriteRxTx(true); SX1276Write( REG_LR_FIFOADDRPTR,0x80); SX1276WriteBuffer(REG_LR_FIFO,cbuf,csize); SX1276Write(REG_LR_IRQFLAGS,0xff); SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE)); SX1276Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 ); SX1276Write( REG_LR_PREAMBLEMSB,0x03);//set preamble length SX1276Write( REG_LR_PREAMBLELSB,0xEC);//set preamble length SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_TRANSMITTER ); while((!DIO0_IFG)); //等待GDIO0电平为高 DIO0_IFG_L; //清除中断标志位 //发送完唤醒数据包后,将前导时间改回正常默认值。 SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY ); SX1276Write( REG_LR_PREAMBLEMSB,0);//set preamble length SX1276Write( REG_LR_PREAMBLELSB,10);//set preamble length } //***************************************************************************************** #endif