164 lines
3.5 KiB
C
164 lines
3.5 KiB
C
/**
|
||
* @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;
|
||
}
|