164 lines
3.5 KiB
C
Raw Permalink Normal View History

/**
* @file lora.c
* @author Myth
* @version 0.1
* @date 2021.10.15
* @brief LoRa sx1278 Library for STM32 HAL
*/
#include "softspi.h"
#include "SX1278.h"
#include "lora.h"
SX1278_hw_t SX1278_hw;
SX1278_t SX1278;
SoftSPI_TypeDef sx1278_spi;
uint8_t is_in_rx_mode = 0;
uint8_t LoRa_EnterTxMode(uint8_t len);
uint8_t LoRa_EnterRxMode(void);
/**
* @brief LoRa
*/
void LoRa_Init(void)
{
//初始化各个引脚
sx1278_spi.SCLK_GPIO = SX1278_SCLK_GPIO;
sx1278_spi.SCLK_Pin = SX1278_SCLK_PIN;
sx1278_spi.MOSI_GPIO = SX1278_MOSI_GPIO;
sx1278_spi.MOSI_Pin = SX1278_MOSI_PIN;
sx1278_spi.MISO_GPIO = SX1278_MISO_GPIO;
sx1278_spi.MISO_Pin = SX1278_MISO_PIN;
sx1278_spi.SS_GPIO = SX1278_SS_GPIO;
sx1278_spi.SS_Pin = SX1278_SS_PIN;
sx1278_spi.Delay_Time = 5;
SX1278_hw.nss.port = GPIOA;
SX1278_hw.nss.pin = GPIO_PIN_6;
SX1278_hw.reset.port = GPIOA;
SX1278_hw.reset.pin = GPIO_PIN_7;
SX1278_hw.spi = &sx1278_spi;
SX1278.hw = &SX1278_hw;
SoftSPI_Init(&sx1278_spi);
switch ((uint32_t)(SX1278_RESET_GPIO))
{
case (uint32_t)GPIOA:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_Initure.Pin = SX1278_RESET_PIN;
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_Initure);
}
break;
case (uint32_t)GPIOB:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_Initure.Pin = SX1278_RESET_PIN;
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_Initure);
}
break;
case (uint32_t)GPIOC:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_Initure.Pin = SX1278_RESET_PIN;
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_Initure);
}
break;
case (uint32_t)GPIOD:
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_Initure.Pin = SX1278_RESET_PIN;
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_Initure);
}
}
SX1278_init(
&SX1278,
434000000,
SX1278_POWER_17DBM,
SX1278_LORA_SF_7,
SX1278_LORA_BW_125KHZ,
SX1278_LORA_CR_4_5,
SX1278_LORA_CRC_EN,
255);
}
uint8_t LoRa_EnterTxMode(uint8_t len)
{
is_in_rx_mode = 0;
return SX1278_LoRaEntryTx(&SX1278, len, 1000);
}
uint8_t LoRa_EnterRxMode(void)
{
if (is_in_rx_mode)
return 1;
if (SX1278_LoRaEntryRx(&SX1278, 255, 1000))
is_in_rx_mode = 1;
return is_in_rx_mode;
}
/**
* @brief LoRa
* @param pdata
* @param len
* @retval 1 0
*/
uint8_t LoRa_Send(uint8_t *pdata, uint8_t len)
{
if (LoRa_EnterTxMode(len) == 0)
return 0;
SX1278_LoRaTxPacket(&SX1278, pdata, len, 1000); //超时时间无意义,此函数立即返回
return 1;
}
/**
* @brief LoRa
* @param pdata
* @retval 0
*/
uint8_t LoRa_Receive(uint8_t *pdata)
{
if (LoRa_EnterRxMode() == 0)
return 0;
uint8_t len = SX1278_LoRaRxPacket(&SX1278);
if (len == 0)
return 0;
SX1278_read(&SX1278, pdata, len);
return len;
}