您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页物联网之LoRa开发与应用二(驱动移植)

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

来源:爱玩科技网

 

 

 

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数字输出-无线通信接收指示灯

 

 
  1. // RED

  2. #define LED1_PIN GPIO_PIN_2 //因为我们只用了三个指示灯,而且是从第二个成员开始定义的,所以这第一个是无效的,可以随便填一个

  3. #define LED1_GPIO_PORT GPIOB

  4. //#define LED1_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉

  5. // GREEN

  6. #define LED2_PIN GPIO_PIN_2 //无线通信接收指示灯

  7. #define LED2_GPIO_PORT GPIOB

  8. //#define LED2_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉

  9. // DBG1

  10. #define LED3_PIN GPIO_PIN_1 //无线通信发送指示灯

  11. #define LED3_GPIO_PORT GPIOB

  12. //#define LED3_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉

  13. // DBG2

  14. #define LED4_PIN GPIO_PIN_0 //无线通信网络指示灯

  15. #define LED4_GPIO_PORT GPIOB

  16. //#define LED4_GPIO_CLK RCC_APB2Periph_GPIOE//以前的固件库时钟定义,HAL库是不支持的,所以注释掉

修改led.c

 
  1. void LedOn( tLed led )//灯亮

  2. {

  3. HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_ON );//HAL库函数原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

  4. }

  5.  
  6. void LedOff( tLed led )//灯灭

  7. {

  8. HAL_GPIO_WritePin( LedPort[led], LedPin[led], LED_OFF ); //HAL库函数原型:void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

  9. }

  10.  
  11. void LedToggle( tLed led )//灯状态翻转,此处不使用

  12. {

  13. //LedPort[led]->ODR ^= LedPin[led];

  14. }

 
  1. #if LED_INV

  2. #define LED_ON GPIO_PIN_RESET

  3. #define LED_OFF GPIO_PIN_SET

  4. #else

  5. #define LED_ON GPIO_PIN_SET

  6. #define LED_OFF GPIO_PIN_RESET

  7. #endif

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

PA7NSS_LoRaLoRa模块片选接口

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

数字量输入-LoRa数字IO1

PA2DIO3数字量输入-LoRa数字IO3
PA3DIO2数字量输入-LoRa数字IO2

 
  1. /*!

  2. * SX1232 SPI NSS I/O definitions

  3. */

  4. #if defined( STM32F4XX ) || defined( STM32F2XX )

  5. #define NSS_IOPORT GPIOA

  6. #define NSS_PIN GPIO_Pin_15

  7. #else

  8. #define NSS_IOPORT GPIOA

  9. #define NSS_PIN GPIO_PIN_7

  10. #endif

  11.  
  12. /*!

  13. * SX1232 DIO pins I/O definitions

  14. */

  15. #if defined( STM32F4XX ) || defined( STM32F2XX )

  16. #define DIO0_IOPORT GPIOG

  17. #define DIO0_PIN GPIO_Pin_13

  18. #else

  19. #define DIO0_IOPORT GPIOA

  20. #define DIO0_PIN GPIO_PIN_11

  21. #endif

  22.  
  23. #if defined( STM32F4XX ) || defined( STM32F2XX )

  24. #define DIO1_IOPORT GPIOB

  25. #define DIO1_PIN GPIO_Pin_8

  26. #else

  27. #define DIO1_IOPORT GPIOA

  28. #define DIO1_PIN GPIO_PIN_12

  29. #endif

  30.  
  31. #if defined( STM32F4XX ) || defined( STM32F2XX )

  32. #define DIO2_IOPORT GPIOA

  33. #define DIO2_PIN GPIO_Pin_2

  34. #else

  35. #define DIO2_IOPORT GPIOA

  36. #define DIO2_PIN GPIO_PIN_3

  37. #endif

  38.  
  39. #if defined( STM32F4XX ) || defined( STM32F2XX )

  40. #define DIO3_IOPORT

  41. #define DIO3_PIN RF_DIO3_PIN

  42. #else

  43. #define DIO3_IOPORT GPIOA

  44. #define DIO3_PIN GPIO_PIN_2

  45. #endif

