STM32_WGY/User/SX127X_Hal.c

326 lines
9.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* 文件名 SX127X_HAL.c
* 作者 LSD RF Team
* 版本 V1.0.0
* 时间 15-Aug-2018
* 文件描述:
* 该文件为SX127X模块的硬件层包含MCU与SX127X模块的SPI配置GPIO口初始化
*及用于SX127X寄存器、FIFO读写操作
* 客户在使用模块时候需要移植该文件,保证各个函数名、函数形参不变的情况下
*根据自己的MCU平台修改函数内容使各个功能块正常运行。硬件层占用资源如下
*
*SPI本例程使用STM32L4的SPI3进行与SX127X模块通信。
*GPIO口本例程使用的GPIO口详情如下
* PB1 ---> DIO0
* PC4 ---> DIO1
* PB2 ---> DIO2
* PB0 ---> TXE
* PC5 ---> RXE
* PA7 ---> RST
* PA15 ---> NSS
* PC12 ---> M0SI
* PC11 ---> MISO
* PC10 ---> SCK
* Configure GPIO pins : PB12 PB13 PB14 PB15
PA7 DIO0
PA6 DIO1
PB0 DIO3
PB2 RST
PB12 NSS
PB13 CLK
PB14 MISO
PB15 MOSI
*/
/*******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include "SX127X_Hal.h"
#include "stm32l4xx_hal.h"
SPI_HandleTypeDef SPI2_InitStruct;
//-----------------------------GPIO-----------------------------//
//该部分函数为系统用到的GPIO的初始化函数用户根据自己的平台相应修改
//--------------------------------------------------------------//
/**
* @简介该函数为DIO0输入初始化及中断、优先级配置
* @参数:无
* @返回值:无
*/
//A7
void SX127X_DIO0_INPUT()
{
GPIO_InitTypeDef GPIO_InitStruct;
__GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
}
/**
* @简介该函数为DIO0输入中断开启使能
* @参数:无
* @返回值:无
*/
void SX127X_DIO0_INTENABLE()
{
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
/**
* @简介该函数为DIO0输入中断关闭使能
* @参数:无
* @返回值:无
*/
void SX127X_DIO0_INTDISABLE()
{
// HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
}
/**
* @简介该函数为DIO0输入状态获取
* @参数:无
* @返回值DIO0状态"1"or"0"
*/
GPIO_PinState SX127X_DIO0_GetState()
{
GPIO_PinState State;
State = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7);
return State;
}
/**
* @简介该函数为DIO1输入初始化及中断、优先级配置
* @参数:无
* @返回值:无
*/
//A6
void SX127X_DIO1_INPUT()
{
GPIO_InitTypeDef GPIO_InitStruct;
__GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
}
/**
* @简介该函数为DIO2输入初始化及中断、优先级配置
* @参数:无
* @返回值:无
*/
//NULL
void SX127X_DIO2_INPUT()
{
// GPIO_InitTypeDef GPIO_InitStruct;
// __GPIOB_CLK_ENABLE();
// GPIO_InitStruct.Pin = GPIO_PIN_2;
// GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
// GPIO_InitStruct.Pull = GPIO_PULLDOWN;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
}
/**
* @简介该函数为高频开关TXE输出控制
* @参数PinState为"1"表示输出高电平,"0"输出低电平;
* @返回值:无
*/
void SX127X_TXE_OUTPUT(GPIO_PinState PinState)
{
// GPIO_InitTypeDef GPIO_InitStruct;
// __HAL_RCC_GPIOB_CLK_ENABLE();
// GPIO_InitStruct.Pin = GPIO_PIN_0;
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, PinState);
}
/**
* @简介该函数为高频开关RXE输出控制
* @参数PinState为"1"表示输出高电平,"0"输出低电平;
* @返回值:无
*/
void SX127X_RXE_OUTPUT(GPIO_PinState PinState)
{
// GPIO_InitTypeDef GPIO_InitStruct;
// __HAL_RCC_GPIOC_CLK_ENABLE();
// GPIO_InitStruct.Pin = GPIO_PIN_5;
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
// HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, PinState);
}
/**
* @简介该函数为SPI的片选引脚NSS输出控制
* @参数PinState为"1"表示输出高电平,"0"输出低电平;
* @返回值:无
*/
void SX127X_NSS_OUTPUT(GPIO_PinState PinState)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, PinState);
}
/**
* @简介该函数为SX127X复位引脚NRST输出控制
* @参数PinState为"1"表示输出高电平,"0"输出低电平;
* @返回值:无
*/
void SX127X_RESET_OUTPUT(GPIO_PinState PinState)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, PinState);
}
//-----------------------------SPI-----------------------------//
//该部分函数为MCU对SX127X模块SPI通信部分包含SPI口及配置初始化
//--------------------------------------------------------------//
/**
* @简介该函数用于MCU对SPI对应IO口初始化
* @参数:无
* @返回值:无
*/
void SX127X_SPIGPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
// /*Configure GPIO pins : PB12 PB13 PB14 PB15 */
// GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
// GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
// GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Configure the SX126X_NSS pin */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* SPI SCK GPIO pin configuration */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* SPI MISO GPIO pin configuration */
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* SPI MoSi GPIO pin configuration */
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/**
* @简介该函数用于MCU对SPI配置初始化
* @参数:无
* @返回值:无
*/
void SX127X_SPI_Init()
{
__HAL_RCC_GPIOA_CLK_ENABLE();//PORTA时钟使能
__HAL_RCC_GPIOB_CLK_ENABLE();//PORTC时钟使能
__HAL_RCC_SPI2_CLK_ENABLE();//SPI2时钟使能
SX127X_SPIGPIO_Init();
SPI2_InitStruct.Instance = SPI2; //使用SPI2
SPI2_InitStruct.Init.Mode = SPI_MODE_MASTER;//SPI模式主机模式
SPI2_InitStruct.Init.Direction = SPI_DIRECTION_2LINES;//两线全双工
SPI2_InitStruct.Init.DataSize = SPI_DATASIZE_8BIT;//数据宽度8位
SPI2_InitStruct.Init.CLKPolarity = SPI_POLARITY_LOW; //串行同步字时钟控制为低速时钟
SPI2_InitStruct.Init.CLKPhase = SPI_PHASE_1EDGE; //CPOL=0;CPHA=0模式
SPI2_InitStruct.Init.NSS = SPI_NSS_SOFT;//NSSD由软件管理
SPI2_InitStruct.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;//波特率分频8分频
SPI2_InitStruct.Init.FirstBit = SPI_FIRSTBIT_MSB;//数据从MSB开始
SPI2_InitStruct.Init.TIMode = SPI_TIMODE_DISABLE;//SPI Motorola mode
SPI2_InitStruct.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC校验不使能
SPI2_InitStruct.Init.CRCPolynomial = 7;//CRC值计算的多项式
SPI2_InitStruct.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
SPI2_InitStruct.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&SPI2_InitStruct) != HAL_OK)
{
while(1);
}
__HAL_SPI_ENABLE(&SPI2_InitStruct);
}
//-----------------------SX127X Read and Write-------------------//
//该部分函数为MCU对SX127X模块寄存器进行读写
//--------------------------------------------------------------//
/**
* @简介SX127X 向寄存器地址连续发送数据
* @参数uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
* @返回值:无
*/
unsigned char SX127X_ReadWriteByte(unsigned char data)
{
unsigned char RxDat;
HAL_SPI_TransmitReceive(&SPI2_InitStruct, &data, &RxDat, 1, 1000);
return RxDat;
}
/**
* @简介SX127X 向寄存器地址连续发送数据
* @参数uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
* @返回值:无
*/
void SX127X_WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
uint8_t i;
SX127X_NSS_OUTPUT(GPIO_PIN_RESET);
SX127X_ReadWriteByte(addr | 0x80);
for( i = 0; i < size; i++ )
{
SX127X_ReadWriteByte(buffer[i]);
}
SX127X_NSS_OUTPUT(GPIO_PIN_SET);
}
/**
* @简介SX127X 向寄存器地址连续读数据
* @参数uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
* @返回值:数据返回到*buffer中
*/
void SX127X_ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
uint8_t i;
SX127X_NSS_OUTPUT(GPIO_PIN_RESET);
SX127X_ReadWriteByte(addr & 0x7F);
for( i = 0; i < size; i++ )
{
buffer[i] = SX127X_ReadWriteByte(0x00);
}
SX127X_NSS_OUTPUT(GPIO_PIN_SET);
}