#include "sx1278.h"
#include "uart.h"
#include "eerom.h"
#include "delay.h"
#include "stdlib.h"
#include "time.h"
//=========================================================================================================================================================================================
//SX1278的SPI口不支持MODE2
//=========================================================================================================================================================================================
Union_RF RF_Cfg;
FLG_BIT RF_Flag;
//=========================================================================================================================================================================================
unsigned char RF_Sending_Time=0;
unsigned char RF_EX0_STATUS;
unsigned char CRC_Value;
unsigned char SX1278_RLEN;
unsigned char SX1278_TLEN;
unsigned char LORA_Dat_Send[128];
unsigned char LORA_Dat_Rev[128];
//频点代码Freq_Code,扩频因子SpreadingFactor,功率PowerValue,
//=========================================================================================================================================================================================
//=========================================================================================================================================================================================
//DIO0--PB0;DIO1--PB1;DIO2--PB2;DIO3--PB3;DIO4--PB4;DIO5--NC; DIO3--CADDONE,DIO1--CADDETECT,DIO0--RXDONE&TXDONE,
//=========================================================================================================================================================================================
void IO_Exti_Init(void)
{
PB_DDR_DDR0 =0; //PB0输入
PB_CR1_C10 =1; //PB0上拉
PB_CR2_C20 =1; //PB0中断使能
// CPU_CCR =0X28; //等级3
EXTI_CONF =0x00; //PB0->EXTI0
EXTI_CR1 =0x01; //上升沿触发
EXTI_CR3 =0x01; //上升沿触发
PB_DDR_DDR1 =0; //PB1输入
PB_CR1_C11 =1; //PB1上拉
PB_CR2_C21 =0; //PB1中断禁止
PB_DDR_DDR3 =0; //PB3输入
PB_CR1_C13 =1; //PB3上拉
PB_CR2_C23 =0; //PB3中断禁止
}
//=========================================================================================================================================================================================
#pragma vector= EXTI0_vector
__interrupt void EXTI0_IRQHandler(void)
{
if(EXTI_SR1_bit.P0F==1) //是否外部中断0触发
{
EXTI_SR1_bit.P0F =1; //清除中断标志
RF_IO_Exti_Flag =1;
}
}
//=========================================================================================================================================================================================
void RF_Par_Init(void)
{
unsigned char i;
unsigned char Buff[15];
for(i=0;i<16;i++)
RF_Cfg.RF_Par.Power[i] =0x80+i;
EEPROM_ReadnByte(0,Buff,8);
if(Buff[0]==0x01)
{
RF_Cfg.RF_Par.Local_ID =Buff[1];
RF_Cfg.RF_Par.Remote_ID =Buff[2];
if(Buff[3]<64)
RF_Cfg.RF_Par.Freq_i =Buff[3]; //频点代码,0~64,默认32(434Hz),370MHz ~ 496MHz
if(Buff[4]<16)
RF_Cfg.RF_Par.Power_i =Buff[4]; //功率代码0~15,默认7
if((Buff[5]>5)&&(Buff[5]<13))
RF_Cfg.RF_Par.Spd_Factor =Buff[5]; //扩频因子选小一些,发射时间会更快一些,6-12,默认7. 6~64 chips/symbol, 7~128,8~256, 9~ 512, 10~1024, 11~2048, 12~4096 chips/symbol
if((Buff[6]>0)&&(Buff[6]<5))
RF_Cfg.RF_Par.CodingRate =Buff[6]; //有效数据比,1~4,默认2,Error coding rate, 1~4/5, 2~4/6, 3~4/7, 4~4/8
if(Buff[7]<10)
RF_Cfg.RF_Par.BW_Freq =Buff[7]; //带宽代码,0~9,默认7。0~7.8K, 1~10.4K, 2~15.6K, 3~20.8K, 4~31.25K, 5~41.7K, 6~62.5K, 7~125K, (8~250K, 9~500K)
//In the lower band (169MHz), signal bandwidths 8&9 are not supported
}
else
{
RF_Cfg.RF_Par.Local_ID =0x01;
RF_Cfg.RF_Par.Remote_ID =0x00;
RF_Cfg.RF_Par.Freq_i =32; //频点代码,0~64,默认32(434Hz),370MHz ~ 496MHz
RF_Cfg.RF_Par.Power_i =7; //功率代码0~15,默认7
RF_Cfg.RF_Par.Spd_Factor =7; //扩频因子选小一些,发射时间会更快一些,7-12,默认7. 6~64 chips/symbol, 7~128,8~256, 9~ 512, 10~1024, 11~2048, 12~4096 chips/symbol
RF_Cfg.RF_Par.CodingRate =2; //有效数据比,1~4,默认2,Error coding rate, 1~4/5, 2~4/6, 3~4/7, 4~4/8
RF_Cfg.RF_Par.BW_Freq =7; //带宽代码,4~9,默认7。0~7.8K, 1~10.4K, 2~15.6K, 3~20.8K, 4~31.25K, 5~41.7K, 6~62.5K, 7~125K, (8~250K, 9~500K)
//In the lower band (169MHz), signal bandwidths 8&9 are not supported
}
}
//=========================================================================================================================================================================================
void SX1276ReadBuffer_Tst( unsigned char addr, unsigned char *buffer, unsigned char size )
{
unsigned char i;
LORAnCSS =0;
Spi_Comm( addr & 0x7F );
for( i = 0; i < size; i++ )
buffer[i] = Spi_Comm(0x00);
LORAnCSS =1;
}
//=========================================================================================================================================================================================
void SX1276Read( unsigned char addr, unsigned char *data )
{
SX1276ReadBuffer_Tst( addr, data, 1 );
}
//=========================================================================================================================================================================================
void SX1276Reset(void)
{
LORAnRST =0;
Delayms(1);
LORAnRST =1;
Delayms(15);
}
//=========================================================================================================================================================================================
unsigned char SX1276ReadBuffer(unsigned char addr)
{
unsigned char Value;
LORAnCSS =0; //NSS = 0;
Spi_Comm( addr & 0x7f );
Value = Spi_Comm(0x00);
LORAnCSS =1; //NSS = 1;
return Value;
}
//=========================================================================================================================================================================================
void SX1276WriteBuffer( unsigned char addr, unsigned char buffer)
{
LORAnCSS =0; //NSS = 0;
Spi_Comm( addr | 0x80 );
Spi_Comm( buffer);
LORAnCSS =1; //NSS = 1;
}
//=========================================================================================================================================================================================
unsigned short SX1276LoRaGetCurrentRSSI(void)
{
unsigned char Reg_RSSIValue;
Reg_RSSIValue =SX1276ReadBuffer(REG_LR_RSSIVALUE);
return(-164+Reg_RSSIValue);
}
//=========================================================================================================================================================================================
void SX1276LoRaSetOpMode( RFMode_SET opMode )
{
unsigned char opModePrev;
opModePrev=SX1276ReadBuffer(REG_LR_OPMODE); //读0x01模式寄存器
opModePrev &=0xf8; //清零低三位
opModePrev |= (unsigned char)opMode; //或上形参
SX1276WriteBuffer( REG_LR_OPMODE, opModePrev); //重新写回去
}
//=========================================================================================================================================================================================
void SX1276LoRaFsk( Debugging_fsk_ook opMode )
{
unsigned char opModePrev;
opModePrev=SX1276ReadBuffer(REG_LR_OPMODE); //读0x01模式寄存器
opModePrev &=0x7F; //清零最高位
opModePrev |= (unsigned char)opMode; //或上形参
SX1276WriteBuffer( REG_LR_OPMODE, opModePrev); //重新写回去
}
//=========================================================================================================================================================================================
//设置频率(在设置频率的时候避开32M的倍数频率,如果设置为32M的倍数频率的接收灵敏度就会很低,会影响距离)
void SX1276LoRaSetRFFrequency(unsigned char Code)
{
UNION_uHEX4