我是靠谱客的博主 愉快春天,最近开发中收集的这篇文章主要介绍3 - LoRa通讯实例1.将时钟树频率设置成32MHz2引脚配置3.生成工程代码4.按之前实验添加OLED的相关头文件和代码5.移植spi和LoRa的库文件6.移植之前写的按键文件7.在main.c文件下依次添加如下代码8.编译并烧写代码9.实验现象,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

实验目的:掌握LoRa的通信

实验内容:实现两个LoRa终端的通信。

实验现象:
程序下载完成,屏幕无显示,按一个模块的USER按键,屏幕显示“transmitting”“1xx0 ”,
控制另外一个模块的K1-LED和K2-LED进行亮灭显示,同时OLED显示两个LED的状态,两个模块可以相互发送数据。

1.将时钟树频率设置成32MHz

2引脚配置

将引脚PB5,PB4,PA10,PA9,PA8,PA7,PA5,PA4,PA1,PA0,PC15设置成GPIO_Output模式,将PA6,PC14设置成GPIO_Input模式,并按下图进行,上下拉,速度设置。
其中PA0,PA1默认低电平。

在这里插入图片描述
在这里插入图片描述

3.生成工程代码

4.按之前实验添加OLED的相关头文件和代码

5.移植spi和LoRa的库文件

spi.h

#ifndef __SPI_H
#define __SPI_H

#include "main.h"

void delay_us(uint32_t time);
void spi_init(void);
void spi_send_byte(uint8_t byte);
uint8_t spi_recv_byte(void);

#endif  

spi.c

#include "spi.h"

#define CLK_L() 		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define CLK_H() 		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define MOSI_L() 		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)
#define MOSI_H() 		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)

#define MISO_READ() 	HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6)

//
void delay_us(uint32_t time)
{
	while(time--){
		__nop();
		__nop();
		__nop();
		__nop();
		__nop();
		__nop();
	}
}

//
void spi_init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5 | GPIO_PIN_7, GPIO_PIN_SET);
  
  /*Configure GPIO pins : PA5 PA7 */
  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA6 */
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

//
void spi_send_byte (uint8_t send_data)
{
    uint8_t i;

    for (i = 0; i < 8; i++) {
        delay_us(1);
        CLK_L();
        if((send_data << i) & 0x80){
            delay_us(1);
            MOSI_H(); 
        } else {
            delay_us(1);
            MOSI_L(); 
        }

        delay_us(1);
        CLK_H();
    }

    delay_us(1);
    CLK_L();
    MOSI_L();
}

//
uint8_t spi_recv_byte (void)
{
    uint8_t i, temp;

    temp = 0;
    for (i = 0; i < 8; i++) {
        CLK_L();
        delay_us(1);
        temp = (temp << 1);
        CLK_H(); 
        delay_us(1);
        if (MISO_READ()) {
            temp++;
        } else { 
            temp = temp + 0;
        }

        delay_us(1);
    }

    CLK_L();
    delay_us(1);

    return temp;
}
zm4xx_gpio.h
#ifndef __ZX4XX_GPIO_H
#define __ZX4XX_GPIO_H
			  	 
#include "main.h"

void zm4xx_sel_pin_set(uint8_t value);
void zm4xx_rst_pin_set(uint8_t value);
void zm4xx_pin_init(void);    	

#endif  



zm4xx_gpio.c
#include "zm4xx_gpio.h"

//
void zm4xx_pin_init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
	
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4 | GPIO_PIN_9, GPIO_PIN_SET);
	
  /*Configure GPIO pins : PA4 PA9 */
  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

//
void zm4xx_rst_pin_set(uint8_t value)
{
	if(value){
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);	
    
	}else{
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);	
	}
}

//
void zm4xx_sel_pin_set(uint8_t value)
{
	if(value){
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
    
	}else{
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);	
	}
}

以下3个文件不需要修改,且内容过大

sx127x_lora.h
sx127x_regs_lora.h
sx127x_lora.c

6.移植之前写的按键文件

key.h
key.c
在实验2.6PWM输出实验中有完整key.h key.c文件
全部移植完成的内核文件
在这里插入图片描述
在这里插入图片描述

7.在main.c文件下依次添加如下代码

引入头文件

/* USER CODE BEGIN Includes */
#include "oled.h"
#include "stdio.h"
#include "string.h"

#include "sx127x_lora.h"
#include "key.h"
/* USER CODE END Includes */

定义LoRa相关宏

/* USER CODE BEGIN PTD */
#define FREQ			433000000L
radio_handle_t handle;
/* USER CODE END PTD */

申明函数

