基于MM32W系列开发的数据透传应用
eetrendMcu 2023-03-22

在前面一个章节中我们详细介绍到了基于MM32W系列芯片开发的使用场景非常丰富的简易蓝牙智能锁方案,在本章节我们将继续给大家介绍一个蓝牙案例——基于MM32W系列开发的数据透传应用。


图1 透传应用连接传输图

说到低功耗蓝牙模块的工作方式,少不了要介绍低功耗蓝牙模块中最简单、最常见的通讯方式——数据透传。透传也叫串口透传,就是透明传输的意思,透传是一种工作方式,不是一种功能,一般出现在串口模块中。灵动MM32W系列MCU为了让用户更好的开发蓝牙无线传输产品,而不需要关心内部蓝牙协议栈如何实现,可以很快地实现串口模块的功能。串口模块具体的工作机制就是不对MCU要传输的数据做任何处理,也不需要自己增加什么协议,用户可以控制数据包的大小与APP之间进行双向传输。

硬件资源如下:

本方案基于MM32 BLE_Test Board进行测试验证,配套使用一条Micro usb数据线作为与上位机串口助手通讯方式的载体。在硬件原理上,本方案Demo板载了USB转串口芯片,通过跳线帽连接到MCU的UART2功能引脚,USB转串口芯片的RXD连接到了TX2(PA2)上,TXD连接到了RX2(PA3)上,且在通讯引脚上都分别并联了不同颜色的LED作为数据收发情况的指示;使用PB1连接到绿色LED指示灯,可作为蓝牙连接状态的指示;低功耗唤醒引脚选择PA0配置为上拉输入;蓝牙相关的功能引脚与前面介绍的方案一致,此处不做过多展开。以下为USB-TTL串口转换原理图:


图2 原理图

软件资源如下:

结合上述使用到的硬件资源,下面我们着重介绍软件实现流程以及相关配置代码。由于本应用方案BLE芯片与APP与之间为数据透传,为了避免其它数据干扰把应用层的广播报文取消,且不需要设置配对模式;由于本方案使用的是MCU的UART2,在使用printf调试打印功能时需将fputc和fgetc两个库函数内部使用的串口切换为UART2,且使用的是查询方式打印数据,与本案中透传发送至APP的方式不同(中断方式);另外再对连接状态指示灯的引脚进行配置,从而更为直观地对应用效果进行观测和验证,且使能看门狗复位功能来保证蓝牙服务的稳定性能;由于方案应用对低功耗的需要,本方案低功耗采用SLEEP和STOP双模式切换,根据不同的超时时间进入不同的低功耗模式。

以下为主函数初始化配置内容,主要将所有的外设资源和蓝牙协议栈初始化,并且以中断服务程序的方式运行蓝牙,主函数的循环中主要实现的功能为判断是否进入低功耗模式、根据串口接收和发送数据的超时时间进入何种低功耗模式,代码如下:

下面着重介绍一下串口2操作相关的几个函数:

/***串口2发送数据接口,当MCU接收到蓝牙透传数据后程序会调用该接口函数,该函数主要实现把要发送的数据装载到TX BUFF中,等待串口中断服务程序处理发送***/

void moduleOutData(u8*data, u8 len) 

{

unsigned char i;

if ((txLen len)

/***当收到来自串口助手的数据时,中断服务程序处理接收BUFF装载数据,在蓝牙协议的周期性回调函数中调用该函数来把串口助手的数据发送至APP***/

void CheckComPortInData(void) //at cmd NOT supported

{

u16 send;

if(comrxbuf_wr_pos != comrxbuf_rd_pos)//接收BUFF不为空{

if(!GetConnectedStatus())//蓝牙未连接{

comrxbuf_rd_pos = comrxbuf_wr_pos; //清空接收BUFF

}

else //蓝牙正常连接{

if(comrxbuf_wr_pos > comrxbuf_rd_pos)//当前串口接收到的数据长度大于接收BUFF索引号{

//调用sconn_notifydata函数主动通过蓝牙发送数据

send = sconn_notifydata(rxBuf comrxbuf_rd_pos,comrxbuf_wr_pos - comrxbuf_rd_pos);

comrxbuf_rd_pos  = send;

}

else {//调用sconn_notifydata函数主动通过蓝牙发送数据

send = sconn_notifydata(rxBuf comrxbuf_rd_pos,MAX_SIZE - comrxbuf_rd_pos);                         comrxbuf_rd_pos  = send;

comrxbuf_rd_pos %= MAX_SIZE;//定义MAX_SIZE为接收BUFF最大长度,这里为200

}

}

}

}

在UsrProcCallback()处理函数中做了喂狗操作,且处理串口2透传数据的接收和发送操作,蓝牙协议会周期性回调本函数,无论是在广播状态还是连接状态;在串口2中断服务程序中主要实现了发送BUFF和接收BUFF的数据装载以及触发发送功能。以下为代码实现内容:


//蓝牙连接成功后协议在空闲的时候会调用本回调函数
 void gatt_user_send_notify_data_callback(void)
{
static u8 LockFlagBak = 1;
if (LockFlagBak != LockFlag) {
LockFlagBak = LockFlag;//LockFlag标志位会在MOTOR_Proc()中清零和置位      
sconn_notifydata(&LockFlagBak,1);
}
}

下面着重介绍一下蓝牙服务操作相关的几个函数和特征值定义:

