LORA-B1 官方LORA驱动移植

[复制链接]
2257|4
 楼主| wzt19910506 发表于 2019-2-19 10:40 | 显示全部楼层 |阅读模式
本帖最后由 wzt19910506 于 2019-2-19 10:42 编辑

基于前面针对LORA-B1开发板基础教程,本节终于可以到正式的对lora的操作。我们制作的教程力求每一步都可以方便快速的进行验证,这样即便出现问题也好分析。所以本节虽然是移植lora的驱动,但是我们实现的目的很简单:stm32通过SPI接口对sx1278芯片的操作成功。我们最终会读取sx1278内部的一个固定寄存器的值,看读回来的值是否和手册上面的相同。相同即证明我们的驱动移植基本没有问题。
开发环境准备:
硬件:
  • Lora-B1开发板一块
  • DAPLINK(或STLINK、Jlink)调试器
软件:
  • stm32cubemx
  • MDK5
  • Semtech官方Lora驱动代码(sx12xxDrivers-V2.1.0.zip)
原理图:
如下原理图所示,DIO0-DIO3为lora模块的输出引脚,连接的单片机引脚需要对应配置为输入模式进行检测。SPI_MOSI、SPI_MISO、SPI_SCK、CS脚为lora模块和stm32之间的spi接口引脚。L_RST是lora模块的复位引脚,对应stm32的IO口要配置为输出模式。
移植步骤:一、打开stm32cubemx新建工程,
选择stm32f030f4,配置各个引脚,如下图所示。Stm32主时钟频率设定为48mhz,这里略过。
  • DIO0-DIO3为GPIO_INPUT模式
  • SPI1_CS和LRST配置为GPIO_OUTPUT模式(注意CS脚这里是作为普通输出)
  • SPI1_MOSI、SPI1_MISO、SPI1_CLK为标准SPI接口。
二、配置SPI参数:
参数配置主要涉及如下几个,其他默认值不用修改
这里需要注意的就是spi的极性相位的设置,在sx1278的手册中可以得到如下信息:

所以stm32的CPOL和CPHA要和sx1278的相同,这里CPOL=Low即CPOL=0,
CPHA=1Edge即CPHA=0(如果这里还有疑问请查看stm32f030的参考手册的SPI章节)
三、生成MDK工程
Stm32cubemx的各个参数配置好以后就可以生成MDK工程,mdk工程结构如下:

在mdk的工程目录中添加两个文件夹:lora/radio、lora/platform用于后面添加lora驱动的代码,添加后如下所示:

四、添加lora驱动源代码
在工程目录下新建lora文件夹,并把从官方源码中解压出来的src下的platform和radio文件夹拷贝进来。

这样我们需要的驱动源代码就有了。之后就可以往mdk的工程添加了。现在应该也可以理解了我们前面在mdk的project下建立的lora/radio、lora/platform也就是和这里的源码文件对应起来的。
这时候你又会惊讶的发现在这两个文件夹里面存放很多文件,但是真用我们用到的不多,其他的可以暂时先不管。添加完以后我们的MDK工程结构是这个样子的:

添加c文件以后别忘了添加mdk的h文件路径。

五、编译排错修改
  • 删除\lora\platform\sx12xxEiger\spi.c和spi.h文件(该文件没用,但是名称和cubemx生成的spi初始化文件名相同会造成后面编译失败)
  • 打开platform.h文件,打开这条宏定义