/* USER CODE BEGIN PM */
void LoRa_Init(void);
void Task_BrdInit(void);
void Task_Main(void);
/* USER CODE END PM */

自定义变量

/* USER CODE BEGIN PV */
uint8_t key_flag = 1;
uint8_t send_data[4];
char *data;
uint8_t rece_data[256] = {0};
/* USER CODE END PV */

OLED和LoRa初始化

  /* USER CODE BEGIN 2 */
    Task_BrdInit();
    LoRa_Init();
  /* USER CODE END 2 */

主控函数

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    Task_Main();
  }
  /* USER CODE END 3 */

OLED初始化代码

/* USER CODE BEGIN 4 */
void Task_BrdInit(void)
{
    OLED_PowerControl(ENABLE);

    HAL_Delay(200);
    OLED_Init();
    OLED_Clear();

    OLED_ShowString(0, 0, (unsigned char *)"                ", 16);
    OLED_ShowString(0, 2, (unsigned char *)"                ", 16);

}

LoRa初始化代码

void LoRa_Init(void)
{
	spi_init();
  zm4xx_pin_init();
  
	handle = radio_zm4xx_inst_init(spi_recv_byte,spi_send_byte,zm4xx_rst_pin_set,zm4xx_sel_pin_set,HAL_Delay,delay_us);
	
	if(handle != NULL){
		if(RADIO_RET_OK == radio_freq_set(handle, FREQ)){
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); // LoRa ok
		}
		
		radio_mode_set(handle, RX_MODE);	//Receive Mode
	}
}

主控函数代码,轮询进行按键检测和数据接收

void Task_Main(void)
{
  uint8_t key_num;
  uint8_t i = 0;
  uint16_t data_size;
  int ret = RADIO_RET_OK;
  
  /*1.轮询按键检测*/
  key_num = USER_Scan();
  if(key_num == 1)
  {
    if(key_flag == 4)
    {
      key_flag = 1;
    }
    switch(key_flag)
    {
      case 1:
        data = "1100";
        OLED_ShowString(0, 0, (unsigned char *)"  transmitting  ", 16);
        OLED_ShowString(0, 2, (unsigned char *)"      1100      ", 16);
        break;
      case 2:
        data = "1010";
        OLED_ShowString(0, 0, (unsigned char *)"  transmitting  ", 16);
        OLED_ShowString(0, 2, (unsigned char *)"      1010      ", 16);          
        break;
      case 3:
        data = "1110";
        OLED_ShowString(0, 0, (unsigned char *)"  transmitting  ", 16);
        OLED_ShowString(0, 2, (unsigned char *)"      1110      ", 16);                   break;
      default:
        break;
    }
    key_flag ++;
    for(i=0; i<4; i++)
    {
      send_data[i] = data[i];
    }
    radio_buf_send(handle, send_data, 4);
    radio_mode_set(handle, RX_MODE);
  }
  
  /*2.轮询接收数据*/
  ret = radio_buf_recv(handle, rece_data, &data_size);
  if(ret == RADIO_RET_OK)
  {
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_15);
    if(data_size > 0)
    {
      if(*(rece_data)== '1')
      {
        if(*(rece_data + 1) == '1')
        {
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
          OLED_ShowString(0, 0, (unsigned char *)" NO.1   LED1 ON ", 16);          
        }
        else
        {
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
          OLED_ShowString(0, 0, (unsigned char *)" NO.1   LED1 OFF", 16);          
        }
        if(*(rece_data + 2) == '1')
        {
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
          OLED_ShowString(0, 2, (unsigned char *)" NO.2   LED1 ON ", 16);          
        }
        else
        {
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
          OLED_ShowString(0, 2, (unsigned char *)" NO.2   LED1 OFF", 16);          
        }          
      }
    }
    radio_mode_set(handle, RX_MODE);    
  }
}

/* USER CODE END 4 */

8.编译并烧写代码

9.实验现象

两个设备之间可以进行数据收发
在这里插入图片描述

最后

以上就是愉快春天为你收集整理的3 - LoRa通讯实例1.将时钟树频率设置成32MHz2引脚配置3.生成工程代码4.按之前实验添加OLED的相关头文件和代码5.移植spi和LoRa的库文件6.移植之前写的按键文件7.在main.c文件下依次添加如下代码8.编译并烧写代码9.实验现象的全部内容,希望文章能够帮你解决3 - LoRa通讯实例1.将时钟树频率设置成32MHz2引脚配置3.生成工程代码4.按之前实验添加OLED的相关头文件和代码5.移植spi和LoRa的库文件6.移植之前写的按键文件7.在main.c文件下依次添加如下代码8.编译并烧写代码9.实验现象所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部