这里提供一个透传的通用demo,主要功能是程序开机的时候正常广播,蓝牙连接上并且使能了notify功能后,SYD8811一直打开串口,这时候主机端(手机APP)发送的任何数据都会原封不动的通过串口0(GPIO15,GPIO16管脚)发送给主控制器或者PC。本文章对应的程序在:“SYD8811_SDK\Source Code\SYD8811_ble_peripheral\1.SYD8811_BLE_UART_notifyen_open_power”
这里先介绍和蓝牙相关的内容,本程序中广播间隔是:
adv_params.type = ADV_IND;
adv_params.channel = 0x07; // advertising channel : 37 & 38 & 39
adv_params.interval = 1600; // advertising interval : 1000ms (1600 * 0.625ms)
adv_params.timeout = 0x1e; // timeout : 30s
整个程序运行阶段只有定时器作为时钟源:

讯享网
在没有使能蓝牙notify的时候蓝牙将正常进入休眠,当使能了notify后程序将不会休眠:

在使能或者失能notify的时候要特殊对uarten的操作,使能notify后外部32MHZ晶振不会被关闭,功耗比较高:

在断线的时候也会关闭外部32MHZ晶振,这里不管是失能notify或者断线都能够把功耗降低下来:

在连接上后将开启一个2S的定时器,2S定时器计时6S后调用BLSetConnectionUpdate函数,这时候底层发出提高蓝牙连接间隔的请教来降低功耗,这里启用了智能连接参数管理的机制(smart_update_latency)用于管理连接参数,该机制在有数据参数的时候将关闭latency来提高传输速度,这里蓝牙连接间隔设置如下:
/* connection parameters */
smart_params.updateitv_target=0x0050; //target connection interval (60 * 1.25ms = 75 ms)
smart_params.updatesvto=0x0258; //supervisory timeout (400 * 10 ms = 4s)
smart_params.updatelatency=0x000A;
蓝牙名称定义如下:

下面介绍PC或者其他MCU发送数据到SYD8811的过程,程序上电运行的时候首先初始化uart0作为和PC端交互的串口,使用如下语句uart_0_init,设置波特率为,使能串口中断的功能,该函数具体内容如下:

当PC端通过串口发送数据过来并且APP使能了notify的时候,SYD8811的串口外设将能够正确进入UART0_IRQHandler函数,该函数调用了uartRx_callback来处理串口上的数据,uartRx_callback函数把串口上的数据保存到uart_rx_buf的数据缓存区中,该函数具体内容如下:

在while(1)主循环体中,如果发现app已经使能了notify并且uart_rx_buf的数据缓存区中有PC发过来的数据将调用send_to_master函数把串口接收到的数据发送给APP,该函数把uart_rx_buf中的数据分为一个一个20Byte的数据包一次发送给APP,该函数具体的内容如下:

下面介绍APP发送数据到SYD8811,然后SYD8811通过串口转发给PC端或者其他MCU的流程
,当APP对SYD8811进行写操作的时候,SYD8811蓝牙底层将调用ble_init注册的ble_evt_callback钩子函数,并且进入if(p_evt->evt_code == GAP_EVT_ATT_WRITE)分支,这里调用ble_gatt_write函数对该蓝牙行为进行处理:

ble_gatt_write函数把蓝牙上的数据填充到uart_tx_buf.data缓存区的数据区中:

在while(1)主循环体中,如果发现art_tx_buf缓存区中有app发送过来的数据将调用sendToUart函数把APP发送过来的数据发送给PC端,sendToUart函数最终调用uart_cmd函数把数据往串口上写,sendToUart函数具体内容如下:

指示灯的控制,为了能够让与SYD8811连接的MCU更好的掌握当前蓝牙的状态,这里在关键的蓝牙状态发生变换的时候将会控制GPIO管脚以指示外部MCU蓝牙状态,该程序中一共控制的有4个GPIO,他们的定义如下:

透传程序测试流程:
编译下载程序后使用使用NRF connect扫描蓝牙设备然后连接,进行APP发送数据给PC串口助手的测试:







按照上面的方法操作完成后数据能够正常发送出去,这时候在串口助手上就能够看到app发送过来的数据:

如果要测试PC端串口助手发送给APP,可以这样操作,首先在APP上连接蓝牙并且使能notify,然后在串口转助手中输入正确的数据,然后点击“发送”按钮,这时候将能够在APP看到PC端输入的数据:

这时候在App上可以看到有数据发送过来了:

这时候在这个界面向右滑动即可看到具体的数据的log:

使用《SYDTEK_Studio.exe》查看透传工程通过RTT输出的打印信息,关于RTT打印的功能请看《STDTEK RTT打印的设置.pdf》,本工程RTT地址设置如下:

SYD8811透传模块实物和功耗的测试:
这里透传模块VBAT和VDDIO同时连接到了3.3V,测量VBAT和VDDIO合在一起的电流,经过测试发现带着串口线和SWD总线对功耗没有影响,所以这里没有摘下这两个总线,透传模块实物图如下:

在广播的时候功耗如下(广播间隔为1S,三个通道同时广播):

连接上后有一段时间(6S)比较高的电流(还没有使用低功耗的连接参数的时候),然后电流恢复稳定,电流值如下:

在这个程序中使能notify后程序不再休眠(客户可以根据自己的场合调整,比如下一个程序就通过IO口来控制数据的发送),不休眠的电流如下:

断线后电流将恢复到广播阶段的水平,电流如下:

本工程在SDK中:SYD8811_SDK\Source Code\SYD8811_ble_peripheral\3.SYD8811_BLE_UART_EVBOLED_notifyen_open_power
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/36180.html