基于涂鸦蓝牙SDK数据传输与函数接口解析
- 1.【数据初始化部分】
- 2.【蓝牙状态机控制】
- 3.【数据广播过程】
- 4.【涂鸦平台申请设备以及SDK】
- 5.【涂鸦SDK模组源码思路解析】---- 重要:
- 5.1 数据收发
- 5.【移植涂鸦评估】
2023.1.21
本文是基于涂鸦SDK的低功耗蓝牙BLE协议的数据传输过程的分析,包括数据传输流程以及函数接口分析,有助于加快二次开发流程。以泰凌微的Tlink开发板为例介绍涂鸦蓝牙SDK模组的数据流程。
文章中若有错误,欢迎大家留言指出。
1.【数据初始化部分】
- 在泰凌微平台的框架下,初始化时设置好广播数据的格式
- 利用应用层定时唤醒的功能,设置回调函数,当APP扫描设备后,触发事件,发送扫描回应,建立连接
- 应用层定时唤醒:不考虑GPIO PAD的前提下,一点进入sleep mode,只能在计算好的时间点T_wakeup唤醒,用户无法在特定时间点将sleep提前唤醒,为了增加PM(低功耗管理)的灵活性,采用应用层定时唤醒的功能bls_pm_setAppWakeupLowPower(u32 wakeup_tick, u8 enable) // enable =1 时 ,打开唤醒功能唤醒发生时执行回调函数,bls_pm_registerAppWakeupLowPowerCb()
2.【蓝牙状态机控制】
- MCU上电后,处于空闲状态(idle state)
- 在初始化中设置好广播相关格式和参数,设置adv enabe ,link layer 切换到 广播状态(advertising stata)
- 处于广播状态时,在广播channel上发送广播数据包。
- master 收到广播包,并发送 connection request,slave 的 link layer 收到主机连接请求后,响应并建立连接,进入已连接状态
- 注意: 进入已连接状态之后,就不再是广播状态了,就不再发送广播数据包了
3.【数据广播过程】
泰凌微数据广播的过程:
调用函数设备好广播数据包,然后在main_loop()中的库函数blt_sdk_main_loop()函数,查资料得出,库函数blt_sdk_main_loop()的作用之一是:循环遍历设置好的广播数据格式, 然后按照设定好的参数广播出去。
在代码中过程如下:
在TI的SDK内部已经帮我们实现好了循环广播,只需要在初始的时候分别通过bls_ll_setAdvData
接口注册进不同的Handle即可,协议栈会遍历广播每个handle的内容。调用bls_ll_setAdvData
并不是直接配置了数据缓存区,真正的数据处理需要等到下个周期调用 blt_sdk_main_loop
去处理。
4.【涂鸦平台申请设备以及SDK】
5.【涂鸦SDK模组源码思路解析】---- 重要:
- 在硬件平台主循环调用tuya_sdk,在tuya_sdk的
ty_system_mainloop()
中,实现遍历队列中的所有事件,并处理相关事件
main()
->main_loop() // ---------telink 框架 --------------------
->rx_from_uart_cb(); // 串口收到数据时,rx_fifo中有数据时,将 event 放在 事件队列中
->tx_to_uart_cb(); // 串口要发送消息时,通过 DMA 的形式发送数据
->ty_system_mainloop() // -----------涂鸦sdk的主循环----------------
->tuya_ble_main_tasks_exec() // 涂鸦蓝牙 SDK 的事件主调度器,在主循环中调用
->tuya_sched_execute() //遍历队列中所有的event
->tuya_ble_event_process(evt); //函数进行分发命令事件
5.1 数据收发
-
数据接收
-
当rx_fifo中有数,表示串口接收到数据,然后将数据的信息、长度等记录在
tuya_ble_evt_param_t
这个大结构体中,通过以下函数实现将event放在event_queue中,然后在1的tuya_ble_event_process()
函数中,处理eventtuya_ble_event_send(&event) ->tuya_ble_message_send(event) ->tuya_ble_sched_event_put() // 将 event push到 event_queue
-
-
数据发送
- 当 tx_fifo 中有数据时,
uart_dma_send()
发送数据。(通过配置,通知MCU的DMA从然中获取数据然后,然后start DMA transmission)
- 当 tx_fifo 中有数据时,
- 初始化过程分析
-
ty_ble_init()
-
ble蓝牙协议栈部分初始化,mac_init host_init smp_init
-
user app 初始化
/ USER application initialization / ty_ble_adv_init(); // 设置广播格式 ->bls_ll_setAdvData(); ->bls_ll_setScanRspData(); ->bls_ll_setAdvParam(); ty_ble_evt_init(); ->blc_hci_registerControllerEventHandler(controller_event_handler); // 注册控制器响应事件 ->controller_event_handler(); ->BLT_EV_FLAG_CONNECT: tuya_ble_connected_handler() ->tuya_ble_event_send(&event) // 蓝牙连接 ->BLT_EV_FLAG_TERMINATE: tuya_ble_disconnected_handler(); ->tuya_ble_event_send(&event) // 蓝牙断开 // 三 tuya_ble_sdk_demo_init(); // 四 tuya_ble_sdk_test_init(); ty_ble_start_adv();
tuya_ble_sdk_demo_init(); -> tuya_ble_sdk_init(&tuya_ble_device_param); // 传入 产品的 id mac key name 等信息(需要在平台上申请) -> tuya_ble_callback_queue_register(tuya_ble_sdk_callback); //回调函数 ->tuya_ble_sdk_callback(): // 当触发不同的事件时,最终都是通过 send 函数发送数据 TUYA_BLE_CB_EVT_CONNECTE_STATUS: tuya_ble_sdk_test_send() -> tuya_ble_event_send(&event) TUYA_BLE_CB_EVT_DP_DATA_RECEIVED: tuya_ble_sdk_test_send() -> tuya_ble_event_send(&event) tuya_ble_sdk_test_init(); -> tuya_ble_sdk_test_send() -> tuya_ble_event_send(&event)
-
5.【移植涂鸦评估】