另外具体分析 sx1276-Hal.c中的如下代码:

 
  1. void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )

  2. {

  3. uint8_t i;

  4.  
  5. //NSS = 0;

  6. HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );//SPI片选引脚NSS拉低,SPI被选中

  7.  
  8. for( i = 0; i < size; i++ )

  9. {

  10. SpiInOut( buffer[i] );

  11. }

  12.  
  13. //NSS = 1;

  14. HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );//SPI片选引脚NSS拉高,SPI不工作

  15. }

  16.  
  17. void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )

  18. {

  19. uint8_t i;

  20.  
  21. //NSS = 0;

  22. HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );

  23.  
  24.  
  25. for( i = 0; i < size; i++ )

  26. {

  27. buffer[i] = SpiInOut( 0 );

  28. }

  29.  
  30. //NSS = 1;

  31. HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );

  32. }

  33.  
  34. void SX1276Write( uint8_t addr, uint8_t data )

  35. {

  36. SX1276WriteBuffer( addr, &data, 1 );

  37. }

  38.  
  39. void SX1276Read( uint8_t addr, uint8_t *data )

  40. {

  41. SX1276ReadBuffer( addr, data, 1 );

  42. }

  43.  
  44. void SX1276WriteFifo( uint8_t *buffer, uint8_t size )

  45. {

  46. SX1276WriteBuffer( 0, buffer, size );/* 在连续读写操作模式时, 寄存器会自动加“1” ,

  47. }

  48.  
  49. void SX1276ReadFifo( uint8_t *buffer, uint8_t size )

  50. {

  51. SX1276ReadBuffer( 0, buffer, size ); /*在连续读写操作模式时, 寄存器会自动加“1” ,

  52. }

  53.  
  54. inline uint8_t SX1276ReadDio0( void )

  55. {

  56. return HAL_GPIO_ReadPin( DIO0_IOPORT, DIO0_PIN );//读取DIO0引脚的状态

  57. }

  58.  
  59. inline uint8_t SX1276ReadDio1( void )

  60. {

  61. return HAL_GPIO_ReadPin( DIO1_IOPORT, DIO1_PIN );

  62. }

  63.  
  64. inline uint8_t SX1276ReadDio2( void )

  65. {

  66. return HAL_GPIO_ReadPin( DIO2_IOPORT, DIO2_PIN );

  67. }

修改sx1276-Hal.h

 
  1. #define GET_TICK_COUNT( ) ( HAL_GetTick() )

  2. #define TICK_RATE_MS( ms ) ( ms )

修改spi.c

 
  1. //**********************************//

  2. //

  3. //函数名称: SpiInOut

  4. //

  5. //函数描述: SPI总线读取写入单个字节

  6. //

  7. //函数参数: uint8_t

  8. //

  9. //返回值: uint8_t

  10. //

  11. //创建者:

  12. //*******************************//

  13.  
  14. uint8_t SpiInOut( uint8_t outData )

  15. {

  16. uint8_t pData = 0;

  17. //outData:发送的数据 pData:接收数据的缓存区 1:表示数据长度为1 0xffff:超时时间

  18. if(HAL_SPI_TransmitReceive(&hspi1,&outData,&pData,1,0xffff) != HAL_OK)

  19. return ERROR;

  20. else

  21. return pData;

  22. }

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

上电通过SPI总线读取芯片版本,判断读取值是否为0x12,并打印模块版本号。

 
  1. //如果要使用sx1278相关的接口函数,则需要包含如下头文件

  2. #include "platform.h"

  3. #include "radio.h"

  4. #include "sx1276-Hal.h"

  5. #include "sx1276-LoRa.h"

  6. #include "sx1276-LoRaMisc.h"

 
  1. uint8_t RegVersion = 0;

  2. SX1276Read( REG_LR_VERSION, &RegVersion );

  3.  
  4. if(RegVersion != 0x12)

  5. {

  6. printf("LoRa read Error!\r\n");

  7. printf("LoRa RegVersion = %d!\r\n",RegVersion);

  8. }

  9. else

  10. {

  11. printf("LoRa read Ok!\r\n");

  12. printf("LoRa RegVersion = %d!\r\n",RegVersion);

  13. }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务