PB0 | LED4 | 数字输出-无线通信网络指示灯 |
PB1 | LED3 | 数字输出-无线通信发送指示灯 |
PB2 | LED2 | 数字输出-无线通信接收指示灯 |
typedef enum
{
LED_GREEN = 0,//如果从第二个成员开始,第一个就没有任何意义,随便填一个就可以了
LED_RX = 1,//接收指示灯,根据端口映射表可知,我们实际使用了三个指示灯。假设我们从第二个成员开始
LED_TX = 2,//发送指示灯
LED_NT = 3,//网络指示灯
#if defined( STM32F4XX ) || defined( STM32F2XX ) || defined( STM32F429_439xx )
LED_DBG3 = 4,
#endif
} tLed;
// RED
#define LED1_PIN GPIO_PIN_2 //因为我们只用了三个指示灯,而且是从第二个成员开始定义的,所以这第一个是无效的,可以随便填一个
#define LED1_GPIO_PORT GPIOB
//#define LED1_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉
// GREEN
#define LED2_PIN GPIO_PIN_2 //无线通信接收指示灯
#define LED2_GPIO_PORT GPIOB
//#define LED2_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉
// DBG1
#define LED3_PIN GPIO_PIN_1 //无线通信发送指示灯
#define LED3_GPIO_PORT GPIOB
//#define LED3_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉
// DBG2
#define LED4_PIN GPIO_PIN_0 //无线通信网络指示灯
#define LED4_GPIO_PORT GPIOB
//#define LED4_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉
void LedOn( tLed led )//灯亮
{
HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_ON );//HAL库函数原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
}
void LedOff( tLed led )//灯灭
{
HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_OFF ); //HAL库函数原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
}
void LedToggle( tLed led )//灯状态翻转,此处不使用
{
//LedPort[led]->ODR ^= LedPin[led];
}
#if LED_INV
#define LED_ON GPIO_PIN_RESET
#define LED_OFF GPIO_PIN_SET
#else
#define LED_ON GPIO_PIN_SET
#define LED_OFF GPIO_PIN_RESET
#endif
PA7 | NSS_LoRa | LoRa模块片选接口 |
PA11 | DIO0 | 数字量输入-LoRa数字IO0 |
PA12 | DIO1 | 数字量输入-LoRa数字IO1 |
PA2 | DIO3 | 数字量输入-LoRa数字IO3 |
PA3 | DIO2 | 数字量输入-LoRa数字IO2 |
/*!
* SX1232 SPI NSS I/O definitions
*/
#if defined( STM32F4XX ) || defined( STM32F2XX )
#define NSS_IOPORT GPIOA
#define NSS_PIN GPIO_Pin_15
#else
#define NSS_IOPORT GPIOA
#define NSS_PIN GPIO_PIN_7
#endif
/*!
* SX1232 DIO pins I/O definitions
*/
#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO0_IOPORT GPIOG
#define DIO0_PIN GPIO_Pin_13
#else
#define DIO0_IOPORT GPIOA
#define DIO0_PIN GPIO_PIN_11
#endif
#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO1_IOPORT GPIOB
#define DIO1_PIN GPIO_Pin_8
#else
#define DIO1_IOPORT GPIOA
#define DIO1_PIN GPIO_PIN_12
#endif
#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO2_IOPORT GPIOA
#define DIO2_PIN GPIO_Pin_2
#else
#define DIO2_IOPORT GPIOA
#define DIO2_PIN GPIO_PIN_3
#endif
#if defined( STM32F4XX ) || defined( STM32F2XX )
#define DIO3_IOPORT
#define DIO3_PIN RF_DIO3_PIN
#else
#define DIO3_IOPORT GPIOA
#define DIO3_PIN GPIO_PIN_2
#endif
另外具体分析 sx1276-Hal.c中的如下代码:
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
uint8_t i;
//NSS = 0;
HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );//SPI片选引脚NSS拉低,SPI被选中
SpiInOut( addr | 0x80 );//SPI第一个数据字节为地址域,bit7 为读写控制位, “1” 表示写, “0” 表示读;bit(6-0)对应当前操作的寄存器地址,这里是写操作
for( i = 0; i < size; i++ )
{
SpiInOut( buffer[i] );
}
//NSS = 1;
HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );//SPI片选引脚NSS拉高,SPI不工作
}
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
uint8_t i;
//NSS = 0;
HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );
SpiInOut( addr & 0x7F );//SPI第一个数据字节为地址域,bit7 为读写控制位, “1” 表示写, “0” 表示读;bit(6-0)对应当前操作的寄存器地址,这里是读操作
for( i = 0; i < size; i++ )
{
buffer[i] = SpiInOut( 0 );
}
//NSS = 1;
HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );
}
void SX1276Write( uint8_t addr, uint8_t data )
{
SX1276WriteBuffer( addr, &data, 1 );
}
void SX1276Read( uint8_t addr, uint8_t *data )
{
SX1276ReadBuffer( addr, data, 1 );
}
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
{
SX1276WriteBuffer( 0, buffer, size );/* 在连续读写操作模式时, 寄存器会自动加“1” ,
直到NSS脚被拉高;特别注意: FIFO操作时, 寄存器地址不会自动增加,
而是FIFO内的缓存地址。*/
}
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
{
SX1276ReadBuffer( 0, buffer, size ); /*在连续读写操作模式时, 寄存器会自动加“1” ,
直到NSS脚被拉高;特别注意: FIFO操作时, 寄存器地址不会自动增加,
而是FIFO内的缓存地址。*/
}
inline uint8_t SX1276ReadDio0( void )
{
return HAL_GPIO_ReadPin( DIO0_IOPORT, DIO0_PIN );//读取DIO0引脚的状态
}
inline uint8_t SX1276ReadDio1( void )
{
return HAL_GPIO_ReadPin( DIO1_IOPORT, DIO1_PIN );
}
inline uint8_t SX1276ReadDio2( void )
{
return HAL_GPIO_ReadPin( DIO2_IOPORT, DIO2_PIN );
}
#define GET_TICK_COUNT( ) ( HAL_GetTick() )
#define TICK_RATE_MS( ms ) ( ms )
//**********************************//
//
//函数名称: SpiInOut
//
//函数描述: SPI总线读取写入单个字节
//
//函数参数: uint8_t
//
//返回值: uint8_t
//
//创建者:
//*******************************//
uint8_t SpiInOut( uint8_t outData )
{
uint8_t pData = 0;
//outData:发送的数据 pData:接收数据的缓存区 1:表示数据长度为1 0xffff:超时时间
if(HAL_SPI_TransmitReceive(&hspi1,&outData,&pData,1,0xffff) != HAL_OK)
return ERROR;
else
return pData;
}
上电通过SPI总线读取芯片版本,判断读取值是否为0x12,并打印模块版本号。
//如果要使用sx1278相关的接口函数,则需要包含如下头文件
#include "platform.h"
#include "radio.h"
#include "sx1276-Hal.h"
#include "sx1276-LoRa.h"
#include "sx1276-LoRaMisc.h"
uint8_t RegVersion = 0;
SX1276Read( REG_LR_VERSION, &RegVersion );
if(RegVersion != 0x12)
{
printf("LoRa read Error!\r\n");
printf("LoRa RegVersion = %d!\r\n",RegVersion);
}
else
{
printf("LoRa read Ok!\r\n");
printf("LoRa RegVersion = %d!\r\n",RegVersion);
}