#include "drv_sx1278.h"
#include "drv_uart.h"
/*
================================================================================
描述 :
输入 :
输出 :
================================================================================
*/
void drv_sx1278_init(DrvSx1278Struct *psx1278)
{
hal_sx1278_rst(&psx1278->tag_hal_sx1278);//复位
drv_sx1278_set_on(psx1278);
drv_sx1278_set_default_param(psx1278);
printf("drv_sx1278b version=0x%02X\n", drv_sx1278_get_version(psx1278));
}
/*
================================================================================
描述 :设置lora的默认参数
输入 :
输出 :
================================================================================
*/
void drv_sx1278_set_default_param(DrvSx1278Struct *psx1278 )
{
hal_sx1278_write_addr( &psx1278->tag_hal_sx1278, REG_LR_LNA, RFLR_LNA_GAIN_G1);
drv_sx1278_set_rf_freq( psx1278, LR_SET_RF_FREQ ); // 设置载波频率
drv_sx1278_set_sf( psx1278, LR_SET_SF ); // 设置扩频因子 SF6 only operates in implicit header mode.
drv_sx1278_set_error_coding( psx1278, LR_SET_CR ); // 设置纠错编码率
drv_sx1278_set_packet_crc_on( psx1278, LR_SET_CRC_ON ); // CRC开关
drv_sx1278_set_bw( psx1278, LR_SET_RF_BW ); // 设置带宽
drv_sx1278_set_implicit_header_on( psx1278, LR_SET_IM_ON); // 设置显式/隐式报头模式
drv_sx1278_set_symb_timeout( psx1278, 0x3FF );//设置RX超时
drv_sx1278_set_payload_length(psx1278, LR_SET_PAY_LEN);//负载字节长度
drv_sx1278_set_lowdatarateoptimize( psx1278, true ); // 低速率优化模式,符号长度超过 16ms时必须打开
drv_sx1278_set_pa_output( psx1278, RFLR_PACONFIG_PASELECT_PABOOST );//选择PA输出引脚
drv_sx1278_set_rf_power( psx1278, LR_SET_RF_PWR );
hal_sx1278_write_addr( &psx1278->tag_hal_sx1278, REG_LR_OCP, (hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_OCP)& RFLR_OCP_TRIM_MASK) | RFLR_OCP_TRIM_180_MA );//为PA开启过流保护 180mA
drv_sx1278_set_op_mode( psx1278, RFLR_OPMODE_STANDBY );//进入待机模式
}
/*
================================================================================
描述 :设置模块的工作模式
输入 :
输出 :
================================================================================
*/
void drv_sx1278_set_op_mode(DrvSx1278Struct *psx1278, u8 opMode)
{
hal_sx1278_write_addr( &psx1278->tag_hal_sx1278, REG_LR_OPMODE, (hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_OPMODE)& RFLR_OPMODE_MASK) | opMode );
}
/*
================================================================================
描述 :
输入 :
输出 :
================================================================================
*/
void drv_sx1278_set_on(DrvSx1278Struct *psx1278)
{
drv_sx1278_set_op_mode(psx1278, RFLR_OPMODE_SLEEP );//进入睡眠模式
hal_sx1278_write_addr( &psx1278->tag_hal_sx1278, REG_LR_OPMODE, (hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_OPMODE) & RFLR_OPMODE_LONGRANGEMODE_MASK) | RFLR_OPMODE_LONGRANGEMODE_ON );//开启Lora模式
drv_sx1278_set_op_mode( psx1278, RFLR_OPMODE_STANDBY );//进入待机模式
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_DIOMAPPING1, 0);
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_DIOMAPPING2, 0);
}
/*
================================================================================
描述 :设置载波频率
输入 :
输出 :
================================================================================
*/
void drv_sx1278_set_rf_freq( DrvSx1278Struct *psx1278, uint32_t freq )
{
freq = ( uint32_t )( ( double )freq / ( double )FREQ_STEP );
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_FRFMSB, ( freq >> 16 ) & 0xFF);
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_FRFMID, ( freq >> 8 ) & 0xFF);
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_FRFLSB, ( freq >> 0 ) & 0xFF);
}
/*
================================================================================
描述 :获取载波频率
输入 :
输出 :
================================================================================
*/
uint32_t drv_sx1278_get_rf_freq( DrvSx1278Struct *psx1278 )
{
uint32_t RFFrequency = 0;
RFFrequency = hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_FRFMSB);
RFFrequency <<= 8;
RFFrequency |= hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_FRFMID);
RFFrequency <<= 8;
RFFrequency |= hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_FRFLSB);
RFFrequency *= XTAL_FREQ;
RFFrequency >>= 4;
RFFrequency *= 100;
RFFrequency >>= 6;
RFFrequency *= 100;
RFFrequency >>= 6;
RFFrequency *= 100;
RFFrequency >>= 3;
return RFFrequency;
}
/*
================================================================================
描述 :
输入 :
输出 :
================================================================================
*/
void drv_sx1278_set_sf( DrvSx1278Struct *psx1278, uint8_t factor )
{
if( factor > 12 )
{
factor = 12;
}
else if( factor < 6 )
{
factor = 6;
}
if( factor == 6 )
{
drv_sx1278_set_nb_trig_peaks( psx1278, 5 );
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_DETECTIONTHRESHOLD, RFLR_DETECTIONTHRESH_SF6);
}
else
{
drv_sx1278_set_nb_trig_peaks( psx1278, 3 );
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_DETECTIONTHRESHOLD, RFLR_DETECTIONTHRESH_SF7_TO_SF12);
}
hal_sx1278_write_addr(&psx1278->tag_hal_sx1278, REG_LR_MODEMCONFIG2, (hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_MODEMCONFIG2)& RFLR_MODEMCONFIG2_SF_MASK ) | ( factor << 4 ) );
}
/*
================================================================================
描述 :
输入 :
输出 :
================================================================================
*/
int16_t drv_sx1278_read_rssi( DrvSx1278Struct *psx1278 )
{
uint8_t RegPktRssiValue,rxSnrEstimate;
int8_t RxPacketSnrEstimate;
int16_t RxPacketRssiValue;
// Reads the RSSI value
RegPktRssiValue = hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_PKTRSSIVALUE );
rxSnrEstimate = hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_PKTSNRVALUE );
RxPacketSnrEstimate = ((int8_t)rxSnrEstimate ) >> 2;
if( drv_sx1278_get_rf_freq(psx1278) <= RF_MID_BAND_THRESH ) // LF
{
if(RxPacketSnrEstimate<0)
{
RxPacketRssiValue = RSSI_OFFSET_LF + RegPktRssiValue + (RxPacketSnrEstimate>>2);
}
else
{
RxPacketRssiValue = RSSI_OFFSET_LF + RegPktRssiValue;
}
}
else
{
if(RxPacketSnrEstimate<0)
{
RxPacketRssiValue = RSSI_OFFSET_HF + RegPktRssiValue + (RxPacketSnrEstimate>>2);
}
else
{
RxPacketRssiValue = RSSI_OFFSET_HF + RegPktRssiValue;
}
}
return RxPacketRssiValue;
}
/*
================================================================================
描述 :
输入 :
输出 :
================================================================================
*/
void drv_sx1278_set_rf_power( DrvSx1278Struct *psx1278, int8_t power )
{
uint8_t RegPaConfig;
RegPaConfig = hal_sx1278_read_addr(&psx1278->tag_hal_sx1278, REG_LR_PACONFIG );
if( ( RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST )
{
if( power < 5 )
{
power = 5;
}
if( power > 20 )
{
power = 20;
}
if ( power >= 20 )
{
drv_sx1278_set_pa20dBm( psx1278, true );
RegPaConfig = (RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 5 ) & 0x0F );
printf("20dbm\n");
}
else
{
RegPaConfig = ( RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | ( uint8_t )( ( uint16_t )( power - 2 ) & 0x0F );
}
RegPaConfig = (RegPaConfig & RFL