【涂鸦蓝牙SDK】基于涂鸦蓝牙SDK数据传输与函数接口解析

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模组源码思路解析】---- 重要:

  1. 在硬件平台主循环调用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()函数中,处理event

      tuya_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)

在这里插入图片描述
在这里插入图片描述

  1. 初始化过程分析
  • 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.【移植涂鸦评估】

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值