#include "sx1278.h"
#include "spi.h"
#include "delay.h"
#include "led.h"
void LowReset(void)
{
P2MDOUT = 0x04; //p2.3 0000 1000
XBR1 = 0x40;
SX1278RST = 0;
delayMs(100);
SX1278RST = 1;
delayMs(100);
}
void ManualReset(void)
{
LowReset();
}
void SetCarriFrequency(void) //433m
{
spiWrite(RegFrfMsb,0x6c);
spiWrite(RegFrfMsb,0x80);
spiWrite(RegFrfMsb,0x00);
}
// switch mode in LORA
void Lora_Switch_Mode(uchar mode)
{
spiWrite(RegOpMode,LoraModeMask|mode);
}
// lora rx config
void LORA_Rx_Config(void)
{
//434M the value is 0x6C8000
SetCarriFrequency();
// bandwidth is 125k, ECC=4/6, explicit header mode //带宽125k,编码率4/6,显示报头模式
// (BW)0111 (ECC)010 (implicit)1 = 0x75
spiWrite(RegModemConfig1,0x75);
// SF=12 4096 chips/symbol :1010 //扩频因子12,单包发送,16位crc关闭
// single packet is sent :0
// RXpayloadCRC(header indicate CRC off) :0
// RX time out MSB =0x00; :00
spiWrite(RegModemConfig2,0xC0);
// Lna gain set by register LnaGain
spiWrite(RegModemConfig3,0x00);
// preamble length =12 (register set to 8)
spiWrite(RegPreambleMsb,0x00);
spiWrite(RegPreambleLsb,0x08);
// payload length is 21 bytes
spiWrite(RegPayloadLength,0x08);
// Enable IRQ MASK
spiWrite(RegIrqFlagsMask,0xb7);
spiWrite(RegDioMapping1,0x00); //0000 0000
// Set the base address in FIFO data buffer for RX
spiWrite(RegFifoRxBaseAddr,0x00);
}
/*-------------------------------------------------------------*/
// lora tx config
void LORA_Tx_Config(void)
{
// 434M the value is 0x6C8000
SetCarriFrequency();
// Output Power
spiWrite(RegPaConfig,0x8F);
// set power to 20dbm
spiWrite(RF96RegPaDac,0x87);
// bandwidth is 125k, ECC=4/6, explicit header mode
// (BW)0111 (ECC)010 (implicit)1 = 0x75
spiWrite(RegModemConfig1,0x75);
// SF=12 4096 chips/symbol :1010
// single packet is sent :0
// RXpayloadCRC(header indicate CRC off) :0
// RX time out MSB =0x00; :00
spiWrite(RegModemConfig2,0xC0);
spiWrite(RegModemConfig3,0x00);
// preamble length =12 (register set to 8)
spiWrite(RegPreambleMsb,0x00);
spiWrite(RegPreambleLsb,0x08);
// payload length is 5 bytes
spiWrite(RegPayloadLength,0x08);
// Enable IRQ MASK
spiWrite(RegIrqFlagsMask,0xB7);
spiWrite(RegDioMapping1,0x40); //0100 0000
// Set the base address in FIFO data buffer for TX
spiWrite(RegFifoTxBaseAddr,0x80);
}
/************************* RX init**************************/
void LORA_RxInit(void)
{
ManualReset();
//this->Enter_Lora_mode();
Lora_Switch_Mode(Lora_MODE_SLEEP);
LORA_Rx_Config();
}
/******************** TX init*********************************/
void LORA_TxInit(void)
{
ManualReset();
//this->Enter_Lora_mode();
Lora_Switch_Mode(Lora_MODE_SLEEP); //仅在睡眠模式或者待机模式下可写,此处切换到睡眠模式
LORA_Tx_Config();
}
// transmission of LORA mode
void LORA_SendMessage(uchar *p, uchar len)
{
int i=0;
uchar val;
//Request StandBy mode
Lora_Switch_Mode(Lora_MODE_STDBY); //睡眠模式下无法访问fifo数据,并且自动清空fifo,此处切换到
// spiWrite(RegDioMapping1,0x40);
// wait until the crystal oscillator wake up
delayMs(5);
do {
val=spiRead(RegOpMode);
if (val&Lora_MODE_STDBY)
{
break;
}
} while(1);
//lora_uart.vUartPutString("enter standby mode");
//lora_uart.vUartNewLine();
// write data FIFO
// set the address pointer in FIFO data buffer to TXBaseAddress(0x80)
spiWrite(RegFifoAddrPtr,0x80);
spi_writeFIFO(p,len);
//Request Tx mode
Lora_Switch_Mode(Lora_MODE_TX);
i=0;
do
{
val=spiRead(RegIrqFlags);
if (val&TXDONE)
{
break;
}
i++;
delayMs(100);
if (i>=100)
{
break;
}
} while(1);
//automate change to StandBy mode
do
{
val=spiRead(RegOpMode);
if (val&Lora_MODE_STDBY)
{
//lora_uart.vUartPutString("enter standby mode agian");
//lora_uart.vUartNewLine();
break;
}
} while(1);
// switch to sleep mode
Lora_Switch_Mode(Lora_MODE_SLEEP);
}
uchar LORA_GetMessage(uchar *p,uchar len)
{
int i;
uchar val;
//Request StandBy mode
Lora_Switch_Mode(Lora_MODE_STDBY);
// wait until the crystal oscillator wake up
delayMs(5);
do
{
val=spiRead(RegOpMode);
if (val&Lora_MODE_STDBY)
{
break;
}
} while(1);
// set the address pointer in FIFO data buffer to RXBaseAddress(0x80)
spiWrite(RegFifoAddrPtr,0x00);
//Request SingleRX mode
Lora_Switch_Mode(Lora_MODE_RXCONTINUOUS);
i=0;
do
{
val=spiRead(RegIrqFlags);
if (val&RXDONE)
{
spiWrite(RegIrqFlags,0xff);
break;
}
i++;
delayMs(100);
if (i>=250)
{
break;
}
} while(1);
// automate to standby mode
// read data
// set the address pointer in FIFO data buffer to RXBaseAddress(0x80)
if (i>=250)
{
return 0x00;
}
else
{
spiWrite(RegFifoAddrPtr,0x00);
spi_readFIFO(p,21);
spiWrite(RegIrqFlags,0xff);
return len;
}
}
// the function below is user interface
void Init(void)
{
LORA_Tx_Config();
LORA_Rx_Config();
}
// enter LORA modulation mode
void Enter_Lora_mode(void)
{
ManualReset();
spiWrite(RegOpMode,0x80);
Init();
}
/*************** transmit payload**************************/
void SendMessage(uchar *p, uchar len)
{
LORA_SendMessage(p,len);
}
/************* receiver payload*****************************/
uchar GetMessage(uchar *p,uchar len)
{
return(LORA_GetMessage(p,len));
}
//end file
评论3