调试正点原子Lora模块记录
买的是排针版ATK-LORA-V2.0
下载原子哥的官方资料,里面有上位机调试软件和使用文档。用usb-ttl连接Lora和电脑打开调试软件进行调试,
在“参数配置”下, 模块必须工作在“配置功能”(AUX=0 空闲状态,MD0=1 进入此功能)。
在“固件升级”,模 块必须工作在“固件升级功能”,
无线收发数据,模块必须工作在 “通信功能”(AUX=0 空闲状态,MD0=0 进入此功能)。
也就是说配置参数的时候MD0连接3.3V高电平置1,透传时置0,悬空即低电平0。
透传
点对点:
双方的参数必须一致,信道和地址完全一样,MD0置0.
1,地址相同、信道相同、无线速率(非串口波特率)相同的两个模块,一个模块发送,另 外一个模块接收(必须是:一个发,一个收)。 2,每个模块都可以做发送/接收。 3,数据完全透明,所发即所得。
点对多:
所有参与通信的对象参数必须一致,
任意一对象发送数据,信道和地址一致均可以收到消息。可以充当发射和接收端
广播监听:
选A设备作为广播设备,地址改为0xffff(广播地址),即可监听和发送数据给同信道和同速率的所有数据(地址可以不同),现B设备地址为110,C设备为111,A发送数据123,BC设备均可收到123,B设备发送321,只有A设备能收到321,C设备发送456,也只有A设备能收到456
定向
点对点:
发送方要勾选Hex选项,接收方勾选Hex,这样才能发送成功
广播监听:
代码测试
先用STM32F1RCT6来做测试,原子哥的lora代码过于丰富,我没用,就做简单的测试,拿原子哥的串口程序直接修改。
透明传输
lora.h
#ifndef __LORA_H
#define __LORA_H#include "sys.h"
#endif#define MD0_PORT GPIOA
#define MD0_PIN GPIO_Pin_1#define MD0_SET() GPIO_SetBits(MD0_PORT,MD0_PIN)
#define MD0_RES() GPIO_ResetBits(MD0_PORT,MD0_PIN)
void lora_init(void);
lora.c
#include "lora.h"
#include "delay.h"
#include "uart2.h"void lora_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //
GPIO_Init(GPIOA,&GPIO_InitStructure);
MD0_SET();
delay_ms(100);
u2_printf("AT+ADDR=ff,ff\r\n"); //AT地址,0xffff为广播地址,发送完指令后延时一会,具体能多小的延时没测试。
delay_ms(100);
u2_printf("AT+TMODE=0\r\n"); //选择发送状态,TMODE=0位透明传输。
delay_ms(100);
MD0_RES();
delay_ms(80);
}
main.c
#include "stm32f10x.h"
#include "lora.h"
#include "uart2.h"
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart2_Init(115200);
lora_init();
while(1)
{
delay_ms(100);
u2_printf("ffff113333\r\n");
// USART_SendData(USART2,0x00);
// delay_ms(1);
// USART_SendData(USART2,0x00);
// delay_ms(1);
// USART_SendData(USART2,0x11);
// delay_ms(1);
// USART_SendData(USART2,0x33);
// delay_ms(1);
//USART_ReceiveData(USART2);
// USART2->DR = (0x00 & (uint16_t)0x01FF);
// delay_ms(1);
// USART2->DR = (0x00 & (uint16_t)0x01FF);
// delay_ms(1);
// USART2->DR = (0x11 & (uint16_t)0x01FF);
// delay_ms(1);
// USART2->DR = (0xff & (uint16_t)0x01FF);
// delay_ms(1);
}
}
一旦主lora设备地址为广播地址,并且发送状态为透明传输,那么处于同一信道和同速率的其他lora设备,都能同时受到主lora设备发过来的广播信息,无论是处于定向还是透传的从设备都能收到数据。
定向传输
需要修改的地方不多。
在Lora.c文件修改u2_printf("AT+TMODE=1\r\n"); 即可
主函数里面:
USART2->DR = (0x00 & (uint16_t)0x01FF);
delay_ms(1);
USART2->DR = (0x00 & (uint16_t)0x01FF);
delay_ms(1);
USART2->DR = (0x11 & (uint16_t)0x01FF);
delay_ms(1);
USART2->DR = (0xff & (uint16_t)0x01FF);
delay_ms(1);
USART_SendData(USART2,0x00);
delay_ms(1);
USART_SendData(USART2,0x00);
delay_ms(1);
USART_SendData(USART2,0x11);
delay_ms(1);
USART_SendData(USART2,0x33);
delay_ms(1);这两段代码等价的。定向传输数据FF到地址是0000,信道17的lora设备
可以看到收到主lora设备发来的ff数据。
要注意的是定向传输只能发送16进制数据,所以发送字符串是不行的。同时操作DR寄存器的时候,由于一次性只能8位数据,所以16位地址+4位信道+数据,需要每8位延时1ms的时间。