ShipCentralControl/RF-AP/RF_SX1276.h

1306 lines
49 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

////////////////////////////////////////////////////////////////////////////////
// 版权: 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 <stdbool.h>
#include <stdint.h>
#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
//切换到LoRamodestandby状态
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 :唤醒中断 DIO3CAD超时中断也可以认为是接收检测中断
////////////////////////////////////////////////////////////////////////////////
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