ASP.NET docker安装部署 xml soap cmake directory msbuild Semantic UI nodejs教程视频 传智播客python 网络营销视频教程 jquery触发点击事件 pcie高速固态硬盘 nikto扫描web漏洞 java获取字符串 math保留两位小数 mysql将时间戳转换成日期 网页设计公司 python取随机数 python字典添加 简单python脚本实例 javapackage java程序实例 java写入文件 java基础学习 java的正则表达式 java的基本数据类型 java当前时间 java中float 学java基础 java生成当前时间 java判断文件是否存在 linuxgrep 相关软件 din字体下载 pr转场特效下载 海妖花粉哪里多 emit robotstudio mac强制重启
当前位置: 首页 > 学习教程  > 

物联网之LoRa开发与应用二(驱动移植)

2020/10/16 17:46:11 文章标签: lora开发

LoRa官方固件下载:https://pan.baidu.com/s/1ftP-HMJTmF9PtA05Lt-Tag 密码:bc8y IAR代码操作快捷键 如果要在整个工程中查找 某个单词或者其他,则按照如下方式查找: LoRa驱动框架 硬件接口设计 硬件接口函数 驱动移植过程&#x…

LoRa官方固件下载:https://pan.baidu.com/s/1ftP-HMJTmF9PtA05Lt-Tag 密码:bc8y

IAR代码操作快捷键

如果要在整个工程中查找 某个单词或者其他,则按照如下方式查找:

LoRa驱动框架

硬件接口设计

硬件接口函数

驱动移植过程(修改代码之后可以先编译,然后再看哪里还需要修改)

LoRa固件中相关文件复制到IAR工程里面

IAR工程中添加工作组

添加相关文件(platform文件中请将下图的sx1232-Hal.c换成sx1276-Hal.c,特此更正

修改硬件平台:添加宏定义,选择sx1276的硬件库(platform文件中请将下图的sx1232-Hal.c换成sx1276-Hal.c,特此更正

添加新增文件的包含路径

修改硬件平台:修改相关代码,并添加宏定义,选择我们实际使用的MCU硬件库(本项目中使用的是STM32F051K8)(先编译代码,然后根据错误提示修改)

注释掉USB相关代码和初始化函数(先编译代码,然后根据错误提示修改)

 修改led.h中IO口定义(根据IO功能映射表)

PB0LED4数字输出-无线通信网络指示灯
PB1LED3数字输出-无线通信发送指示灯
PB2LED2数字输出-无线通信接收指示灯

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库是不支持的,所以注释掉

修改led.c

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

修改sx1276-Hal.c(请将下图的sx1232-Hal.c换成sx1276-Hal.c,其代码修改方式一致,特此更正

PA7NSS_LoRaLoRa模块片选接口

PA11DIO0数字量输入-LoRa数字IO0
PA12DIO1

数字量输入-LoRa数字IO1

PA2DIO3数字量输入-LoRa数字IO3
PA3DIO2数字量输入-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 );
}

修改sx1276-Hal.h

#define GET_TICK_COUNT( )                           ( HAL_GetTick() )
#define TICK_RATE_MS( ms )                          ( ms )

修改spi.c

//**********************************//
//
//函数名称:   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;
}

LoRa模块上电自检:如果能读取LoRa芯片的版本号,则SPI功能正确,驱动移植成功

上电通过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);
  }

 


本文链接: http://www.dtmao.cc/news_show_300111.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?