746 lines
20 KiB
C
746 lines
20 KiB
C
/**
|
||
******************************************************************************
|
||
* 文件名 : SX127X_Driver.c
|
||
* 作者 : LSD RF Team
|
||
* 版本 : V1.0.0
|
||
* 时间 : 15-Aug-2018
|
||
* 文件描述:
|
||
* 该文件为SX127X模块的驱动层,包含对SX127X模块的工作模式控制,FIFO操作,发
|
||
*射功率、频率等设置,以及一些数据处理的公共函数
|
||
* 客户在使用SX127X模块时候需要移植该文件,如果SX127X_HAL.c中各个函数功能都已
|
||
*实现且函数名等都没有改动,那本文件可以不用做更改直接使用,客户在应用层直接调
|
||
*用本文件函数就可以实现各种操作。
|
||
*******************************************************************************/
|
||
|
||
#include "SX127X_Driver.h"
|
||
#include "stm32l4xx_hal.h"
|
||
/*
|
||
注意,本文件的函数实现了从RF的驱动与MCU的兼容
|
||
|
||
*/
|
||
|
||
|
||
extern SPI_HandleTypeDef SPI2_InitStruct;
|
||
float G_BandWidthKHz = 500.0;//本地计算Symbol周期使用
|
||
float G_TsXms = 1.024;//1.024ms
|
||
|
||
/**
|
||
* @简介:SX127X 配置参数
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
S_LoRaConfig G_LoRaConfig = {
|
||
470000000,
|
||
BW500KHZ,
|
||
SF08,
|
||
CR_4_5,
|
||
15,
|
||
true,
|
||
true,
|
||
true,
|
||
64,
|
||
};
|
||
S_LoRaPara G_LoRaPara;
|
||
|
||
//-------------------------SX127X 寄存器------------------------//
|
||
//该部分函数为MCU对SX127X模块寄存器进行读写及FIFO的读写
|
||
//--------------------------------------------------------------//
|
||
/**
|
||
* @简介:RF 向寄存器地址写1字节数据
|
||
* @参数:uint8_t addr,寄存器地址 uint8_t data数据
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_Write( uint8_t addr, uint8_t data )
|
||
{
|
||
SX127X_WriteBuffer( addr, &data, 1 );
|
||
}
|
||
/**
|
||
* @简介:RF 向寄存器地址读1字节数据
|
||
* @参数:uint8_t addr,寄存器地址 uint8_t *data读数据存储地址
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_Read( uint8_t addr, uint8_t *data )
|
||
{
|
||
SX127X_ReadBuffer( addr, data, 1 );
|
||
}
|
||
/**
|
||
* @简介:SX127X 向FIFO写数据
|
||
* @参数:uint8_t *buffer,数组指针 uint8_t size长度
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_WriteFifo( uint8_t *buffer, uint8_t size )
|
||
{
|
||
SX127X_WriteBuffer( 0, buffer, size );
|
||
}
|
||
/**
|
||
* @简介:SX127X 向FIFO读数据
|
||
* @参数:uint8_t *buffer,数组指针 uint8_t size长度
|
||
* @返回值:uint8_t *buffer 存储读取内容
|
||
*/
|
||
void SX127X_ReadFifo( uint8_t *buffer, uint8_t size )
|
||
{
|
||
SX127X_ReadBuffer( 0, buffer, size );
|
||
}
|
||
|
||
//-------------------------SX127X 基本设置-----------------------//
|
||
//该部分函数为对SX127X模块复位、发射功率、发射频率等参数设置,以
|
||
//及SX127X工作模式设置、数据包读写等
|
||
//--------------------------------------------------------------//
|
||
|
||
/**
|
||
* @简介:SX127X 复位设置
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_Reset(void)
|
||
{
|
||
SX127X_RESET_OUTPUT(GPIO_PIN_RESET);
|
||
osDelay(2);
|
||
SX127X_RESET_OUTPUT(GPIO_PIN_SET);
|
||
osDelay(15);
|
||
}
|
||
/**
|
||
* @简介:SX127X IO初始化及配置
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_InitIo(void)
|
||
{
|
||
SX127X_DIO0_INPUT();
|
||
SX127X_DIO1_INPUT();
|
||
SX127X_DIO2_INPUT();
|
||
SX127X_SPIGPIO_Init();
|
||
SX127X_RESET_OUTPUT(GPIO_PIN_SET);
|
||
//以下两句是LSD4RF-2F717N10以及LSD4RF-2F717N01需要用到。
|
||
SX127X_TXE_OUTPUT(GPIO_PIN_RESET);
|
||
SX127X_RXE_OUTPUT(GPIO_PIN_RESET);
|
||
}
|
||
/**
|
||
* @简介:SX127X TX/RX的PA切换
|
||
* @参数:bool txEnable 切换逻辑;真:作为TX。假:作为RX 为硬件两个PA控制IO口
|
||
* @返回值:无
|
||
*/
|
||
void SX127XWriteRxTx( bool txEnable )
|
||
{
|
||
if( txEnable != 0 ) //如果为真,为TX
|
||
{
|
||
SX127X_RXE_OUTPUT(GPIO_PIN_RESET);
|
||
SX127X_TXE_OUTPUT(GPIO_PIN_SET);
|
||
}
|
||
else //为假,为RX
|
||
{
|
||
SX127X_RXE_OUTPUT(GPIO_PIN_SET);
|
||
SX127X_TXE_OUTPUT(GPIO_PIN_RESET);
|
||
}
|
||
}
|
||
/**
|
||
* @简介:DIO0中断开启使能
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void DIO0_EnableInterrupt(void)
|
||
{
|
||
SX127X_DIO0_INTENABLE();
|
||
}
|
||
/**
|
||
* @简介:DIO0中断关闭使能
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void DIO0_DisableInterrupt(void)
|
||
{
|
||
SX127X_DIO0_INTDISABLE();
|
||
}
|
||
/**
|
||
* @简介:DIO0引脚状态获取
|
||
* @参数:无
|
||
* @返回值:State表示DIO0获取的电平,高电平"1",低电平"0"
|
||
*/
|
||
GPIO_PinState DIO0_GetState(void)
|
||
{
|
||
GPIO_PinState State;
|
||
State = SX127X_DIO0_GetState();
|
||
return State;
|
||
}
|
||
/**
|
||
* @简介:SX127X 配置频率检查判断
|
||
* @参数:无
|
||
* @返回值:true or false
|
||
*/
|
||
bool LoRaConfig_Check(void)
|
||
{
|
||
if((G_LoRaConfig.LoRa_Freq < 401000000) || (G_LoRaConfig.LoRa_Freq > 930000000))
|
||
return false;
|
||
G_LoRaConfig.BandWidth = (t_BandWidth)(G_LoRaConfig.BandWidth & 0xF0);
|
||
if(G_LoRaConfig.BandWidth > BW500KHZ)
|
||
return false;
|
||
//计算BandWidth
|
||
switch(G_LoRaConfig.BandWidth) {
|
||
case BW500KHZ:
|
||
G_BandWidthKHz = 500.0;
|
||
break;
|
||
case BW250KHZ:
|
||
G_BandWidthKHz = 250.0;
|
||
break;
|
||
case BW125KHZ:
|
||
G_BandWidthKHz = 125.0;
|
||
break;
|
||
case BW62_50KHZ:
|
||
G_BandWidthKHz = 62.5;
|
||
break;
|
||
case BW41_66KHZ:
|
||
G_BandWidthKHz = 41.66;
|
||
break;
|
||
case BW31_25KHZ:
|
||
G_BandWidthKHz = 31.25;
|
||
break;
|
||
case BW20_83KHZ:
|
||
G_BandWidthKHz = 20.83;
|
||
break;
|
||
case BW15_62KHZ:
|
||
G_BandWidthKHz = 15.62;
|
||
break;
|
||
case BW10_41KHZ:
|
||
G_BandWidthKHz = 10.41;
|
||
break;
|
||
case BW7_81KHZ:
|
||
G_BandWidthKHz = 7.81;
|
||
break;
|
||
}
|
||
G_LoRaConfig.SpreadingFactor = (t_SpreadingFactor)(G_LoRaConfig.SpreadingFactor & 0xF0);
|
||
if((G_LoRaConfig.SpreadingFactor > SF12) || (G_LoRaConfig.SpreadingFactor < SF06))
|
||
return false;
|
||
//计算LoRa码元周期,单位ms
|
||
G_TsXms = (2 << ((G_LoRaConfig.SpreadingFactor >> 4) - 1)) / G_BandWidthKHz;
|
||
|
||
G_LoRaConfig.CodingRate = (t_CodingRate)(G_LoRaConfig.CodingRate & 0x0E);
|
||
if((G_LoRaConfig.CodingRate > CR_4_8) || (G_LoRaConfig.CodingRate < CR_4_5))
|
||
return false;
|
||
if(G_LoRaConfig.PowerCfig > 15)
|
||
return false;
|
||
if(G_LoRaConfig.PayloadLength > 127)
|
||
return false;
|
||
return true;
|
||
}
|
||
/**
|
||
* @简介:SX127X初始化
|
||
* @参数:无
|
||
* @返回值:tSX127xError 错误枚举内容
|
||
*/
|
||
tSX127xError SX127X_Lora_init(uint32_t freq)
|
||
{
|
||
if(false == LoRaConfig_Check()) //如果输入参数错误
|
||
{
|
||
return PARAMETER_INVALID;
|
||
}
|
||
SX127X_InitIo();
|
||
SX127X_Reset();
|
||
SX127X_SPI_Init();
|
||
|
||
SX127X_Write( REG_LR_OPMODE, RFLR_OPMODE_SLEEP );
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_SLEEP );
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
|
||
//SPI 验证
|
||
uint8_t test = 0;
|
||
SX127X_Write( REG_LR_HOPPERIOD, 0x91 ); //选一个用不到的寄存器来做验证
|
||
SX127X_Read( REG_LR_HOPPERIOD, &test);
|
||
if(test != 0x91)
|
||
return SPI_READCHECK_WRONG;
|
||
SX127X_Write( REG_LR_DIOMAPPING2, RFLR_DIOMAPPING2_DIO4_01);
|
||
SX127X_Write(REG_LR_LNA, 0x20);
|
||
SX127X_FreqSet(freq);
|
||
SX127X_PoutSet();
|
||
SX127X_Write( REG_LR_PARAMP, RFLR_PARAMP_1000_US);
|
||
// ↑PA Ramp的时间,如果用户LDO不能快速输出大电流(泵能力),适当增加PA Ramp时间
|
||
// ↑如果Ramp时间过短超过了LDO的能力时,会出现进入TX后,系统电流为发射电流,但是RF信号不出现的现象
|
||
SX127X_Write( REG_LR_OCP, 0x20 | RFLR_OCP_TRIM_240_MA); //电流过载保护 Over Current Protection
|
||
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);
|
||
//注意,无头模式(Implicit Header)时,必须提前规定好收发双方的PL
|
||
|
||
//BW、CR、Header有无,初始化
|
||
SX127X_Write( REG_LR_MODEMCONFIG1, \
|
||
(((uint8_t)G_LoRaConfig.BandWidth) | ((uint8_t)G_LoRaConfig.CodingRate)) | (\
|
||
(true == G_LoRaConfig.ExplicitHeaderOn) ? 0x00 : 0x01));
|
||
|
||
//SF、CRC初始化
|
||
SX127X_Write( REG_LR_MODEMCONFIG2, \
|
||
((uint8_t)G_LoRaConfig.SpreadingFactor) | (\
|
||
(true == G_LoRaConfig.CRCON) ? 0x04 : 0x00));
|
||
if(SF06 == G_LoRaConfig.SpreadingFactor) { //慎用SF = 6,需要的配置很特殊
|
||
uint8_t temp = 0;
|
||
SX127X_Read( 0x31, &temp);
|
||
SX127X_Write( 0x31, (temp & 0xF8) | 0x05);
|
||
SX127X_Write( 0x37, 0x0C);
|
||
}
|
||
|
||
//BW为500KHz时进行灵敏度的一个优化
|
||
if(G_LoRaConfig.BandWidth==BW500KHZ)
|
||
{
|
||
if(G_LoRaConfig.LoRa_Freq <=525000000)
|
||
{
|
||
SX127X_Write(REG_LR_HighWOptimize1, 0x02);
|
||
SX127X_Write(REG_LR_HighWOptimize2, 0x7F);
|
||
}
|
||
else if(G_LoRaConfig.LoRa_Freq >=862000000)
|
||
{
|
||
SX127X_Write(REG_LR_HighWOptimize1, 0x02);
|
||
SX127X_Write(REG_LR_HighWOptimize2, 0x64);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
SX127X_Write(REG_LR_HighWOptimize1, 0x03);
|
||
SX127X_Write(REG_LR_HighWOptimize2, 0x65);
|
||
}
|
||
|
||
//LORa信号虚假接收处理(errata),削弱出现偏移(比如偏移1MHz、2MHz...)这种情况下还能相互通信问题
|
||
if(G_LoRaConfig.BandWidth==BW500KHZ)
|
||
{
|
||
uint8_t temp = 0;
|
||
SX127X_Read( 0x31, &temp);
|
||
SX127X_Write( 0x31, (temp |0x80)); //第7位设置为0
|
||
}
|
||
else
|
||
{
|
||
uint8_t temp1 = 0;
|
||
SX127X_Read( 0x31, &temp1);
|
||
SX127X_Write(0x31, (temp1 &0x7F));//第7位设置为0
|
||
SX127X_Write(0x2f, 0x40);
|
||
SX127X_Write(0x30, 0x00);
|
||
}
|
||
|
||
|
||
//低速率优化功能是否开启、AutoAGC默认开启
|
||
// SX127X_Write( REG_LR_MODEMCONFIG3, ((G_TsXms > 16.0f) ? \
|
||
// RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON : RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF\
|
||
// ) | RFLR_MODEMCONFIG3_AGCAUTO_ON);
|
||
SX127X_Write( REG_LR_MODEMCONFIG3,0X0C);
|
||
return NORMAL;
|
||
|
||
}
|
||
/**
|
||
* @简介:RF发送数据包
|
||
* @参数:uint8_t*data:发送数据指针
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_TxPacket(uint8_t*data,uint8_t len)
|
||
{
|
||
SX127X_FreqSet(498000000);
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
SX127X_Write( REG_LR_PREAMBLEMSB, 0);
|
||
SX127X_Write( REG_LR_PREAMBLELSB, 10);
|
||
SX127X_Write( REG_LR_PAYLOADLENGTH, len);
|
||
|
||
SX127XWriteRxTx(true);//LSD4RF-2F717N10以及LSD4RF-2F717N01时需要用到,高频切换;
|
||
|
||
SX127X_Write( REG_LR_FIFOADDRPTR, 0x80);
|
||
SX127X_WriteBuffer(REG_LR_FIFO, data, len);
|
||
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
|
||
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE));
|
||
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 );
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_TRANSMITTER );
|
||
}
|
||
/**
|
||
* @简介:RF进入接收状态
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_StartRx(void)
|
||
{
|
||
SX127X_FreqSet(499000000);
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
SX127X_Write( REG_LR_PREAMBLEMSB, 0);
|
||
SX127X_Write( REG_LR_PREAMBLELSB, 10);
|
||
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);
|
||
|
||
SX127XWriteRxTx(false);//LSD4RF-2F717N10以及LSD4RF-2F717N01时需要用到,高频切换;
|
||
|
||
SX127X_Write( REG_LR_FIFOADDRPTR, 0x00);
|
||
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
|
||
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE));
|
||
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_00 );
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_RECEIVER );
|
||
}
|
||
/**
|
||
* @简介:RF接收数据包
|
||
* @参数:uint8_t*cbuf接收数组指针
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_RxPacket(uint8_t*cbuf)
|
||
{
|
||
unsigned char Reg_PKTRSSI, Reg_PKTSNR;
|
||
SX127X_Read( REG_LR_PKTSNRVALUE, &Reg_PKTSNR);
|
||
|
||
if((Reg_PKTSNR & 0x80) != 0) {
|
||
Reg_PKTSNR = ((~Reg_PKTSNR + 1) & 0xff) >> 2;
|
||
//SNR前显示加“-”
|
||
G_LoRaPara.Packet_SNR = -Reg_PKTSNR;
|
||
}
|
||
else
|
||
{
|
||
Reg_PKTSNR = (Reg_PKTSNR & 0xff) >> 2;
|
||
G_LoRaPara.Packet_SNR = Reg_PKTSNR;
|
||
}
|
||
|
||
SX127X_Read( REG_LR_PKTRSSIVALUE, &Reg_PKTRSSI);
|
||
|
||
if(G_LoRaPara.Packet_SNR < 0)
|
||
{
|
||
G_LoRaPara.Packet_RSSI = -164 + Reg_PKTRSSI - G_LoRaPara.Packet_SNR;
|
||
}
|
||
else
|
||
{
|
||
G_LoRaPara.Packet_RSSI = -164 + Reg_PKTRSSI * 16 / 15;
|
||
}
|
||
|
||
if(true == G_LoRaConfig.ExplicitHeaderOn) {
|
||
//有头那么从寄存器中读,否则按照G_LoRaConfig设置长度读取FIFO
|
||
SX127X_Read(REG_LR_NBRXBYTES, &G_LoRaConfig.PayloadLength);
|
||
SX127X_Write( REG_LR_FIFOADDRPTR, 0x00);
|
||
}
|
||
SX127X_ReadFifo(cbuf, G_LoRaConfig.PayloadLength);
|
||
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
|
||
}
|
||
/**
|
||
* @简介:获取当前信道中的RSSI值
|
||
* @参数:无
|
||
* @返回值:RSSI值
|
||
*/
|
||
int16_t SX127X_Current_RSSI(void)
|
||
{
|
||
unsigned char Reg_RSSIValue;
|
||
///int16_t temp;
|
||
SX127X_Read( REG_LR_RSSIVALUE, &Reg_RSSIValue);
|
||
G_LoRaPara.Current_RSSI = -164 + Reg_RSSIValue;
|
||
return G_LoRaPara.Current_RSSI;
|
||
}
|
||
/**
|
||
* @简介:SX127X进入LORA睡眠模式
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_SleepMode(void)
|
||
{
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_SLEEP );
|
||
}
|
||
/**
|
||
* @简介:SX127X进入LORA的STANDBY状态
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_StandbyMode(void)
|
||
{
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
}
|
||
/**
|
||
* @简介:SX127X配置频率
|
||
* @参数:无
|
||
* @返回值:tSX127xError 错误枚举内容
|
||
*/
|
||
tSX127xError SX127X_FreqSet(uint32_t freq)
|
||
{
|
||
|
||
if((freq > 930000000) || (freq < 401000000))
|
||
return PARAMETER_INVALID;
|
||
uint32_t freq_reg = (uint32_t)(freq / FREQ_STEP);
|
||
uint8_t test_FRFMSB = 0, test_FRFMID = 0, test_FRFLSB = 0;
|
||
SX127X_StandbyMode();
|
||
SX127X_Write( REG_LR_FRFMSB, (uint8_t)(freq_reg >> 16));
|
||
SX127X_Write( REG_LR_FRFMID, (uint8_t)(freq_reg >> 8) );
|
||
SX127X_Write( REG_LR_FRFLSB, (uint8_t)(freq_reg) );
|
||
|
||
SX127X_Read(REG_LR_FRFMSB, &test_FRFMSB);
|
||
SX127X_Read(REG_LR_FRFMID, &test_FRFMID);
|
||
SX127X_Read(REG_LR_FRFLSB, &test_FRFLSB);
|
||
|
||
if(test_FRFMSB != (uint8_t)(freq_reg >> 16))
|
||
return SPI_READCHECK_WRONG;
|
||
if(test_FRFMID != (uint8_t)(freq_reg >> 8))
|
||
return SPI_READCHECK_WRONG;
|
||
if(test_FRFLSB != (uint8_t)(freq_reg))
|
||
return SPI_READCHECK_WRONG;
|
||
return NORMAL;
|
||
}
|
||
/**
|
||
* @简介:SX127X配置功率
|
||
* @参数:无
|
||
* @返回值:tSX127xError 错误枚举内容
|
||
*/
|
||
tSX127xError SX127X_PoutSet(void)
|
||
{
|
||
if(G_LoRaConfig.PowerCfig > 15)
|
||
return PARAMETER_INVALID;
|
||
SX127X_StandbyMode();
|
||
SX127X_Write( REG_LR_PACONFIG, 0xf0 | G_LoRaConfig.PowerCfig);
|
||
uint8_t test = 0;
|
||
SX127X_Read(REG_LR_PACONFIG, &test);
|
||
if((0xf0 | G_LoRaConfig.PowerCfig) != test)
|
||
return SPI_READCHECK_WRONG;
|
||
if(true == G_LoRaConfig.MaxPowerOn)
|
||
SX127X_Write( REG_LR_PADAC, 0x80 | RFLR_PADAC_20DBM_ON );
|
||
else
|
||
SX127X_Write( REG_LR_PADAC, 0x80 | RFLR_PADAC_20DBM_OFF );
|
||
return NORMAL;
|
||
}
|
||
|
||
/**
|
||
* @简介:SX127X CAD初始化
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_CADinit(void)
|
||
{
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
SX127X_Write( REG_LR_PREAMBLEMSB, 0xf0);
|
||
SX127X_Write( REG_LR_PREAMBLELSB, 0xff);
|
||
SX127X_Write( REG_LR_IRQFLAGSMASK, \
|
||
~(RFLR_IRQFLAGS_CADDONE | RFLR_IRQFLAGS_CADDETECTED));
|
||
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_10);
|
||
SX127XWriteRxTx(false); //set RF switch to RX path
|
||
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
|
||
}
|
||
/**
|
||
* @简介:SX127X 启动CAD,采样信道情况一次 采样时间约为(2^SF+32)/BW
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_CAD_Sample(void)
|
||
{
|
||
SX127XWriteRxTx(false); //set RF switch to RX path
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_CAD );
|
||
}
|
||
/**
|
||
* @简介:WOR初始化
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_WORInit(void)
|
||
{
|
||
SX127X_CADinit(); //CAD功能初始化
|
||
}
|
||
/**
|
||
* @简介:执行WOR操作
|
||
* @参数:uint8_t cclen 0:进入睡眠。1:进入CAD检测模式
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_WOR_Execute(uint8_t cclen)
|
||
{
|
||
switch(cclen)
|
||
{
|
||
case 0: //启动睡眠
|
||
{
|
||
SX127X_Write(REG_LR_IRQFLAGS, 0xff); //clear flags
|
||
SX127X_SleepMode(); //进入睡眠模式
|
||
}
|
||
break;
|
||
case 1: //进入CAD检测模式
|
||
{
|
||
SX127X_CAD_Sample(); //启动CAD一次
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
/**
|
||
* @简介:WOR到RX
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_WOR_Exit(void)
|
||
{
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
SX127X_Write( REG_LR_PREAMBLEMSB, 0xf0);
|
||
SX127X_Write( REG_LR_PREAMBLELSB, 0xff);
|
||
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);
|
||
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE));
|
||
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_00 );
|
||
SX127XWriteRxTx(false);
|
||
SX127X_Write( REG_LR_FIFOADDRPTR, 0x00);
|
||
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_RECEIVER );
|
||
}
|
||
|
||
|
||
/**
|
||
* @简介:SX127X发送唤醒包
|
||
* @参数:uint8_t*data:发送数据指针,前导长度
|
||
* @返回值:无
|
||
*/
|
||
void SX127X_Awake(uint8_t*cbuf, uint16_t Preamble_Length)
|
||
{
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_STANDBY );
|
||
SX127X_Write( REG_LR_PAYLOADLENGTH, G_LoRaConfig.PayloadLength);
|
||
SX127XWriteRxTx(true);
|
||
SX127X_Write( REG_LR_FIFOADDRPTR, 0x80);
|
||
SX127X_WriteBuffer(REG_LR_FIFO, cbuf, G_LoRaConfig.PayloadLength);
|
||
SX127X_Write(REG_LR_IRQFLAGS, 0xff);
|
||
SX127X_Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE));
|
||
SX127X_Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 );
|
||
SX127X_Write( REG_LR_PREAMBLEMSB, (uint8_t)(Preamble_Length >> 8)); //set preamble length
|
||
SX127X_Write( REG_LR_PREAMBLELSB, (uint8_t)Preamble_Length); //set preamble length
|
||
SX127X_Write( REG_LR_OPMODE, 0x80 | RFLR_OPMODE_TRANSMITTER );
|
||
|
||
}
|
||
|
||
|
||
/***********************************************FSK********************************************************************/
|
||
|
||
/**
|
||
* @简介:SX127X FSK初始化
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
unsigned char SX127x_Fsk_init(void)
|
||
{
|
||
SX127X_InitIo(); // PAIO口初始化
|
||
SX127X_Reset(); //复位RF
|
||
SX127X_SPI_Init(); //SPI初始化
|
||
|
||
LSD_RF_SleepMode_FSK();
|
||
LSD_RF_StandbyMode_FSK();
|
||
LSD_RF_Config();
|
||
// to test SPI
|
||
uint8_t test = 0;
|
||
SX127X_Write(REG_FSK_SYNCVALUE8, 0x55);
|
||
SX127X_Read(REG_FSK_SYNCVALUE8, &test);
|
||
if(test != 0x55)
|
||
{
|
||
return SPI_READCHECK_WRONG;// something wrong with SPI
|
||
}
|
||
SX127X_Write(REG_FSK_SYNCVALUE8, 0xD3);
|
||
SX127X_Read(REG_FSK_SYNCVALUE8, &test);
|
||
if(test != 0xD3)
|
||
{
|
||
return SPI_READCHECK_WRONG;// something wrong with SPI
|
||
}
|
||
return NORMAL;
|
||
|
||
}
|
||
|
||
/**
|
||
* @简介:SX127X 写FSK配置表
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void LSD_RF_Config(void)
|
||
{
|
||
_SX12XX_REG const *p;
|
||
unsigned char i;
|
||
p = LSD_RFregConfig;
|
||
for(i = sizeof(LSD_RFregConfig) / 2; i > 0; i--)
|
||
{
|
||
SX127X_Write(p->addr, p->val);
|
||
p++;
|
||
}
|
||
}
|
||
/**
|
||
* @简介:SX127X 进入FSK的standby模式
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void LSD_RF_StandbyMode_FSK(void)
|
||
{
|
||
unsigned char cData;
|
||
unsigned int nTimes = 65535;
|
||
SX127X_Write(REG_FSK_OPMODE, 0x08 | RFFSK_OPMODE_STANDBY );
|
||
do
|
||
{
|
||
SX127X_Read(REG_FSK_OPMODE, &cData);
|
||
nTimes--;
|
||
}
|
||
while(((cData & 0x07) != RFFSK_OPMODE_STANDBY) && nTimes);
|
||
}
|
||
/**
|
||
* @简介:SX127X 进入FSK的Sleep模式
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void LSD_RF_SleepMode_FSK(void)
|
||
{
|
||
unsigned char cData;
|
||
unsigned int nTimes = 65535;
|
||
SX127X_Write(REG_FSK_OPMODE, 0x08 | RFFSK_OPMODE_SLEEP );
|
||
do
|
||
{
|
||
SX127X_Read(REG_FSK_OPMODE, &cData);
|
||
nTimes--;
|
||
}
|
||
while(((cData & 0x07) != RFFSK_OPMODE_SLEEP) && nTimes);
|
||
}
|
||
/**
|
||
* @简介:SX127X FSK模式下晴FIFO
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void LSD_RF_ClearFIFO(void)
|
||
{
|
||
SX127X_Write(REG_FSK_IRQFLAGS2, 0x10);
|
||
}
|
||
/**
|
||
* @简介:SX127X FSK发送数据包
|
||
* @参数:txBuffer发送数据存储数据的首地址,size数据包长度
|
||
* @返回值:无
|
||
*/
|
||
void LSD_RF_SendPacket_FSK(uint8_t *txBuffer, uint8_t size)
|
||
{
|
||
LSD_RF_StandbyMode_FSK();
|
||
SX127X_Write(REG_FSK_DIOMAPPING1, RFFSK_DIOMAPPING1_DIO0_00);
|
||
SX127XWriteRxTx(true);
|
||
LSD_RF_ClearFIFO();
|
||
SX127X_Write(REG_FSK_FIFO, size);
|
||
for(unsigned int i = 0; i < size; i++)
|
||
{
|
||
SX127X_Write(REG_FSK_FIFO, txBuffer[i]);
|
||
}
|
||
SX127X_Write(REG_FSK_OPMODE, 0x08 | RFFSK_OPMODE_TRANSMITTER );
|
||
}
|
||
/**
|
||
* @简介:SX127X 进入FSK的RX模式
|
||
* @参数:无
|
||
* @返回值:无
|
||
*/
|
||
void LSD_RF_RXmode_FSK(void)
|
||
{
|
||
LSD_RF_StandbyMode_FSK();
|
||
SX127X_Write(REG_FSK_DIOMAPPING1, RFFSK_DIOMAPPING1_DIO0_00);
|
||
LSD_RF_ClearFIFO();
|
||
SX127XWriteRxTx(false);
|
||
SX127X_Write(REG_FSK_OPMODE, 0x08 | RFFSK_OPMODE_RECEIVER);
|
||
}
|
||
|
||
/**
|
||
* @简介:SX127X FSK读取数据包
|
||
* @参数:cRxBuf发送数据存储数据的首地址,c数据包长度
|
||
* @返回值:无
|
||
*/
|
||
void LSD_RF_RxPacket_FSK(uint8_t *cRxBuf, uint8_t *cLength)
|
||
{
|
||
uint8_t i;
|
||
uint8_t test = 0;
|
||
LSD_RF_StandbyMode_FSK();
|
||
SX127X_Read(REG_FSK_FIFO, &test);
|
||
*cLength = test;
|
||
for(i = 0; i < *cLength; i++)
|
||
SX127X_Read(REG_FSK_FIFO, &cRxBuf[i]);
|
||
LSD_RF_ClearFIFO();
|
||
|
||
}
|
||
|
||
/***********************************************FSK End********************************************************************/
|
||
|
||
void Lora_spi_di_deinit(void)
|
||
{
|
||
// __HAL_RCC_SPI2_FORCE_RESET();
|
||
// __HAL_RCC_SPI2_RELEASE_RESET();
|
||
// HAL_GPIO_DeInit(GPIOB, (GPIO_PIN_13 | GPIO_PIN_14| GPIO_PIN_15));
|
||
// HAL_SPI_DeInit(&SPI2_InitStruct);
|
||
//SX127X_NSS_OUTPUT(GPIO_PIN_RESET);
|
||
HAL_SPI_DeInit(&SPI2_InitStruct);
|
||
__HAL_RCC_SPI2_CLK_DISABLE();
|
||
}
|
||
|