背景:显示板第9板, 改进、打板、焊接、修改程序, 发现LORA模块不能接收, 重新查看LORA资料, 发觉之前刨得很熟, 调试了半个月的老朋友变陌生人了, 得重新熟悉. 归结原因, 是之前没整理好资料, 以使后来方便迅速翻查熟悉。
以后每个知识点都得按以下步骤做笔记:
- 概况
- 参数解释
- 应用实例
- 调试经历
无线数传 (正点原子LORA模块)
使用了原子哥家的LORA模块.并打了个小板配合调试.
优点: USART接口, 收发简单, DMA接收特省事
缺点: 速度慢. 速度慢. 速度慢! 使用逻辑分析仪观察, 每1ms只收发1字节数据(86us), 其余900us是空白的!!!!!! 另发送时, 数据不满足一包(56个字节)时, 会等待80ms才开始发送. 接收时, 也会有20ms等待时间!!!!!
期望未来有空闲时, 研究一下其它LORA模块的SPI接口.
统一工作中参数:
波特率: 115200 C板 模块地址: 1
校验位: 无 D板 模块地址: 2
空中速率: 19.2K V板 模块地址: 3
休眠时间: 1S
信道: 5
发射功率: 20dBm
三种传输模式, 配合使用, 可以完成各种发送和接收工作.
1: 透明传输:相同地址 、 相同信道
参数: A\B 地址一样, 信道一样, 速率一样
A发送: AA BB CC DD EE
B收到: AA BB CC DD EE。
用户数据可以是字符或 16进制数据形式)
2: 定向传输: 指定地址 、指定信道
发送格式: 高位地址+ 低位地址+ 信道+ 用户数据。
A设备, 地址:0x1400,信道:0x17, 23 信道 、433Mhz
B设备, 地址:0x1234,信道: 0x10,16 信道、 426Mhz
A发送:12 34 10 AA BB CC,其中 1234 为模块 B 的地址,10 为信道,
B收到: AA BB CC。
3:广播与数据监听:
地址: 0xFFFF
发送: 可以被相同信道上任意地址的模块收到
接收: 可以接收相同信道上任意地址模块发送的数据
编程要点:
原子哥的东西大部分是很好的,不过多细致的事物也有BUG~. MLGB,在LORA示例代码中功能各种啰嗦,文档也有好几个点没说明白,Q群群主也不太搭理的.害得调试时花了不了功夫,从8月份断断续续,到现在11月初,才明白如何用代码配置参数.
- 进入配置模式,MD0=1,AUX=0
- 命令间延时>80ms,每个命令间要延时,应该是用于确定'包'的完整,试过60ms配置失败,90ms成功
- 命令字符串须以 "\r\n" 结尾,这个真的是坑吖,在几个说明文档中都没提及,几经摸索才在示例代码中发现规律.
// 代码已调试正常使用, 原创版权, 随便复制, 不谢~~~
void vLora_Set(void)
{
char t = 110; // 延时时间,试过60ms失败
vDelay_ms(t);
while( (LORA_AUX_GPIOx ->IDR & LORA_AUX_PINx)!=0); // 等待AUX为0,即非工作状态
vMD0(1); // 配置模式,MD0=1,AUX=0
vSys_SetGPIO(LORA_AUX_GPIOx ,LORA_AUX_PINx ,G_MODE_OUT ,G_OTYPE_PP ,G_OSPEED_50M ,G_PUPD_DOWN ,0);
vAUX(0);
vDelay_ms(t);
vLora_SendString("AT+WLRATE=5,5\r\n"); // 信道\速率 (0-31,410Mhz-441Mhz) 4:9.6Kbps 5:19.2Kbps(默认)
vDelay_ms(t);
vLora_SendString("AT+UART=7,0\r\n" ); // 115200 无校检位
vDelay_ms(t);
vLora_SendString("AT+WLTIME=0\r\n" ); // 体眠时间 0:1秒(默) 1:2秒
vDelay_ms(t);
vLora_SendString("AT+TPOWER=3\r\n" ); // 发射功率 0:11dbm 1:14dbm 2:17dbm 3:20dbm(默认)
vDelay_ms(t);
vLora_SendString("AT+CWMODE=0\r\n" ); // 工作模式 0:一般(默) 1:唤醒 2:省电 3:信号强度
vDelay_ms(t);
vLora_SendString("AT+TMODE=0\r\n"); // 发送状态 0:透明(默) 1:定向
vDelay_ms(t);
vLora_SendString("AT+ADDR=00,01\r\n" ); // 模块地址 16进制,高低位
vDelay_ms(t);
vMD0(0); // 退出配置模式, MDO=0,AUX=0
vSys_SetGPIO(LORA_AUX_GPIOx ,LORA_AUX_PINx ,G_MODE_IN ,G_OTYPE_PP ,G_OSPEED_50M ,G_PUPD_DOWN ,0);
vDelay_ms(t);
}