物联网之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功能映射表)

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

 
  1. typedef enum

  2. {

  3. LED_GREEN = 0,//如果从第二个成员开始,第一个就没有任何意义,随便填一个就可以了

  4. LED_RX = 1,//接收指示灯,根据端口映射表可知,我们实际使用了三个指示灯。假设我们从第二个成员开始

  5. LED_TX = 2,//发送指示灯

  6. LED_NT = 3,//网络指示灯

  7. #if defined( STM32F4XX ) || defined( STM32F2XX ) || defined( STM32F429_439xx )

  8. LED_DBG3 = 4,

  9. #endif

  10. } tLed;

 
  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. SpiInOut( addr | 0x80 );//SPI第一个数据字节为地址域,bit7 为读写控制位, “1” 表示写, “0” 表示读;bit(6-0)对应当前操作的寄存器地址,这里是写操作

  9. for( i = 0; i < size; i++ )

  10. {

  11. SpiInOut( buffer[i] );

  12. }

  13.  
  14. //NSS = 1;

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

  16. }

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

  19. {

  20. uint8_t i;

  21.  
  22. //NSS = 0;

  23. HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_RESET );

  24.  
  25. SpiInOut( addr & 0x7F );//SPI第一个数据字节为地址域,bit7 为读写控制位, “1” 表示写, “0” 表示读;bit(6-0)对应当前操作的寄存器地址,这里是读操作

  26.  
  27. for( i = 0; i < size; i++ )

  28. {

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

  30. }

  31.  
  32. //NSS = 1;

  33. HAL_GPIO_WritePin( NSS_IOPORT, NSS_PIN, GPIO_PIN_SET );

  34. }

  35.  
  36. void SX1276Write( uint8_t addr, uint8_t data )

  37. {

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

  39. }

  40.  
  41. void SX1276Read( uint8_t addr, uint8_t *data )

  42. {

  43. SX1276ReadBuffer( addr, data, 1 );

  44. }

  45.  
  46. void SX1276WriteFifo( uint8_t *buffer, uint8_t size )

  47. {

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

  49. 直到NSS脚被拉高;特别注意: FIFO操作时, 寄存器地址不会自动增加,

  50. 而是FIFO内的缓存地址。*/

  51. }

  52.  
  53. void SX1276ReadFifo( uint8_t *buffer, uint8_t size )

  54. {

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

  56. 直到NSS脚被拉高;特别注意: FIFO操作时, 寄存器地址不会自动增加,

  57. 而是FIFO内的缓存地址。*/

  58. }

  59.  
  60. inline uint8_t SX1276ReadDio0( void )

  61. {

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

  63. }

  64.  
  65. inline uint8_t SX1276ReadDio1( void )

  66. {

  67. return HAL_GPIO_ReadPin( DIO1_IOPORT, DIO1_PIN );

  68. }

  69.  
  70. inline uint8_t SX1276ReadDio2( void )

  71. {

  72. return HAL_GPIO_ReadPin( DIO2_IOPORT, DIO2_PIN );

  73. }

修改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. }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值