AS32-100 LoRa无线通信模块
模块来源
采购链接:
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.a2882e8dnsJF7e&id=623781851754&_u=72t4uge5cec9
资料下载:
http://www.ashining.com/product_view1.aspx?t=93&cid=118#pro
上位机下载地址:
http://www.ashining.com.cn/relatedsoftware/soft_asds.zip
规格参数
工作电压:2.0V-5.5V
工作电流:52mA~104mA
默认频率:433Mhz
发射功率:20dBm
参考通信距离:3km
控制方式:串口
查看资料
通过MD0与MD1设置工作模式。
需要多个模块互传数据,则模块间的配置参数必须要一致。参数包括:空中速度、模块地址、通信信道。
参数的修改是通过上位机进行设置。具体步骤请参考快速操作指南。配置完成之后,只需要将模式设置为一般工作模式,即可进行透传。
移植过程
引脚选择
使用串口1(串口1-TX=PA2,串口1-RX=PA3)
AUX引脚 用于无线收发缓冲指示和自检指示。它指示模块是否有数据尚未通过无线发出去,或已收到的数据是否 已通过串口全部发出,或模块正在初始化自检过程中。
工作状态切换时 AUX 时序变换:工作状态切换前应当检测 AUX 引脚状态,当 AUX 为低电平时,表示模块繁忙;当 AUX 输出高电平约 2ms 后,表示此时模块处于空闲状态,模块可以开始工作状态切换,低延时工作状态引脚 MD0、MD1 电平开始跳变,AUX 继续输出高电平约 3ms 后,模块进行状态切换,当 AUX 输出低电平,表示正在切换状态,AUX 输出高电平,并保持约 2ms 表示状态切换完成。
本案例是不需要进行工作模式切换,而是固定使用一般工作模式(MD0=0,MD1=0)故AUX悬空即可。
移植至工程
我们的目标是将例程移植至ESP32-S3开发板上。已经为大家提供了完整的驱动代码,按照以下步骤,即可完成移植。
具体新建文件夹和新建c和h文件在 【DHT11温湿度传感器】章节中的1.4.2小节中有详细的教学,这里就不再多说了。
只不过这里我们将文件名 bsp_dht11.c 和 bsp_dht11.h 换成 bsp_lora.c 和 bsp_lora.h,文件夹名字改为LORA。
代码写入
在文件bsp_lora.c中,编写如下代码。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-12 LCKFB-lp first version
*/
#include "bsp_lora.h"
#include "stdio.h"
#include "string.h"
unsigned char LOAR_RX_BUFF[LOAR_RX_LEN_MAX];
unsigned char LOAR_RX_FLAG = 0;
unsigned char LOAR_RX_LEN = 0;
static void delay_ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
static void delay_us(unsigned int us)
{
ets_delay_us(us);
}
static void delay_1ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
static void delay_1us(unsigned int us)
{
ets_delay_us(us);
}
/************************************************************
* 函数名称:LOAR_USART_Init
* 函数说明:连接LOAR的初始化
* 型 参:bund=串口波特率
* 返 回 值:无
* 备 注:波特率根据你设置的内容来决定(默认波特率9600)
*************************************************************/
void LOAR_USART_Init(unsigned int bund)
{
//定义 串口配置结构体,必须赋初值,否则无法实现
uart_config_t uart_config={0};
uart_config.baud_rate = bund; //配置波特率
uart_config.data_bits = UART_DATA_8_BITS; //配置数据位为8位
uart_config.parity = UART_PARITY_DISABLE; //配置校验位为不需要校验
uart_config.stop_bits = UART_STOP_BITS_1; //配置停止位为 一位
uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE; //禁用硬件流控制
//将以上参数加载到串口1的寄存器
uart_param_config(LOAR_USART, &uart_config);
//绑定引脚 TX=tx_pin RX=rx_pin RTS=不使用 CTS=不使用
uart_set_pin(LOAR_USART, GPIO_LOAR_TX, GPIO_LOAR_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
//安装 串口 驱动程序
uart_driver_install(LOAR_USART, LOAR_RX_LEN_MAX, LOAR_TX_LEN_MAX, 0, NULL, 0);
//创建串口2接收任务
xTaskCreate(LOAR_USART_Handler, "LOAR_USART_Handler", 1024*2, NULL, configMAX_PRIORITIES, NULL);
}
/******************************************************************
* 函 数 名 称:LOAR_USART_Send_Bit
* 函 数 说 明:向LOAR模块发送单个字符
* 函 数 形 参:ch=字符
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void LOAR_USART_Send_Bit(unsigned char ch)
{
uart_write_bytes(LOAR_USART, (const char*)&ch, 1);
}
/******************************************************************
* 函 数 名 称:LOAR_USART_send_String
* 函 数 说 明:向LOAR模块发送字符串
* 函 数 形 参:str=发送的字符串
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void LOAR_USART_send_String(unsigned char *str)
{
uart_write_bytes(LOAR_USART, (const char*)str, strlen( (const char*)str ));
}
/******************************************************************
* 函 数 名 称:LOAR_USART_send_String
* 函 数 说 明:向LOAR模块发送字符串
* 函 数 形 参:str=发送的16进制数据 len=发送的数据长度
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void LOAR_USART_send_HEX(unsigned char *str, unsigned int len)
{
while( len-- ) // 地址为空或者值为空跳出
{
LOAR_USART_Send_Bit(*str++);
}
}
/******************************************************************
* 函 数 名 称:Clear_LOAR_RX_BUFF
* 函 数 说 明:清除LOAR发过来的数据
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void Clear_LOAR_RX_BUFF(void)
{
uart_flush(LOAR_USART);
LOAR_RX_LEN = 0;
LOAR_RX_FLAG = 0;
}
/**********************************************************
* 函 数 名 称:Anakysis_Data
* 函 数 功 能:接收LoRa发送过来的数据
* 传 入 参 数:无
* 函 数 返 回:1=接收到一次数据 0=当前没有接收到数据
* 作 者:LC
* 备 注:
**********************************************************/
unsigned char Anakysis_Data(void)
{
#if DEBUG
printf("Anakysis_Data = %d\r\n",LOAR_RX_FLAG);
#endif
if( LOAR_RX_FLAG == 1 )//如果接收到串口的数据
{
printf("data = %s\r\n",LOAR_RX_BUFF);
Clear_LOAR_RX_BUFF();
return 1;
}
return 0;
}
/******************************************************************
* 函 数 名 称:LOAR_USART_Handler
* 函 数 说 明:
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void LOAR_USART_Handler(void)
{
while(1)
{
//接收数据
LOAR_RX_LEN = uart_read_bytes(LOAR_USART, LOAR_RX_BUFF, LOAR_RX_LEN_MAX-1, 20 / portTICK_PERIOD_MS);
if( LOAR_RX_LEN > 0 && LOAR_RX_FLAG == 0 ) // 接收缓冲区不为空
{
LOAR_RX_BUFF[LOAR_RX_LEN] = '\0'; //字符串结尾补 '\0'
LOAR_RX_FLAG = 1; // 接收完成
#if DEBUG //测试
printf("Handler = %d\r\n",LOAR_RX_FLAG);
printf("%s\r\n", LOAR_RX_BUFF);
#endif
}
delay_ms(20);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
在文件bsp_lora.h中,编写如下代码。
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-12 LCKFB-lp first version
*/
#ifndef _BSP_LORA_H_
#define _BSP_LORA_H_
#include <stdio.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "driver/i2c.h"
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include <inttypes.h>
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "rom/ets_sys.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "driver/spi_common.h"
#include "hal/gpio_types.h"
#include "string.h"
// 1:查看调试数据
// 0:不查看调试数据
#define DEBUG 0
/**************************** 串口配置 ****************************/
#define GPIO_LOAR_TX 1 // 串口TX的引脚
#define GPIO_LOAR_RX 2 // 串口RX的引脚
#define LOAR_USART UART_NUM_2 // 串口2
#define LOAR_RX_LEN_MAX 255 //串口接收最大长度
#define LOAR_TX_LEN_MAX 255 //串口发送最大长度
void LOAR_USART_Init(unsigned int bund);
void LOAR_USART_send_String(unsigned char *str);
void LOAR_USART_send_HEX(unsigned char *str, unsigned int len);
unsigned char Anakysis_Data(void);
void LOAR_USART_Handler(void);
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
移植验证
在ESP32-S3开发板1的main.c中,编写以下代码。(确保bsp_lora.c 与 bsp_lora.h 已经按照以上进行编写)
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-12 LCKFB-lp first version
*/
#include <stdio.h>
#include "bsp_lora.h"
#include "string.h"
#include "esp_private/esp_task_wdt.h"
#include "esp_private/esp_task_wdt_impl.h"
/*
1:ESP32-S3开发板1
0:ESP32-S3开发板2
*/
#define USE_1_2 1
int app_main(void)
{
esp_task_wdt_deinit();
LOAR_USART_Init(9600); //LoRa模块初始化
printf("Start......\r\n");
// 定义在 bsp_lora.h 文件中
#if USE_1_2
while(1)
{
//接收的数据
Anakysis_Data();
//发送数据
LOAR_USART_send_String((unsigned char *)"LSpi-1\r\n");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
#else
while(1)
{
//接收的数据
Anakysis_Data();
//发送数据
LOAR_USART_send_String((unsigned char *)"LSpi-2\r\n");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
#endif
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
在ESP32-S3开发板2的main.c中,编写以下代码。(确保bsp_lora.c 与 bsp_lora.h 已经按照以上进行编写)
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-01-12 LCKFB-lp first version
*/
#include <stdio.h>
#include "bsp_lora.h"
#include "string.h"
#include "esp_private/esp_task_wdt.h"
#include "esp_private/esp_task_wdt_impl.h"
/*
1:ESP32-S3开发板1
0:ESP32-S3开发板2
*/
#define USE_1_2 0
int app_main(void)
{
esp_task_wdt_deinit();
LOAR_USART_Init(9600); //LoRa模块初始化
printf("Start......\r\n");
// 定义在 bsp_lora.h 文件中
#if USE_1_2
while(1)
{
//接收的数据
Anakysis_Data();
//发送数据
LOAR_USART_send_String((unsigned char *)"LSpi-1\r\n");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
#else
while(1)
{
//接收的数据
Anakysis_Data();
//发送数据
LOAR_USART_send_String((unsigned char *)"LSpi-2\r\n");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
#endif
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
上电效果:
驱动代码: