ShipCentralControl/RF-AP/资料及文档/SX127X参考例程/LSD_RF_SX1276.c

265 lines
10 KiB
C
Raw Normal View History

2025-04-07 09:18:02 +08:00
////////////////////////////////////////////////////////////////////////////////
// <20><>Ȩ: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD>Źɷ<C5B9><C9B7><EFBFBD><EFBFBD>޹<EFBFBD>˾
// <20>ļ<EFBFBD><C4BC><EFBFBD>:
// <20><EFBFBD><E6B1BE> v2.0
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IAR v5.30
// <20><><EFBFBD><EFBFBD>: <20>ں<EFBFBD><DABA><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 2013.12
// <20><><EFBFBD><EFBFBD>: API
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>:
// <20>޸<EFBFBD><DEB8><EFBFBD>־<EFBFBD><D6BE>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
////////////////////////////////////////////////////////////////////////////////
#include <stdint.h>
#include <stdbool.h>
#include "sx1276-LoRa.h"
#include "sx1276-f4152-Hal.h"
#include "LSD_RF_SX1276.h"
//===================================<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>===================================================
float G_BandWidthKHz = 500.0;//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>Symbol<6F><6C><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
float G_TsXms = 1.024;//1.024ms
S_LoRaConfig G_LoRaConfig = {
470000000,
BW500KHZ,
SF08,
CR_4_5,
15,
true,
true,
true,
64,
};
bool LoRaConfig_Check()
{
if((G_LoRaConfig.LoRa_Freq<137000000)||(G_LoRaConfig.LoRa_Freq>525000000))
return false;
G_LoRaConfig.BandWidth = (t_BandWidth)(G_LoRaConfig.BandWidth&0xF0);
if(G_LoRaConfig.BandWidth>BW500KHZ)
return false;
//<2F><><EFBFBD><EFBFBD>BandWidth
switch(G_LoRaConfig.BandWidth){
case BW500KHZ:G_BandWidthKHz = 500.0;break;
case BW250KHZ:G_BandWidthKHz = 250.0;break;
case BW125KHZ:G_BandWidthKHz = 125.0;break;
case BW62_50KHZ:G_BandWidthKHz = 62.5;break;
case BW41_66KHZ:G_BandWidthKHz = 41.66;break;
case BW31_25KHZ:G_BandWidthKHz = 31.25;break;
case BW20_83KHZ:G_BandWidthKHz = 20.83;break;
case BW15_62KHZ:G_BandWidthKHz = 15.62;break;
case BW10_41KHZ:G_BandWidthKHz = 10.41;break;
case BW7_81KHZ:G_BandWidthKHz = 7.81;break;
}
G_LoRaConfig.SpreadingFactor = (t_SpreadingFactor)(G_LoRaConfig.SpreadingFactor&0xF0);
if((G_LoRaConfig.SpreadingFactor>SF12)||(G_LoRaConfig.SpreadingFactor<SF06))
return false;
//<2F><><EFBFBD><EFBFBD>LoRa<52><61>Ԫ<EFBFBD><D4AA><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>λms
G_TsXms = (2<<((G_LoRaConfig.SpreadingFactor>>4)-1))/G_BandWidthKHz;
G_LoRaConfig.CodingRate = (t_CodingRate)(G_LoRaConfig.CodingRate&0x0E);
if((G_LoRaConfig.CodingRate>CR_4_8)||(G_LoRaConfig.CodingRate<CR_4_5))
return false;
if(G_LoRaConfig.PowerCfig>15)
return false;
if(G_LoRaConfig.PayloadLength>127)
return false;
return true;
}
//===================================<3D>Ӻ<EFBFBD><D3BA><EFBFBD>===================================================
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46>ʼ<EFBFBD><CABC>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : tSX127xInitPara initPara <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Init_LoRa_0_8K, Init_LoRa_4_8K , Init_LoRa_10k,
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : tSX127xError <20><><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ˵<><CBB5> : <20><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>ʼ<EFBFBD><CABC>Ĭ<EFBFBD><C4AC>Ϊ0<CEAA>ŵ<EFBFBD>
////////////////////////////////////////////////////////////////////////////////
tSX127xError SX127x_init()
{
if(false==LoRaConfig_Check()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return PARAMETER_INVALID; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
SX1276InitIo(); // PAIO<49>ڳ<EFBFBD>ʼ<EFBFBD><CABC>
SX1276Reset(); //<2F><>λRF
SX1276SPISetup(); //SPI<50><49>ʼ<EFBFBD><CABC>
//<2F>л<EFBFBD><D0BB><EFBFBD>LoRamode<64><65>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 <EFBFBD><EFBFBD>֤ */
uint8_t test = 0;
SX1276Write( REG_LR_HOPPERIOD,0x91 );//ѡһ<D1A1><D2BB><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤
SX1276Read( REG_LR_HOPPERIOD,&test);
if(test!=0x91)
return SPI_READCHECK_WRONG;
SX1276Write( REG_LR_DIOMAPPING2, RFLR_DIOMAPPING2_DIO4_01);
//Frequency Configuration
LSD_RF_FreqSet(); //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
//PA Configuration
LSD_RF_PoutSet();
SX1276Write( REG_LR_PARAMP,RFLR_PARAMP_0100_US);
// <20><>PA Ramp<6D><70>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>LDO<44><4F><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>PA Rampʱ<70><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Rampʱ<70><CAB1><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD><CCB3><EFBFBD><EFBFBD><EFBFBD>LDO<44><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>TX<54><58><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RF<52>źŲ<C5BA><C5B2><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>
SX1276Write( REG_LR_OCP,0x20|RFLR_OCP_TRIM_240_MA);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD> Over Current Protection
//PayloadLength <20><>ʼ<EFBFBD><CABC>
SX1276Write( REG_LR_PAYLOADLENGTH,G_LoRaConfig.PayloadLength);
//ע<><EFBFBD><E2A3AC>ͷģʽ<C4A3><CABD>Implicit Header<65><72>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><E6B6A8><EFBFBD>շ<EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD>PL
//BW<42><57>CR<43><52>Header<65><72><EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>ʼ<EFBFBD><CABC>
SX1276Write( REG_LR_MODEMCONFIG1,\
(((uint8_t)G_LoRaConfig.BandWidth)|((uint8_t)G_LoRaConfig.CodingRate))|(\
(true==G_LoRaConfig.ExplicitHeaderOn)?0x00:0x01));
//SF<53><46>CRC<52><43>ʼ<EFBFBD><CABC>
SX1276Write( REG_LR_MODEMCONFIG2,\
((uint8_t)G_LoRaConfig.SpreadingFactor)|(\
(true==G_LoRaConfig.CRCON)?0x04:0x00));
if(SF06==G_LoRaConfig.SpreadingFactor){ //<2F><><EFBFBD><EFBFBD>SF = 6<><36><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>
uint8_t temp = 0;
SX1276Read( 0x31,&temp);
SX1276Write( 0x31,(temp& 0xF8)|0x05);
SX1276Write( 0x37,0x0C);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AutoAGCĬ<43>Ͽ<EFBFBD><CFBF><EFBFBD>
SX1276Write( REG_LR_MODEMCONFIG3,((G_TsXms>16.0)?\
RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON:RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF\
)|RFLR_MODEMCONFIG3_AGCAUTO_ON);
return NORMAL;
}
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : uint8_t*data<74><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : <20><>
// ˵<><CBB5> : <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD> preamble<6C>Ļ<EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
////////////////////////////////////////////////////////////////////////////////
void SX1276_TxPacket(uint8_t*data)
{
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
SX1276Write( REG_LR_PREAMBLEMSB,0);
SX1276Write( REG_LR_PREAMBLELSB,10);
SX1276Write( REG_LR_PAYLOADLENGTH,G_LoRaConfig.PayloadLength);
SX1276WriteRxTx(true);
SX1276Write( REG_LR_FIFOADDRPTR,0x80);
SX1276WriteBuffer(REG_LR_FIFO,data,G_LoRaConfig.PayloadLength);
SX1276Write(REG_LR_IRQFLAGS,0xff);
SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE));
SX1276Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 );
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_TRANSMITTER );
}
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> :
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : <20><>
// ˵<><CBB5> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD>preamble<6C><65><EFBFBD>û<EFBFBD>Ĭ<EFBFBD><C4AC>ֵΪ
////////////////////////////////////////////////////////////////////////////////
void Rx_mode()
{
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
SX1276Write( REG_LR_PREAMBLEMSB,0);
SX1276Write( REG_LR_PREAMBLELSB,10);
SX1276Write( REG_LR_PAYLOADLENGTH,G_LoRaConfig.PayloadLength);
SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE));
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 );
}
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : uint8_t*cbuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : <20><>
// ˵<><CBB5> :
////////////////////////////////////////////////////////////////////////////////
void LSD_RF_RxPacket(uint8_t*cbuf)
{
if(true==G_LoRaConfig.ExplicitHeaderOn){
//<2F><>ͷ<EFBFBD><CDB7>ô<EFBFBD>ӼĴ<D3BC><C4B4><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G_LoRaConfig<69><67><EFBFBD>ó<EFBFBD><C3B3>ȶ<EFBFBD>ȡFIFO
SX1276Read(REG_LR_NBRXBYTES,&G_LoRaConfig.PayloadLength);
SX1276Write( REG_LR_FIFOADDRPTR,0x00);
}
SX1276ReadFifo(cbuf,G_LoRaConfig.PayloadLength);
SX1276Write(REG_LR_IRQFLAGS,0xff);
}
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46><EFBFBD><EFBFBD>SLEEP״̬
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : <20><>
// ˵<><CBB5> :
////////////////////////////////////////////////////////////////////////////////
void LSD_RF_SleepMode(void)
{
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_SLEEP );
}
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46><EFBFBD><EFBFBD>standby״̬
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : <20><>
// ˵<><CBB5> :
////////////////////////////////////////////////////////////////////////////////
void LSD_RF_StandbyMode(void)
{
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
}
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : <20><>
// ˵<><CBB5> :
////////////////////////////////////////////////////////////////////////////////
tSX127xError LSD_RF_FreqSet()
{
if((G_LoRaConfig.LoRa_Freq>525000000)||(G_LoRaConfig.LoRa_Freq<137000000))
return PARAMETER_INVALID;
uint32_t freq_reg = (uint32_t)(G_LoRaConfig.LoRa_Freq/FREQ_STEP);
uint8_t test_FRFMSB = 0,test_FRFMID=0,test_FRFLSB=0;
LSD_RF_StandbyMode();
// FREQ = 474.6MHz
SX1276Write( REG_LR_FRFMSB, (uint8_t)(freq_reg>>16));//Carrier Freq 470M
SX1276Write( REG_LR_FRFMID, (uint8_t)(freq_reg>>8) );
SX1276Write( REG_LR_FRFLSB, (uint8_t)(freq_reg) );
SX1276Read(REG_LR_FRFMSB,&test_FRFMSB);
SX1276Read(REG_LR_FRFMID,&test_FRFMID);
SX1276Read(REG_LR_FRFLSB,&test_FRFLSB);
if(test_FRFMSB != (uint8_t)(freq_reg>>16))
return SPI_READCHECK_WRONG;
if(test_FRFMID != (uint8_t)(freq_reg>>8))
return SPI_READCHECK_WRONG;
if(test_FRFLSB != (uint8_t)(freq_reg))
return SPI_READCHECK_WRONG;
return NORMAL;
}
////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : RF<52><46><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> : <20><>
// ˵<><CBB5> :
////////////////////////////////////////////////////////////////////////////////
tSX127xError LSD_RF_PoutSet()
{
if(G_LoRaConfig.PowerCfig>15)
return PARAMETER_INVALID;
LSD_RF_StandbyMode();
SX1276Write( REG_LR_PACONFIG, 0xf0|G_LoRaConfig.PowerCfig);
uint8_t test = 0;
SX1276Read(REG_LR_PACONFIG,&test);
if((0xf0|G_LoRaConfig.PowerCfig)!=test)
return SPI_READCHECK_WRONG;
if(true==G_LoRaConfig.MaxPowerOn)
SX1276Write( REG_LR_PADAC, 0x80|RFLR_PADAC_20DBM_ON );
else
SX1276Write( REG_LR_PADAC, 0x80|RFLR_PADAC_20DBM_OFF );
return NORMAL;
}