
AS32-TTL-100 LoRa模块与TI MSPM0G3507开发板串口透传移植实战最近在做一个物联网小项目需要让两块开发板隔着一两百米还能互相通信Wi-Fi和蓝牙距离不够就想到了LoRa。手头正好有TI的MSPM0G3507开发板和AS32-TTL-100这个LoRa模块折腾了两天总算把透传功能调通了。今天就把整个过程从模块配置到代码移植再到最后的联调测试一步步分享给大家希望能帮你少走点弯路。这篇教程适合正在使用TI MSPM0系列MCU特别是MSPM0G3507做项目的朋友或者参加电赛需要实现远距离无线通信的同学。我会详细讲解如何用SysConfig工具配置串口、编写驱动最终实现两块板子通过LoRa模块“对话”。整个过程都是手把手教学代码可以直接拿去用。1. 认识你的“通信兵”AS32-TTL-100 LoRa模块在写代码之前咱们得先了解手里的“武器”。AS32-TTL-100是一个已经封装好的LoRa无线模块最大的好处就是它用起来跟普通的串口模块几乎一样大大降低了使用门槛。1.1 模块基本信息与资料获取这个模块是深圳翱捷科技的产品工作频率是433MHz。咱们做项目第一件事就是找齐资料。模块采购与资料链接采购链接你可以在电商平台搜索“AS32-TTL-100”找到它。官方资料下载这是最重要的请访问翱捷科技官网找到AS32-TTL-100的产品页面下载其数据手册、用户手册等所有文档。配置上位机软件模块的参数比如通信地址、信道需要通过一个专用的上位机软件来设置。这个软件也需要从上述官网资料中下载。关键规格参数基于资料参数值说明工作电压2.0V - 5.5V兼容3.3V和5V系统直接接开发板3.3V引脚就行工作电流52mA ~ 104mA发射时电流较大供电要足工作频率433MHz默认频率国内可用发射功率20dBm约100mW功率不小通信距离的保证参考通信距离3km理想开阔环境实际视障碍物而定通信接口UART (串口)核心所有控制、数据收发都通过串口注意所有硬件参数务必以你下载的官方最新资料为准以上信息来源于原始资料。1.2 模块工作模式与配置要点这个模块靠两个引脚MD0和MD1来切换工作模式比如参数配置模式、一般透传模式等。对于咱们要实现的两个模块互相通信只需要记住以下几点参数一致是前提想让A模块发给B模块的数据能被正确接收两个模块的空中速率、本机地址、通信信道这三个核心参数必须设置成一样的。用上位机配置模块的参数不是用代码设置的而是通过连接电脑用厂家提供的上位机软件进行配置。具体操作步骤参考资料里的“快速操作指南”就行图形化界面很简单。设为透传模式配置好参数后将MD0和MD1引脚都设置为低电平通常就是接地模块就进入一般工作模式。在这个模式下模块就变成一个“无线串口线”——你从单片机串口发给它的任何数据它都会原封不动地通过无线发出去它从无线收到的任何数据也会原封不动地从串口吐给你的单片机。这就是“透传”。2. 硬件连接与工程准备2.1 引脚连接咱们用的是MSPM0G3507开发板需要找一个串口UART来连接LoRa模块。根据原始内容我们选择PA8和PA9这两个引脚它们复用为UART1功能。连接方式非常简单开发板 3.3V---LoRa模块 VCC开发板 GND---LoRa模块 GND开发板 PA9 (UART1_TX)---LoRa模块 RXD(单片机发送模块接收)开发板 PA8 (UART1_RX)---LoRa模块 TXD(模块发送单片机接收)LoRa模块 MD0---GND(设置为低电平)LoRa模块 MD1---GND(设置为低电平)提示务必确认你的开发板原理图PA8/PA9是否默认连接了其他器件避免冲突。这种连接保证了模块处于透传模式。2.2 创建/打开工程首先你需要在Code Composer Studio (CCS) 或相关IDE中有一个基于MSPM0 SDK的空白工程例如empty工程。咱们所有的配置和代码都将在这个工程里添加。3. 核心实战使用SysConfig配置串口并移植驱动这是最关键的一步咱们利用TI强大的SysConfig图形化工具来配置硬件然后编写驱动层代码。3.1 使用SysConfig配置UART1SysConfig可以直观地配置引脚和外围设备生成配置代码避免手动查寄存器手册的麻烦。打开SysConfig在CCS工程浏览器里找到并双击empty.syscfg文件这会打开SysConfig的配置界面。添加UART实例在界面中点击ADD按钮在搜索框输入“UART”找到并添加UART组件。配置UART参数将实例名改为UART_1_INST(与后续代码对应)。引脚配置在Pin设置中为RX选择PA8为TX选择PA9。这步操作后图形界面上应该能看到这两个引脚被占用。波特率等参数LoRa模块默认串口波特率通常是9600请以你的模块实际配置为准。在Basic Settings里将Baud Rate设置为9600Data Length为8 BitsParity为NoneStop Bits为1。这些参数必须与LoRa模块自身设置的串口参数一致使能中断为了实现数据接收我们需要开启接收中断。在Interrupt Settings中勾选RX Interrupt。保存并生成代码点击保存按钮。这时SysConfig会提示你它要覆盖/生成一些文件一定要选择Yes to All。处理编译警告保存后点击工程编译按钮。可能会产生一些编译警告这通常是正常的因为生成的文件需要被主工程包含。我们暂时可以不管。完成这步后SysConfig会自动在工程里生成一个ti_msp_dl_config.h文件里面包含了UART_1_INST的所有引脚和初始化定义。我们的工程已经通过board.h文件包含了这个头文件所以后续直接#include “board.h”就能使用这些定义。3.2 编写LoRa驱动层代码 (bsp_lora.c/h)现在我们来创建驱动文件封装对LoRa模块的基本操作。在工程中新建两个文件bsp_lora.c和bsp_lora.h。首先是头文件bsp_lora.h定义接口和缓冲区#ifndef _BSP_LORA_H_ #define _BSP_LORA_H_ #include board.h // 包含SysConfig生成的配置 #define LOAR_RX_LEN_MAX 300 // 串口接收缓冲区最大长度 // 函数声明 void LOAR_Init(void); void LOAR_USART_Send_Bit(unsigned char ch); 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 Clear_LOAR_RX_BUFF(void); #endif接着是源文件bsp_lora.c实现具体功能这里我结合代码把关键点讲清楚。#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; // 当前接收数据长度 /************************************************************ * 函数名称LOAR_Init * 函数说明LoRa模块的初始化实为串口中断初始化 * 备注模块本身的串口参数已由上电配置或上位机设定这里只需准备MCU端。 *************************************************************/ void LOAR_Init(void) { // 清除串口1可能存在的未决中断标志 NVIC_ClearPendingIRQ(UART_1_INST_INT_IRQN); // 使能串口1的接收中断 NVIC_EnableIRQ(UART_1_INST_INT_IRQN); // 注意UART外设本身的初始化波特率、引脚等已由SysConfig在board_init()中完成 }初始化函数很简单就是使能中断。因为UART硬件本身的初始化比如设置波特率、引脚复用已经在board_init()函数里由SysConfig生成的代码自动完成了。/****************************************************************** * 函数名称LOAR_USART_Send_Bit * 函数说明向LoRa模块发送单个字符阻塞式 ******************************************************************/ void LOAR_USART_Send_Bit(unsigned char ch) { // 等待串口1发送缓冲区空闲 while( DL_UART_isBusy(UART_1_INST) true ); // 发送数据 DL_UART_Main_transmitData(UART_1_INST, ch); } /****************************************************************** * 函数名称LOAR_USART_send_String * 函数说明向LoRa模块发送字符串 ******************************************************************/ void LOAR_USART_send_String(unsigned char *str) { // 遍历字符串逐个字符发送 while( str *str ) { LOAR_USART_Send_Bit(*str); } }发送函数就是基本的串口发送注意DL_UART_isBusy这个检查可以防止数据覆盖。重点来了接收部分我们采用中断方式接收保证不丢失数据。/****************************************************************** * 函数名称UART_1_INST_IRQHandler * 函数说明串口1中断服务函数 * 核心每当串口收到一个字节就会进入此中断 ******************************************************************/ void UART_1_INST_IRQHandler(void) { // 判断中断来源 switch( DL_UART_getPendingInterrupt(UART_1_INST) ) { case DL_UART_IIDX_RX: // 如果是接收中断 // 从硬件寄存器读取接收到的字节 LOAR_RX_BUFF[ LOAR_RX_LEN ] DL_UART_Main_receiveData(UART_1_INST); // 增加长度并循环覆盖防止溢出 LOAR_RX_LEN ( LOAR_RX_LEN 1 ) % LOAR_RX_LEN_MAX; // 为缓冲区添加字符串结束符如果当字符串处理 LOAR_RX_BUFF[LOAR_RX_LEN] \0; // 设置接收完成标志通知主循环处理 LOAR_RX_FLAG 1; break; default: // 处理其他类型中断如发送中断 break; } }中断函数是驱动层的核心。它像一个小秘书每次串口收到数据哪怕只有一个字节都会打断主程序立刻把这个字节存到LOAR_RX_BUFF数组里并打个标志LOAR_RX_FLAG 1告诉主程序“有快递到了”。/********************************************************** * 函数名称Anakysis_Data * 函数说明主循环中调用用于处理接收到的数据 * 返回值1处理了一次数据0没有新数据 **********************************************************/ unsigned char Anakysis_Data(void) { if( LOAR_RX_FLAG 1 ) // 检查“快递到了”标志 { LOAR_RX_FLAG 0; // 清除标志准备接收下一个“包裹” // 这里就是处理数据的地方比如打印出来 printf(Received: %s\r\n, LOAR_RX_BUFF); // 处理完后清空缓冲区 Clear_LOAR_RX_BUFF(); return 1; } return 0; }Anakysis_Data函数是给主程序调用的。主程序不断检查LOAR_RX_FLAG标志一旦发现是1就知道中断函数已经收好数据了然后就可以安全地读取LOAR_RX_BUFF里的内容进行处理例如打印、解析等。4. 功能验证实现双板无线透传驱动写好之后我们来写主函数让两块开发板能互相发送和接收信息。将下面的代码替换或写入你的main.c(例如empty.c) 文件中#include board.h #include stdio.h #include bsp_lora.h // 关键宏定义用于区分两块开发板 // 将其中一块板的这个值设为1另一块设为0 #define IS_SENDER 1 // 【1】开发板1 (发送者) 【0】开发板2 (发送者) int main(void) { // 开发板初始化时钟、SysConfig配置的UART等都在这里初始化 board_init(); printf(LoRa Transparent Transmission Test Start!\r\n); // LoRa模块驱动初始化主要是使能串口接收中断 LOAR_Init(); while(1) { // 步骤1检查并处理接收到的数据 if(Anakysis_Data()) { // 如果Anakysis_Data返回1说明收到并处理了新数据 // 数据已经在Anakysis_Data函数内通过printf打印了 } // 步骤2定时发送数据 // 通过宏切换让两块板发送不同的内容 #if IS_SENDER LOAR_USART_send_String((uint8_t *)Hello from Board 1!\r\n); #else LOAR_USART_send_String((uint8_t *)Hello from Board 2!\r\n); #endif // 延时500ms控制发送节奏 delay_ms(500); } }部署与测试步骤配置LoRa模块使用上位机将两块LoRa模块的空中速率、地址、信道设置为完全相同的参数。然后确保它们的MD0和MD1都接地透传模式。准备两个工程在电脑上复制两份同样的工程。修改宏定义在第一份工程的main.c中设置#define IS_SENDER 1。在第二份工程中设置#define IS_SENDER 0。这样它们就能发送不同的字符串。编译与下载分别将两个程序编译并下载到两块MSPM0G3507开发板中。上电观察给两块开发板都上电并通过串口调试助手连接开发板的调试串口非LoRa串口观察打印信息。你应该能看到每块板子不仅定时发送自己的消息还会打印出从另一块板子接收到的消息。如果一切顺利你的串口助手会交替显示类似这样的信息Received: Hello from Board 2! Received: Hello from Board 1!这就意味着数据已经通过LoRa模块在空中成功传输了一个来回透传功能完美实现这个框架搭好之后你就可以在此基础上大展拳脚了。比如把发送的数据换成传感器读数温湿度、光照强度就变成了一个无线传感节点定义一套简单的通信协议就可以实现多设备组网控制。希望这篇教程能成为你探索物联网和远距离无线通信的一个扎实起点。