SX1278編譯

/******CSDN下載例程重新編譯一警告L406************/
/******2019 4 27 08:23 CODE1371******************/
#include <reg52.h>
#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<length;i++)
    ptr[i] = SPIRead8bit();
    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<length;i++)
    SPICmd8bit(ptr[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--);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章