#define PLATFORM        SX12xxEiger
  • 打开sx12xxEiger.c文件,屏蔽或删除掉该文件内所有函数
  • 打开sx12xxEiger.h文件,修改#include “stm32f10x.h” 为 #include “stm32f0xx_hal.h”
  • 修改sx1276-Hal.h中#define GET_TICK_COUNT( )  HAL_GetTick()
  • 接下来的错误都集中在sx1276-Hal.c文件,该文件也是实现移植的主要接口。修改该文件代码接口如下:
  • MDK的编译会强制每个c或h文件最后都要空一行,根据提示把警告的文件后面回车多添加一行新行

  1. /*
  2. * THE FOLLOWING FIRMWARE IS PROVIDED: (1) "AS IS" WITH NO WARRANTY; AND
  3. * (2)TO ENABLE ACCESS TO CODING INFORMATION TO GUIDE AND FACILITATE CUSTOMER.
  4. * CONSEQUENTLY, SEMTECH SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR
  5. * CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  6. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
  7. * CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  8. *
  9. * Copyright (C) SEMTECH S.A.
  10. */
  11. /*!
  12. * \file       sx1276-Hal.c
  13. * \brief      SX1276 Hardware Abstraction Layer
  14. *
  15. * \version    2.0.B2
  16. * \date       Nov 21 2012
  17. * \author     Miguel Luis
  18. *
  19. * Last modified by Miguel Luis on Jun 19 2013
  20. */
  21. #include <stdint.h>
  22. #include <stdbool.h>
  23. #include "main.h"
  24. #include "spi.h"
  25. #include "gpio.h"
  26. #include "platform.h"
  27. #include "../../radio/sx1276-Hal.h"


  28. uint8_t SpiInOut( uint8_t outData )
  29. {
  30.   uint8_t Rxdata;
  31.   HAL_SPI_TransmitReceive(&hspi1,&outData,&Rxdata,1, 1000);      
  32.   return Rxdata;
  33.   
  34. }


  35. void SX1276InitIo( void )
  36. {
  37.   
  38. }

  39. void SX1276SetReset( uint8_t state )
  40. {
  41.   if(state==RADIO_RESET_ON)
  42.   {
  43.       HAL_GPIO_WritePin(LRST_GPIO_Port,LRST_Pin,GPIO_PIN_RESET);
  44.   }
  45.   else
  46.   {
  47.       HAL_GPIO_WritePin(LRST_GPIO_Port,LRST_Pin,GPIO_PIN_SET);
  48.   }
  49. }

  50. void SX1276Write( uint8_t addr, uint8_t data )
  51. {
  52.     SX1276WriteBuffer( addr, &data, 1 );
  53. }

  54. void SX1276Read( uint8_t addr, uint8_t *data )
  55. {
  56.     SX1276ReadBuffer( addr, data, 1 );
  57. }

  58. void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
  59. {

  60.   HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);
  61.   SpiInOut( addr | 0x80 );
  62.   for(uint8_t i = 0; i < size; i++ )
  63.   {
  64.       SpiInOut( buffer[i] );
  65.   }
  66.   HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);
  67.   
  68. }


  69. void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
  70. {

  71.   HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);
  72.   SpiInOut( addr & 0x7F );

  73.   for(uint8_t i = 0; i < size; i++ )
  74.   {
  75.       buffer[i] = SpiInOut( 0 );
  76.   }
  77.   HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);

  78. }

  79. void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
  80. {
  81.     SX1276WriteBuffer( 0, buffer, size );
  82. }

  83. void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
  84. {
  85.     SX1276ReadBuffer( 0, buffer, size );
  86. }

  87. inline uint8_t SX1276ReadDio0( void )
  88. {
  89.   return HAL_GPIO_ReadPin(DIO0_GPIO_Port,DIO0_Pin);
  90. }

  91. inline uint8_t SX1276ReadDio1( void )
  92. {
  93.   return HAL_GPIO_ReadPin(DIO1_GPIO_Port,DIO1_Pin);
  94. }

  95. inline uint8_t SX1276ReadDio2( void )
  96. {
  97.   return 0;
  98. }

  99. inline uint8_t SX1276ReadDio3( void )
  100. {
  101.   return HAL_GPIO_ReadPin(DIO3_GPIO_Port,DIO3_Pin);
  102. }

  103. inline uint8_t SX1276ReadDio4( void )
  104. {
  105.   return 1;
  106. }

  107. inline uint8_t SX1276ReadDio5( void )
  108. {
  109.   return 1;
  110. }

  111. inline void SX1276WriteRxTx( uint8_t txEnable )
  112. {

  113. }

  • 验证移植驱动
经过上面的移植,如果编译没有错误,移植工作就算完成了。之后我们就可以基于lora的驱动编写我们的应用代码。
打开sx127x的手册,看0x42地址的寄存器描述,该寄存器读取回来的值是固定的0X12。那我们就基于写好的驱动读取该寄存器的值,代码如下:

  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */
  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */

  13.   /* USER CODE END SysInit */

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_SPI1_Init();
  17.   /* USER CODE BEGIN 2 */
  18.   tRadioDriver *radio;
  19.   radio = RadioDriverInit( );
  20.   radio->Init();
  21.   radio->StartRx();
  22.   /* USER CODE END 2 */

  23.   /* Infinite loop */
  24.   /* USER CODE BEGIN WHILE */
  25.   while (1)
  26.   {
  27.     uint8_t ver=0;
  28.     SX1276Read(REG_LR_VERSION,&ver);
  29.     if(ver==0x12)
  30.     {
  31.       HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
  32.     }
  33.     HAL_Delay(300);
  34.     /* USER CODE END WHILE */

  35.     /* USER CODE BEGIN 3 */
  36.   }
  37.   /* USER CODE END 3 */
  38. } */
  39. }

文档下载:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
二九结狐六体 发表于 2019-2-19 13:32 | 显示全部楼层
学习有用的知识啊!
 楼主| wzt19910506 发表于 2019-2-21 15:33 | 显示全部楼层
backinsmart 发表于 2019-3-1 13:53 | 显示全部楼层
好资料,赞赞赞
飞翔的鱼2019 发表于 2019-3-8 08:49 | 显示全部楼层
顶楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

134

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部