查看: 762|回复: 0

[评测分享] 【Telink-泰凌微电子 B91通用开发套件】⑦手机蓝牙控制点灯

[复制链接]
  • TA的每日心情
    开心
    2024-4-25 10:04
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2022-11-3 09:54:52 | 显示全部楼层 |阅读模式
    分享到:
    玩了好几天的板卡,今天来动手做个小Demo吧,作为一个高级点灯工程师,就用手机蓝牙控制板卡点灯吧,主要目的是打通一下手机和板卡之间的通讯链路。

    首先我们选择使用上次的“Bluetooth® LE Generic”这个SDK中的“B91_module”这个DEMO,他里面跑的是SPP协议(代码中是这么叫的,我也跟着一起这么叫吧)。DEMO的效果就是B91上有一个串口,通过一个协议可以控制蓝牙的一些配置,还可以实现手机->B91->串口、串口->B91->手机之间数据的传输。可惜我没有找到合适的一个文档来说明这个串口协议是如何使用的,如果你想了解的话,只能自己去看看源码了,今天我不会详细使用这个协议,所以不做太多的讲解


    该Demo需要外接一个串口,用于跑对应的SPP协议,在app.c中的user_init_normal()中可以找到串口初始化函数,他配置了使用的串口引脚和波特率
    1.jpg
    程序烧录后,手机可以搜索到一个名字叫“KModule”的蓝牙
    2.jpg
    连接成功,串口会定时打印“FF 02 8C 07”,该信息代表的是通道MAP更新事件
    3.jpg
    6.jpg
    手机发一下数据到模块
    7.jpg
    8.jpg
    发送0x41424344
    串口收到如下数据
    9.jpg
    可以看到数据已经收到了,前面的FF-00之间的数据不管他,这是协议上的事,这边不细讲。41-44就是我们收到的数据

    接下来就开始改造这个Demo,首先第一步就是要知道,我在那个函数中可以得到手机发过来的数据?
    这个我们可以直接看Attribute Table,他就在app_att.c中,关于这个的先关介绍可以看SDK手册的“3.3.3 ATT & GATT”里面有详细的介绍,在下图位置就是注册刚才我们使用的那个服务收到数据的回调函数

    10.jpg
    我们来看一下回调函数
    1. int module_onReceiveData(u16 connHandle, rf_packet_att_write_t *p)
    2. {
    3.         u16 len = p->l2capLen - 3;
    4.         if(len > 0)
    5.         {
    6.                 spp_event_t *pEvt =  (spp_event_t *)p;
    7.                 pEvt->token = 0xFF;
    8.                 pEvt->paramLen = p->l2capLen + 2;   //l2cap_len + 2 byte (eventId)
    9.                 pEvt->eventId = 0x07a0;  //data received event
    10.                 memcpy(pEvt->param, &p->opcode, len + 3);

    11.                 spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
    12.         }

    13.         return 0;
    14. }
    复制代码
    其中&p->opcode就是我们收到的数据(事实上他的第一字节不是,而是一个0x00,我还没明白这是为什么),那么我们就可以简单地改造一下这个函数,当我收到4个0xAA时,我就点灯,4个0xBB我就灭灯。
    1. int module_onReceiveData(u16 connHandle, rf_packet_att_write_t *p)
    2. {
    3.         u16 len = p->l2capLen - 3;
    4.         uint8_t dataAA[5] = {0x00, 0xAA, 0xAA, 0xAA, 0xAA};
    5.         uint8_t dataBB[5] = {0x00, 0xBB, 0xBB, 0xBB, 0xBB};
    6.         spp_event_t *pEvt =  (spp_event_t *)p;
    7.         if(len > 0)
    8.         {
    9.                
    10.                 pEvt->token = 0xFF;
    11.                 pEvt->paramLen = p->l2capLen + 2;   //l2cap_len + 2 byte (eventId)
    12.                 pEvt->eventId = 0x07a0;  //data received event
    13.                 memcpy(pEvt->param, &p->opcode, len + 3);
    14.         }
    15.        
    16.         if (0 == memcmp(&dataAA[0], &p->opcode, 5))
    17.         {
    18.                 gpio_write(GPIO_LED_GREEN, LED_ON_LEVAL);
    19.                 spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
    20.         }
    21.         else if (0 == memcmp(&dataBB[0], &p->opcode, 5))
    22.         {
    23.                 gpio_write(GPIO_LED_GREEN, !LED_ON_LEVAL);
    24.                 spp_send_data(HCI_FLAG_EVENT_TLK_MODULE, pEvt);
    25.         }
    26.        
    27.         return 0;
    28. }
    复制代码
    视频演示:

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 22:49 , Processed in 0.122926 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.