打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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功能映射表)

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

修改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,其代码修改方式一致,特此更正

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 );}

修改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);  }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STM32F103 SX1278 驱动
INA3221的使用教程(IIC)
用LoRa实现的物联网应用,到底好在哪里?
stm32.cube(三)
软件模拟SPI接口程序代码(4种模式)
SX1278/SX1276/SPI接口模块/LOra扩频技术/送镀银弹簧天线1308
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服