//APP获取蓝牙设备名称信息
u8* getDeviceInfoData(u8* len) ;
//APP设置并更新蓝牙设备名称信息
void updateDeviceInfoData(u8* name, u8 len) ;
//APP获取蓝牙设备固件版本号
u8* getsoftwareversion(void) ;
//判断蓝牙连接状态,并且通过状态指示灯显示
void ConnectStausUpdate(unsigned char IsConnectedFlag) ;
//APP查询蓝牙及MCU串口波特率信息回复函数
void server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type) ;
//APP发送数据到MCU及设置串口波特率响应函数,在此实现上位机到下位机数据的透传
void ser_write_rsp() ;

除了上述关键的蓝牙服务函数外,下面再简单介绍一些与蓝牙相关的特征值定义:

在const BLE_CHAR AttCharList[] 中定义了本案中的四个特征值:
{TYPE_CHAR,0x0011, {ATT_CHAR_PROP_NTF, 0x12,0, 0,0}, 1/*uuid128-idx1*/ },// RxNotify
{TYPE_CHAR,0x0014, {ATT_CHAR_PROP_W|ATT_CHAR_PROP_W_NORSP, 0x15,0, 0,0}, 2/*uuid128-idx2*/ },// Tx
{TYPE_CHAR,0x0017, {ATT_CHAR_PROP_W|ATT_CHAR_PROP_RD, 0x18,0, 0,0}, 3/*uuid128-idx3*/ },// BaudRate 设置
{TYPE_INFO,0x0019, {ATT_CHAR_PROP_RD}}// BaudRate 回复
在void att_server_rdByGrType( u8 pdu_type, u8 attOpcode, u16 st_hd, u16 end_hd, u16 att_type )中实现自定义特征值服务声明;

手机操作流程如下:

手机App使用nRF UART v2.0 App(安卓版本的App安装包nRFUART_Googlev2.apk,也可以从360手机助手查找和下载);

打开nRF UART v2.0 App,点击Connect开始搜索ble设备,选择对应名称(MM32_UART2)的蓝牙设备并进行配对,等待连接成功。连接成功后会有相应提示,按钮Connect名字会变成Disconnect;

连接成功后,在App内可以输入数据,然后点Send,手机发送的数据会通过蓝牙透传至测试demo板接收,并通过UART2发送到PC端的串口助手上显示:为了演示方便,可以短接串口2的TX2和RX2引脚,这样demo板接收到手机App发送的数据后会把同样的数据内容发给手机App上显示出来。



图3 手机APP图和PC端串口助手图
声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【立即预约】Keysight直播:搞懂介电常数那些事儿


  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • hot51增强型单片机开发板原理图

    功能要求: 一):绿灯25s倒计时,绿灯过度红灯有5s黄灯时间,红灯25s后直接跳绿灯。 二):按键按下模拟闯红灯输入,产生5s蜂鸣器鸣叫。 开发环境: 软件:Keil uVision4 硬件:HOT51增强型单片机开发板 程序代码:...

    昨天
  • 51单片机的延时子程序

    延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系...

    昨天
  • 什么是Flash盘?Flash盘的结构是什么样的?

    Flash是大家常使用的存储之一,对于Flash,大家或多或少有所了解。上篇文章中,小编对Flash闪存的类型有所介绍。为继续增进大家对Flash的认识,本文将对Flash盘、Flash盘结构以及Flash读写操作予以介绍。如果你对本...

    昨天
  • 深谈嵌入式系统,嵌入式系统是如何组成的?

    嵌入式系统在生活中有诸多应用,大家对于嵌入式系统或多或少有所耳闻。在前两篇文章中,小编对嵌入式系统进行过详细介绍。为继续增进大家对嵌入式系统的认识,本文将对嵌入式系统的组成加以说明。如果你对嵌入式系...

    06-27
  • 嵌入式系统秘籍共享,最全嵌入式系统解析

    嵌入式系统的应用十分广泛,因此越来越多的人学习嵌入式系统。由此,在学习嵌入式系统之前,我们应当对嵌入式系统具备一些认识。所以在本文余下部分,小编将对嵌入式系统进行全面解析。如果你对嵌入式系统具有兴趣...

    06-27
  • 51单片机超声波测距程序详解

    51单片机超声波测距程序详解 超声波四通道测距:超声波测距实现分为三大块: 其一是12864带字库的液晶驱动程序: 代码如下: /////////////////12864驱动程序/////////////////////////// //1写数据 void WriteDat...

    06-25
  • 51系列单片机的引脚图

    51系列单片机的引脚图 端子介绍 l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8...

    06-25
  • 51单片机串口通信需要加超时中断吗?

    接收数据时,超过一定时间就算出错. 这个超时的时间是单片机自己算出的吗?超时的时间是由编程序的人定的,他定多长就多长从一段程序开始 实现电脑向 单片机发送一些数据,单片机返回Iget +数据 #include #define u...

    06-25
  • 51单片机电机pid控制系统程序

    51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证。 /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码盘12孔, 晶振为12MHz,定时/计数器T0检测转...

    06-25
  • 51单片机指令集设计实例

    当你编写完一个程序后,通过软件调试,你可以看到程序的指令集,从指令集你就能知道单片机内部是如何工作的,比如数据存取的寄存器与地址,下面是电工之家找的一篇指令集,讲的蛮好的。 一、数据传送类指令(7种助...

    06-25
  • 51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。...

    06-25
  • 51单片机指令系统寻址方式

    指令给出参与运算的数据方式称为寻址方式。换句话说,寻址方式就是寻找确定参与操作的数的真正地址。 在MCS-51系列单片机的指令系统中寻址方式共有7种,立即寻址方式,mcs-51单片机的一种寻址方式,操作数就写在指...

    06-25
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告