/******CSDN下载例程重新编译一警告L406************/
/******2019 4 27 08:23 CODE1371******************/
#include
#define u8 unsigned char
#define u16 unsigned int
////////////////////////////////////////////////////////////////
sbit LED=P2^0;
#define rx_yes LED=0;
#define rx_no LED=1;
/***spi.h***/
sbit CE =P1^0;
sbit NSS =P1^1;
sbit SCK =P1^2;
sbit MOSI =P1^3;
sbit MISO =P1^4;
sbit Get_NIRQ = P1^5;
//函数声明
void SPICmd8bit(u8 WrPara);
u8 SPIRead(u8 adr);
u8 SPIRead8bit(void);
void SPIWrite(u8 adr, u8 WrPara);
void SPIBurstRead(u8 adr, u8 *ptr, u8 length);
void BurstWrite(u8 adr, u8 *ptr, u8 length);
/***spi.c***/
void SPICmd8bit(u8 WrPara)
{
u8 bitcnt;
NSS=0;
SCK=0;
for(bitcnt=8; bitcnt!=0; bitcnt--)
{
SCK=0;
if(WrPara&0x80)
MOSI=1;
else
MOSI=0;
;;
SCK=1;
;
WrPara <<= 1;
}
SCK=0;
MOSI=1;
}
//////////////////////////////////////////////////////////////////////////////////////
u8 SPIRead8bit(void)
{
u8 RdPara = 0;
u8 bitcnt;
NSS=0;
MOSI=1;//Read one byte data from FIFO, MOSI hold to High
for(bitcnt=8; bitcnt!=0; bitcnt--)
{
SCK=0;
;;
RdPara <<= 1;
SCK=1;
if(MISO)
RdPara |= 0x01;
else
RdPara |= 0x00;
}
SCK=0;
return(RdPara);
}
//////////////////////////////////////////////////////////////////////////////////////
u8 SPIRead(u8 adr)
{
u8 tmp;
SPICmd8bit(adr);//Send address first
tmp = SPIRead8bit();
NSS=1;
return(tmp);
}
//////////////////////////////////////////////////////////////////////////////////////
void SPIWrite(u8 adr, u8 WrPara)
{
NSS=0;
SPICmd8bit(adr|0x80);//写入地址
SPICmd8bit(WrPara); //写入数据
SCK=0;
MOSI=1;
NSS=1;
}
//////////////////////////////////////////////////////////////////////////////////////
void SPIBurstRead(u8 adr, u8 *ptr, u8 length)
{
u8 i;
if(length<=1)//length must more than one
return;
else
{
SCK=0;
NSS=0;
SPICmd8bit(adr);
for(i=0;i
NSS=1;
}
}
//////////////////////////////////////////////////////////////////////////////////////
void BurstWrite(u8 adr, u8 *ptr, u8 length)
{
u8 i;
if(length<=1)//length must more than one
return;
else
{
SCK=0;
NSS=0;
SPICmd8bit(adr|0x80);
for(i=0;i
NSS=1;
}
}
/***sx1278.h***/
///////////////////////////////////////扩频模式 ///////////////////////////////////////
//纠错编码率(CR)设置
#define CR_4_5
#ifdef CR_4_5
#define CR 0x01 // 4/5
#else
#ifdef CR_4_6
#define CR 0x02 // 4/6
#else
#ifdef CR_4_7
#define CR 0x03 // 4/7
#else
#ifdef CR_4_8
#define CR 0x04 // 4/8
#endif
#endif
#endif
#endif
//CRC 使能
#define CRC_EN
#ifdef CRC_EN
#define CRC 0x01//CRC使能
#else
#define CRC 0x00
#endif
/********************扩频模式寄存器地址定义***************************/
#define LR_RegFifo 0x00
//常用设置
#define LR_RegOpMode 0x01
#define LR_RegFrMsb 0x06
#define LR_RegFrMid 0x07
#define LR_RegFrLsb 0x08
//Tx设置
#define LR_RegPaConfig 0x09
#define LR_RegPaRamp 0x0A
#define LR_RegOcp 0x0B
//Rx设置
#define LR_RegLna 0x0C
//LoRa寄存器
#define LR_RegFifoAddrPtr 0x0D
#define LR_RegFifoTxBaseAddr 0x0E
#define LR_RegFifoRxBaseAddr 0x0F
#define LR_RegFifoRxCurrentaddr 0x10
#define LR_RegIrqFlagsMask 0x11
#define LR_RegIrqFlags 0x12
#define LR_RegRxNbBytes 0x13
#define LR_RegRxHeaderCntValueMsb 0x14
#define LR_RegRxHeaderCntValueLsb 0x15
#define LR_RegRxPacketCntValueMsb 0x16
#define LR_RegRxPacketCntValueLsb 0x17
#define LR_RegModemStat 0x18
#define LR_RegPktSnrValue 0x19
#define LR_RegPktRssiValue 0x1A
#define LR_RegRssiValue 0x1B
#define LR_RegHopChannel 0x1C
#define LR_RegModemConfig1 0x1D
#define LR_RegModemConfig2 0x1E
#define LR_RegSymbTimeoutLsb 0x1F
#define LR_RegPreambleMsb 0x20
#define LR_RegPreambleLsb 0x21
#define LR_RegPayloadLength 0x22
#define LR_RegMaxPayloadLength 0x23
#define LR_RegHopPeriod 0x24
#define LR_RegFifoRxByteAddr 0x25
//I/O设置
#define REG_LR_DIOMAPPING1 0x40
#define REG_LR_DIOMAPPING2 0x41
//版本
#define REG_LR_VERSION 0x42
//额外设置
#define REG_LR_PLLHOP 0x44
#define REG_LR_TCXO 0x4B
#define REG_LR_PADAC 0x4D
#define REG_LR_FORMERTEMP 0x5B
#define REG_LR_AGCREF 0x61
#define REG_LR_AGCTHRESH1 0x62
#define REG_LR_AGCTHRESH2 0x63
#define REG_LR_AGCTHRESH3 0x64
/********************FSK/ook模式寄存器地址定义***************************/
#define RegFIFO 0x00 //FIFO
#define RegOpMode 0x01 //操作模式
#define RegBitRateMsb 0x02 //BR 高位
#define RegBitRateLsb 0x03 //BR 低位
#define RegFdevMsb 0x04 //FD 高位
#define RegFdevLsb 0x05 //FD 低位
#define RegFreqMsb 0x06 //Freq 高位
#define RegFreqMid 0x07 //Freq 中位
#define RegFreqLsb 0x08 //Freq 低位
#define RegPaConfig 0x09
#define RegPaRamp 0x0a
#define RegOcp 0x0b
#define RegLna 0x0c
#define RegRxConfig 0x0d
#define RegRssiConfig 0x0e
#define RegRssiCollision 0x0f
#define RegRssiThresh 0x10
#define RegRssiValue 0x11
#define RegRxBw 0x12
#define RegAfcBw 0x13
#define RegOokPeak 0x14
#define RegOokFix 0x15
#define RegOokAvg 0x16
#define RegAfcFei 0x1a
#define RegAfcMsb 0x1b
#define RegAfcLsb 0x1c
#define RegFeiMsb 0x1d
#define RegFeiLsb 0x1e
#define RegPreambleDetect 0x1f
#define RegRxTimeout1 0x20
#define RegRxTimeout2 0x21
#define RegRxTimeout3 0x22
#define RegRxDelay 0x23
#define RegOsc 0x24
#define RegPreambleMsb 0x25
#define RegPreambleLsb 0x26
#define RegSyncConfig 0x27
#define RegSyncValue1 0x28
#define RegSyncValue2 0x29
#define RegSyncValue3 0x2a
#define RegSyncValue4 0x2b
#define RegSyncValue5 0x2c
#define RegSyncValue6 0x2d
#define RegSyncValue7 0x2e
#define RegSyncValue8 0x2f
#define RegPacketConfig1 0x30
#define RegPacketConfig2 0x31
#define RegPayloadLength 0x32
#define RegNodeAdrs 0x33
#define RegBroadcastAdrs 0x34
#define RegFifoThresh 0x35
#define RegSeqConfig1 0x36
#define RegSeqConfig2 0x37
#define RegTimerResol 0x38
#define RegTimer1Coef 0x39
#define RegTimer2Coef 0x3a
#define RegImageCal 0x3b
#define RegTemp 0x3c
#define RegLowBat 0x3d
#define RegIrqFlags1 0x3e
#define RegIrqFlags2 0x3f
#define RegDioMapping1 0x40
#define RegDioMapping2 0x41
#define RegVersion 0x42
#define RegPllHop 0x44
#define RegPaDac 0x4d
#define RegBitRateFrac 0x5d
/*********************************************************/
//命令
/*********************************************************/
extern u8 mode;
extern u8 Freq_Sel;
extern u8 Power_Sel;
extern u8 Lora_Rate_Sel;
extern u8 BandWide_Sel;
extern u8 Fsk_Rate_Sel;
extern u16 SysTime;
extern void delay_ms(unsigned int ms);
extern void delay_us(unsigned int us);
//////////////////////////////////////////函数声明/////////////////////////////////////
extern u8 xdata RxData[64];
extern u8 xdata sx1276_7_8Data[21];
extern void sx1276_7_8_Config(void);
extern void sx1276_7_8_Standby(void);
extern void sx1276_7_8_Sleep(void);
extern void sx1276_7_8_EntryLoRa(void);
extern void sx1276_7_8_LoRaClearIrq(void);
extern u8 sx1276_7_8_LoRaEntryRx(void);
extern u8 sx1276_7_8_LoRaRxPacket(void);
extern u8 sx1276_7_8_LoRaEntryTx(void);
extern u8 sx1276_7_8_LoRaTxPacket(void);
//extern u8 sx1276_7_8_LoRaReadRSSI(void);
//extern u8 sx1276_7_8_LoRaReadRSSI(void);
extern void sx1276_7_8_ConfigRX(void);
extern void sx1276_7_8_ConfigTX(void);
/***sx1278.c***/
//参数表定义
const u8 sx1276_7_8FreqTbl[1][3] =
{
{0x6C, 0x80, 0x00}, //434MHz
};
const u8 sx1276_7_8PowerTbl[4] =
{
0xFF, //20dbm
0xFC, //17dbm
0xF9, //14dbm
0xF6, //11dbm
};
const u8 sx1276_7_8SpreadFactorTbl[7] =
{
6,7,8,9,10,11,12
};
const u8 sx1276_7_8LoRaBwTbl[10] =
{
//7.8KHz,10.4KHz,15.6KHz,20.8KHz,31.2KHz,41.7KHz,62.5KHz,125KHz,250KHz,500KHz
0,1,2,3,4,5,6,7,8,9
};
//////////////////////////////////////////////////////////////////////////////////////
/**********************************************************
**名字: sx1276_7_8_Standby
**功能: Entry standby mode
**输入: None
**输出: None
**********************************************************/
void sx1276_7_8_Standby(void)
{
SPIWrite(LR_RegOpMode,0x09); //待机//低频模式
//SPIWrite(LR_RegOpMode,0x01);//待机//高频模式
}
/**********************************************************
**名字: sx1276_7_8_Sleep
**功能: Entry sleep mode
**输入: None
**输出: None
**********************************************************/
void sx1276_7_8_Sleep(void)
{
SPIWrite(LR_RegOpMode,0x08); //睡眠//低频模式
//SPIWrite(LR_RegOpMode,0x00);//睡眠//高频模式
}
/*********************************************************/
//扩频模式函数
/*********************************************************/
/**********************************************************
**名字: sx1276_7_8_EntryLoRa
**功能: 配置进入扩频模式
**输入: None
**输出: None
**********************************************************/
void sx1276_7_8_EntryLoRa(void)
{
SPIWrite(LR_RegOpMode,0x88); //低频模式
//SPIWrite(LR_RegOpMode,0x80);//高频模式
}
/**********************************************************
**名字: sx1276_7_8_LoRaClearIrq
**功能: 清楚所有中断
**输入: None
**输出: None
**********************************************************/
void sx1276_7_8_LoRaClearIrq(void)
{
SPIWrite(LR_RegIrqFlags,0xFF);
}
/**********************************************************
**名字: sx1276_7_8_LoRaEntryRx
**功能: 进入LORa RX模式
**输入: None
**输出: 0-超时错误
**********************************************************/
u8 sx1276_7_8_LoRaEntryRx(void)
{
u8 addr;
sx1276_7_8_ConfigRX(); //基本参数配置
SPIWrite(REG_LR_PADAC,0x84); //正常的Rx
SPIWrite(LR_RegHopPeriod,0xFF); //RegHopPeriod 无跳频
SPIWrite(REG_LR_DIOMAPPING1,0x01); //DIO0=00, DIO1=00, DIO2=00, DIO3=01
SPIWrite(LR_RegIrqFlagsMask,0x3F); //打开RxDone中断&超时0011 1111
sx1276_7_8_LoRaClearIrq();
SPIWrite(LR_RegPayloadLength,21); //RegPayloadLength 21字节(在扩频因子为6时数据大于一字节此寄存器必须配置)
addr = SPIRead(LR_RegFifoRxBaseAddr);//Read RxBaseAddr
SPIWrite(LR_RegFifoAddrPtr,addr); //RxBaseAddr -> FiFoAddrPtr
SPIWrite(LR_RegOpMode,0x8d); //连续Rx模式//低频模式10001101
//SPIWrite(LR_RegOpMode,0x05); //连续Rx模式//高频模式
SysTime = 0;
while(1)
{
if((SPIRead(LR_RegModemStat)&0x04)==0x04)//Rx-on going RegModemStat//RX进行中
return 1;
break;
if(SysTime>=3)
return 0; //超时错误
}
} //PROG.C(404): warning C291: not every exit path returns a value
/**********************************************************
**名字: sx1276_7_8_LoRaReadRSSI
**功能: 读RSSI的值
**输入: none
**输出: temp, RSSI value
**********************************************************/
/*u8 sx1276_7_8_LoRaReadRSSI(void)
{
u16 temp=10;
temp=SPIRead(LR_RegRssiValue);//读RegRssiValue,Rssi的值
temp=temp+127-137; //127:Max RSSI, 137:RSSI offset
return (u8)temp;
}*/
/**********************************************************
**名字: sx1276_7_8_LoRaRxPacket
**功能: Receive data in LoRa mode
**输入: None
**输出: 1- Success 0- Fail
**********************************************************/
u8 sx1276_7_8_LoRaRxPacket(void)
{
u8 i;
u8 addr;
u8 packet_size;
if(Get_NIRQ)
{
for(i=0;i<32;i++)
RxData[i] = 0x00;
addr = SPIRead(LR_RegFifoRxCurrentaddr); //接收到最后一个数据包的起始地址(数据缓冲区中)
SPIWrite(LR_RegFifoAddrPtr,addr); //RxBaseAddr -> FiFoAddrPtr
if(sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]==6)//当扩频因子为6时,将使用隐式报头模式(不包括内部数据包的长度)
packet_size=21;
else
packet_size = SPIRead(LR_RegRxNbBytes); //接收的字节数
SPIBurstRead(0x00, RxData, packet_size);
sx1276_7_8_LoRaClearIrq();
for(i=0;i<17;i++)
{
if(RxData[i]!=sx1276_7_8Data[i])
break;
}
if(i>=17) //Rx成功
return(1);
else
return(0); //RX失败
}
else
return(0);
}
/**********************************************************
**名字: sx1276_7_8_LoRaEntryTx
**功能: Entry Tx mode
**输入: None
**输出: 0-超时错误
**********************************************************/
u8 sx1276_7_8_LoRaEntryTx(void)
{
u8 addr,temp;
sx1276_7_8_ConfigTX(); //配置基本参数
SPIWrite(REG_LR_PADAC,0x87); //Tx for 20dBm
SPIWrite(LR_RegHopPeriod,0x00); //RegHopPeriod 无跳频
SPIWrite(REG_LR_DIOMAPPING1,0x41); //DIO0=01, DIO1=00, DIO2=00, DIO3=01
sx1276_7_8_LoRaClearIrq();
SPIWrite(LR_RegIrqFlagsMask,0xF7); //打开TxDone中断
SPIWrite(LR_RegPayloadLength,21); //RegPayloadLength 负载长度21字节
addr = SPIRead(LR_RegFifoTxBaseAddr);//FiFo数据缓冲区中发送调制器的写入基地址
SPIWrite(LR_RegFifoAddrPtr,addr); //Fifo数据缓冲区中SPI接口地址指针
SysTime = 0;
while(1)
{
temp=SPIRead(LR_RegPayloadLength);
if(temp==21)
{
return 1;
break;
}
if(SysTime>=3)
return 0;
}
}
/**********************************************************
**名字: sx1276_7_8_LoRaTxPacket
**功能: Send data in LoRa mode
**输入: None
**输出: 1- Send over
**********************************************************/
u8 sx1276_7_8_LoRaTxPacket(void)
{
u8 TxFlag=0;
//u8 addr;
BurstWrite(0x00, (u8 *)sx1276_7_8Data, 21);
SPIWrite(LR_RegOpMode,0x8b); //Tx Mode
while(1)
{
if(Get_NIRQ) //Packet send over
{
SPIRead(LR_RegIrqFlags);
sx1276_7_8_LoRaClearIrq(); //清除 irq
sx1276_7_8_Standby(); //进入待机模式
return 1;
break;
}
}
}
/**********************************************************
**名字: sx1276_7_8_ReadRSSI
**功能: Read the RSSI value
**输入: none
**输出: temp, RSSI value
**********************************************************/
/*u8 sx1276_7_8_ReadRSSI(void)
{
u8 temp=0xff;
temp=SPIRead(0x11);
temp>>=1;
temp=127-temp;//127:Max RSSI
return temp;
}*/
/*************************************************************************************
**名字: sx1276_7_8_Config
**功能: sx1276_7_8 base config
**输入: mode
**输出: None
*************************************************************************************/
void sx1276_7_8_Config(void)
{
u8 i;
sx1276_7_8_Sleep();//改变当前模式必须进入睡眠模式
for(i=250;i!=0;i--)//延时
;
delay_ms(15);
//扩频模式
sx1276_7_8_EntryLoRa();
//SPIWrite(0x5904);//Change digital regulator form 1.6V to 1.47V: see errata note
BurstWrite(LR_RegFrMsb,sx1276_7_8FreqTbl[Freq_Sel],3);//设置频率
//设置基本参数
SPIWrite(LR_RegPaConfig,sx1276_7_8PowerTbl[Power_Sel]);//设置输出增益
SPIWrite(LR_RegOcp,0x0B); //RegOcp,关闭过流保护
SPIWrite(LR_RegLna,0x23); //RegLNA,使能低噪声放大器
if(sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]==6) //扩频因子=6
{
u8 tmp;
SPIWrite(LR_RegModemConfig1,((sx1276_7_8LoRaBwTbl[BandWide_Sel]<<4)+(CR<<1)+0x01));//隐式报头使能 CRC使能(0x02) & 纠错编码率 4/5(0x01), 4/6(0x02), 4/7(0x03), 4/8(0x04)
SPIWrite(LR_RegModemConfig2,((sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]<<4)+(CRC<<2)+0x03));
tmp = SPIRead(0x31);
tmp &= 0xF8; //1111 1000
tmp |= 0x05; //0000 1001
SPIWrite(0x31,tmp);
SPIWrite(0x37,0x0C);//0000 1100
}
else
{
SPIWrite(LR_RegModemConfig1,((sx1276_7_8LoRaBwTbl[BandWide_Sel]<<4)+(CR<<1)+0x00));//显示报头 CRC使能(0x02) & 纠错编码率 4/5(0x01), 4/6(0x02), 4/7(0x03), 4/8(0x04)
SPIWrite(LR_RegModemConfig2,((sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]<<4)+(CRC<<2)+0x03)); //扩频因子 & LNA gain set by the internal AGC loop
}
SPIWrite(LR_RegSymbTimeoutLsb,0xFF);//RegSymbTimeoutLsb Timeout = 0x3FF(Max)
SPIWrite(LR_RegPreambleMsb,0x00); //RegPreambleMsb
SPIWrite(LR_RegPreambleLsb,12); //RegPreambleLsb 前导码8+4=12字节
SPIWrite(REG_LR_DIOMAPPING2,0x01); //RegDioMapping2 DIO5=00, DIO4=01
//DIO5 clkout DIO4 PLLlock DIO3 Vaildheader
//DIO2 Fhsschang DIO1 Fhsschangechannel
//DIO0 TxDone
sx1276_7_8_Standby(); //进入待机模式
}
//////////////////////////////////////////////////////////////////////////////////////
/*************************************************************************************
**名字: sx1276_7_8_ConfigTX
**功能: sx1276_7_8 base config
**输入: mode
**输出: None
*************************************************************************************/
void sx1276_7_8_ConfigTX(void)
{
u8 i;
sx1276_7_8_Sleep();//改变当前模式必须进入睡眠模式
for(i=250;i!=0;i--)//延时
;
delay_ms(15);
//扩频模式
sx1276_7_8_EntryLoRa();
//SPIWrite(0x5904);//Change digital regulator form 1.6V to 1.47V: see errata note
BurstWrite(LR_RegFrMsb,sx1276_7_8FreqTbl[Freq_Sel],3);//设置频率
//设置基本参数
SPIWrite(LR_RegPaConfig,sx1276_7_8PowerTbl[Power_Sel]);//设置输出增益
SPIWrite(LR_RegOcp,0x0B); //RegOcp,关闭过流保护
SPIWrite(LR_RegLna,0x23); //RegLNA,使能低噪声放大器
if(sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]==6) //扩频因子=6
{
u8 tmp;
SPIWrite(LR_RegModemConfig1,((sx1276_7_8LoRaBwTbl[BandWide_Sel]<<4)+(CR<<1)+0x01));//隐式报头使能 CRC使能(0x02) & 纠错编码率 4/5(0x01), 4/6(0x02), 4/7(0x03), 4/8(0x04)
SPIWrite(LR_RegModemConfig2,((sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]<<4)+(CRC<<2)+0x03));
tmp = SPIRead(0x31);
tmp &= 0xF8; //1111 1000
tmp |= 0x05; //0000 1001
SPIWrite(0x31,tmp);
SPIWrite(0x37,0x0C);//0000 1100
}
else
{
SPIWrite(LR_RegModemConfig1,((sx1276_7_8LoRaBwTbl[BandWide_Sel]<<4)+(CR<<1)+0x00));//显示报头 CRC使能(0x02) & 纠错编码率 4/5(0x01), 4/6(0x02), 4/7(0x03), 4/8(0x04)
SPIWrite(LR_RegModemConfig2,((sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]<<4)+(CRC<<2)+0x03)); //扩频因子 & LNA gain set by the internal AGC loop
}
SPIWrite(LR_RegSymbTimeoutLsb,0xFF);//RegSymbTimeoutLsb Timeout = 0x3FF(Max)
SPIWrite(LR_RegPreambleMsb,0x00); //RegPreambleMsb
SPIWrite(LR_RegPreambleLsb,12); //RegPreambleLsb 前导码8+4=12字节
SPIWrite(REG_LR_DIOMAPPING2,0x01); //RegDioMapping2 DIO5=00, DIO4=01
//DIO5 clkout DIO4 PLLlock DIO3 Vaildheader
//DIO2 Fhsschang DIO1 Fhsschangechannel
//DIO0 TxDone
sx1276_7_8_Standby(); //进入待机模式
}
//////////////////////////////////////////////////////////////////////////////////////
/*************************************************************************************
**名字: sx1276_7_8_ConfigRX
**功能: sx1276_7_8 base config
**输入: mode
**输出: None
*************************************************************************************/
void sx1276_7_8_ConfigRX(void)
{
u8 i;
sx1276_7_8_Sleep();//改变当前模式必须进入睡眠模式
for(i=250;i!=0;i--)//延时
;
delay_ms(15);
//扩频模式
sx1276_7_8_EntryLoRa();
//SPIWrite(0x5904);//Change digital regulator form 1.6V to 1.47V: see errata note
BurstWrite(LR_RegFrMsb,sx1276_7_8FreqTbl[Freq_Sel],3);//设置频率
//设置基本参数
SPIWrite(LR_RegPaConfig,sx1276_7_8PowerTbl[Power_Sel]);//设置输出增益
SPIWrite(LR_RegOcp,0x0B); //RegOcp,关闭过流保护
SPIWrite(LR_RegLna,0x23); //RegLNA,使能低噪声放大器
if(sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]==6) //扩频因子=6
{
u8 tmp;
SPIWrite(LR_RegModemConfig1,((sx1276_7_8LoRaBwTbl[BandWide_Sel]<<4)+(CR<<1)+0x01));//隐式报头使能 CRC使能(0x02) & 纠错编码率 4/5(0x01), 4/6(0x02), 4/7(0x03), 4/8(0x04)
SPIWrite(LR_RegModemConfig2,((sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]<<4)+(CRC<<2)+0x03));
tmp = SPIRead(0x31);
tmp &= 0xF8; //1111 1000
tmp |= 0x05; //0000 1001
SPIWrite(0x31,tmp);
SPIWrite(0x37,0x0C);//0000 1100
}
else
{
SPIWrite(LR_RegModemConfig1,((sx1276_7_8LoRaBwTbl[BandWide_Sel]<<4)+(CR<<1)+0x00));//显示报头 CRC使能(0x02) & 纠错编码率 4/5(0x01), 4/6(0x02), 4/7(0x03), 4/8(0x04)
SPIWrite(LR_RegModemConfig2,((sx1276_7_8SpreadFactorTbl[Lora_Rate_Sel]<<4)+(CRC<<2)+0x03)); //扩频因子 & LNA gain set by the internal AGC loop
}
SPIWrite(LR_RegSymbTimeoutLsb,0xFF);//RegSymbTimeoutLsb Timeout = 0x3FF(Max)
SPIWrite(LR_RegPreambleMsb,0x00); //RegPreambleMsb
SPIWrite(LR_RegPreambleLsb,12); //RegPreambleLsb 前导码8+4=12字节
SPIWrite(REG_LR_DIOMAPPING2,0x00); //RegDioMapping2 DIO5=00, DIO4=01
//DIO5 clkout DIO4 PLLlock DIO3 Vaildheader
//DIO2 Fhsschang DIO1 Fhsschangechannel
//DIO0 RxDone
sx1276_7_8_Standby(); //进入待机模式
}
//////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
u8 xdata RxData[64];
u8 xdata sx1276_7_8Data[] = {"123456789009876543210"};//21个字节
u8 rf_rx_packet_length;
u8 mode;//lora--1/FSK--0
u8 Freq_Sel;
u8 Power_Sel;
u8 Lora_Rate_Sel;
u8 BandWide_Sel;
u8 Fsk_Rate_Sel;
u16 SysTime;
//////////////////////////////////////函数声明//////////////////////////////////////////
void delay_ms(u16 z);
///////////////////////////////////////////////////////////////////////////////////////
main()
{
u8 xdata b[5];
SysTime = 0;
mode = 0x01;//lora mode
Freq_Sel = 0x00;//433M
Power_Sel = 0x00;//20dB
Lora_Rate_Sel = 0x06;//扩频因子为12
BandWide_Sel = 0x07;//125KHZ
Fsk_Rate_Sel = 0x00;//FSK模式下的扩频因子
sx1276_7_8_Config();//设置频率,增益,扩频因子,纠错编码率4/5,前导码12字节
//扩频模式初始化 //关闭过流保护,打开低噪声放大器,打开CRC,显式报头,超时,增益自动校正
//preambleDetect到DIO映射 DIO0 TxDone
while(1)
{
sx1276_7_8_LoRaEntryTx();
sx1276_7_8_LoRaTxPacket();
delay_ms(5000);
sx1276_7_8_LoRaEntryRx();
if(sx1276_7_8_LoRaRxPacket())
{
b[0]=RxData[0];
RxData[0]=0x00;
if(b[0]=="1")
{
b[0]=0x00;
sx1276_7_8_Sleep();
delay_ms(100);
rx_yes;
delay_ms(100);
rx_no;
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////
void delay_ms(u16 z)
{
u16 x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}